Нельзя преобразовать тип string к integer как исправить

Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).

Неописанная переменная

begin
  S := 1; // Неизвестное имя S
end.

Все используемые переменные должны быть предварительно описаны с помощью ключевого слова var (внутри блока begin/end или, что обычно хуже, в разделе описаний вначале программы).

Отсутствующая ;

begin
  var S: integer 
  S := 1;         // Компилятор здесь скажет: Ожидалась ; — имеется ввиду предыдущая строка!
end.
begin
  var S := 1 
  S := S + 1  // Аналогично: проблема на предыдущей строке, а на текущей нет, потому что после неё идёт end.
end.

Очень частая ошибка у начинающих. Курсор, как правило, позиционируется в начале следующей строки.

Несовместимость типов при присваивании

begin
  var S: integer := 1.3; // Нельзя преобразовать тип real к integer
end.

Безболезненно можно присваивать только данные одного типа. Если данные — разных типов, то в редких случаях можно преобразовать данные одного типа в данные другого. Например, целое можно преобразовать в вещественное, а символ — в строку. Обратные преобразования не допускаются.

Чтобы не ошибаться в подобных простых случаях в Паскале есть следующая краткая форма объявления и инициализации переменной:

begin
  var S := 1.3; // Тип real будет выведен компилятором автоматически
end.

Отсутствие закрывающего апострофа литеральной строки

begin
  var x := 2;   // x получает тип integer
  var y := 3;   // y получает тип integer
  writeln('Результат сложения равен =, x + y); // Не хватает закрывающего апострофа
end.

Закрыть апостроф надо на той же строке, где расположен открывающий апостроф

Ошибки расстановки запятых и апострофов при выводе строк и выражений

begin
  var x := 2;   // x получает тип integer
  var y := 3;   // y получает тип integer
  writeln(x, '+,' y, '=', x+y); // Неверная расстановка запятых и апострофов
end.

Слишком много запятых и апострофов рядом, потому начинающие часто путаются  :)
Надо уяснить правила:

  • запятые разделяют разные элементы вывода
  • все, что находится в апострофах, будет выведено на экран без изменений

Ошибка ввода

begin
  var x: integer;
  read(x); // введите блаблабла и посмотрите, что получится
end.

Это — ошибка во время выполнения. Программа пытается преобразовать введенную строку в число, не может это сделать и завершается с ошибкой.

Аналогичный фрагмент в более современном и предпочтительном синтаксисе:

begin
  var x := ReadInteger;
end.

Ошибка неинициализированной переменной

begin
  var x: integer;
  // Забыли инициализировать или ввести x
  var r := x * x;  // r получает тип integer
  writeln('Квадрат числа ', x, ' = ', r);
end.

Перед использованием любую переменную надо ввести или присвоить ей начальное значение. Это действие называется инициализацией переменной.

Деление на 0

begin
  var x := 0;
  var c := 666 div x; // Здесь происходит деление на 0
end.

Если во время выполнения программа выполнит деление на 0, то она завершится с ошибкой.

Корень из отрицательного числа

begin
  writeln(sqrt(-1)); // Корень из отрицательного числа 
end.

В обычном Паскале возникает ошибка времени выполнения.
В PascalABC.NET выводится NaN — Not a Number

Ссылки

  • Программы для начинающих
  • Сайт PascalABC.NET: Программы и алгоритмы для начинающих
    Console.WriteLine ("Please enter some numbers");
        int sum = 0;
        for(;;)
        {
            string input = Console.ReadLine ();
            if (string.IsNullOrEmpty (input))
            {
                break;
            }
            int inputParsed = int.Parse (input.ToString ());
            int sumParsed = int.Parse (sum.ToString ());
            sum = sum + input; // throws an error here

            Console.WriteLine (sum);

I want my programme to show the sum of all numbers entered by user, by even though I have parsed all the variables needed, it throws an «cannot implicitly convert type ‘string’ to ‘int'» error. What’s wrong?

asked Jul 23, 2013 at 17:15

ltantonov's user avatar

5

sum = sum + input; //throws an error here

should be:

sum = sum + inputParsed ;

You are using the original input instead of the parsed value. And you don’t need sumParsed because you just keep the total sum in sum and you do no need to cast the int to a string and then parse it back to an integer.

answered Jul 23, 2013 at 17:16

aweis's user avatar

aweisaweis

5,1284 gold badges30 silver badges43 bronze badges

1

to check if the input of the user is right i would prefer

int userInput = 0;
if( int.TryParse( input, out userInput ) == false )
{
     break;
}

This is just an advise and not directly a solution to your problem.
There are enough answers =)

answered Jul 23, 2013 at 17:21

Viper's user avatar

ViperViper

2,1961 gold badge21 silver badges41 bronze badges

int inputParsed = int.Parse (input.ToString ());
            //int sumParsed = int.Parse (sum.ToString ());//no need
            sum = sum + inputParsed ; 

answered Jul 23, 2013 at 17:18

AD.Net's user avatar

AD.NetAD.Net

13.3k2 gold badges27 silver badges46 bronze badges

I would rewrite this entirely (Your original error was because you were trying to add a string to an int, and not the parsed input as an int)

Console.WriteLine ("Please enter some numbers");
int sum = 0;

while (true)
{
    int parsedInput = 0;
    string input = Console.ReadLine();
    if (!string.IsNullOrEmpty(input) && int.TryParse(input, out parsedInput))
    {
        sum += parsedInput;
        Console.WriteLine (sum);
    }
    else
    break;
}

answered Jul 23, 2013 at 17:24

Cyral's user avatar

CyralCyral

13.8k6 gold badges49 silver badges89 bronze badges

2

    Console.WriteLine ("Please enter some numbers");
        int sum = 0;
        for(;;)
        {
            string input = Console.ReadLine ();
            if (string.IsNullOrEmpty (input))
            {
                break;
            }
            int inputParsed = int.Parse (input.ToString ());
            int sumParsed = int.Parse (sum.ToString ());
            sum = sum + input; // throws an error here

            Console.WriteLine (sum);

I want my programme to show the sum of all numbers entered by user, by even though I have parsed all the variables needed, it throws an «cannot implicitly convert type ‘string’ to ‘int'» error. What’s wrong?

asked Jul 23, 2013 at 17:15

ltantonov's user avatar

5

sum = sum + input; //throws an error here

should be:

sum = sum + inputParsed ;

You are using the original input instead of the parsed value. And you don’t need sumParsed because you just keep the total sum in sum and you do no need to cast the int to a string and then parse it back to an integer.

answered Jul 23, 2013 at 17:16

aweis's user avatar

aweisaweis

5,1284 gold badges30 silver badges43 bronze badges

1

to check if the input of the user is right i would prefer

int userInput = 0;
if( int.TryParse( input, out userInput ) == false )
{
     break;
}

This is just an advise and not directly a solution to your problem.
There are enough answers =)

answered Jul 23, 2013 at 17:21

Viper's user avatar

ViperViper

2,1961 gold badge21 silver badges41 bronze badges

int inputParsed = int.Parse (input.ToString ());
            //int sumParsed = int.Parse (sum.ToString ());//no need
            sum = sum + inputParsed ; 

answered Jul 23, 2013 at 17:18

AD.Net's user avatar

AD.NetAD.Net

13.3k2 gold badges27 silver badges46 bronze badges

I would rewrite this entirely (Your original error was because you were trying to add a string to an int, and not the parsed input as an int)

Console.WriteLine ("Please enter some numbers");
int sum = 0;

while (true)
{
    int parsedInput = 0;
    string input = Console.ReadLine();
    if (!string.IsNullOrEmpty(input) && int.TryParse(input, out parsedInput))
    {
        sum += parsedInput;
        Console.WriteLine (sum);
    }
    else
    break;
}

answered Jul 23, 2013 at 17:24

Cyral's user avatar

CyralCyral

13.8k6 gold badges49 silver badges89 bronze badges

2

На чтение 4 мин. Просмотров 26 Опубликовано 15.12.2019

Впал в ступор. Накидал функцию получения факториала.

При попытке компиляции отдается ошибка, о которой написано в заголовке вопроса, хотя для возвращения все приведено в нужный тип данных. Конкретно ругается на строку с циклом.

Пробовал менять тип переменной l на integer, реакция та же.

Чем может быть вызвана данная проблема, помимо криворукости?

2 ответа 2

У вас ошибка в преобразовании переменной k в целое. Вот как объявлена функция Int :

А вот, как она описывается:

Функция Int возвращает целочисленную часть числа с плавающей точкой, как число с плавающей точкой.

Очевидно, что эта функция не подходит для того, чтобы преобразовать Real в Integer (а цикл for работает именно с Integer ). Для такого преобразования вам надо использовать либо функцию Trunc (которая делает то же самое, что и Int , только результатом будет Integer ), либо Round , которая округляет число до целого.

Здарова народ!! Я тока учусь Delphi так что не ругайтесь)) Я не могу понять где ошибка после Then тормозит строка выделяется красным и пишет ошибку!
[Pascal Error] Unit1.pas(43): E2010 Incompatible types: ‘string’ and ‘Integer’
[Pascal Fatal Error] Project1.dpr(5): F2063 Could not compile used unit ‘Unit1.pas’
Я хотел составить програмку с рандомом! типа камп сам число задумал а ты отгадай)) вот текст проги:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
a:integer;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:=»;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
randomize;
a:=random(100);
a:=strtoInt(‘100’);
if edit1.Text=a then edit2.Text:=’Правильно’ else edit2.Text:=’Неправильно’;

За Delphi всего 2 дня))

Уфф все) ) Спасибо всем!

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Button2: TButton;
Label1: TLabel;
Edit2: TEdit;
Button3: TButton;
procedure Button3Click(Sender: TObject);
procedure Label1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
< Private declarations >
public
< Public declarations >
end;

var
Form1: TForm1;
a:integer;

procedure TForm1.Label1Click(Sender: TObject);
begin
edit2.Text:=IntToStr(Round(a));

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:=»;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if edit1.Text=IntToStr(Round(a)) then edit2.Text:=’Правильно’ else edit2.Text:=’Неправильно’;

procedure TForm1.Button3Click(Sender: TObject);
begin
randomize;
a:=random(100)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text:=»;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
randomize;
a:=random(100);
if edit1.Text=IntToStr(Round(a)) then edit2.Text:=’Правильно’ else edit2.Text:=’Неправильно’;

Я хочу, чтобы сохранить текущую дату / время в качестве временной метки Unix в базе данных, и я построение запроса SQL.

[dcc32 Error] fMainForm.pas (186): E2010 Несовместимые типы: ‘строка’ и ‘Int64’

Как получить текущую дату / время, как метку времени Unix?

Работает успешно и выводит текущее время Unix. Поэтому я делаю вывод, что код, который вы представили не вызывает ошибку, вы сообщаете. Эта ошибка возникает из какого-то другого кода, который не является частью вопроса.

Предположительно вы принимаете это выражение и пытаетесь использовать его в целочисленном контексте. Это могло бы объяснить эту ошибку. Если вам нужно значение как целое число, а не строка, то изменения

Это прекрасный пример того, почему такие вопросы, как это лучше, когда представлены с MCVE.

Понравилась статья? Поделить с друзьями:
  • Неправильное употребление деепричастного оборота какая ошибка
  • Неполученная вовремя телеграмма заставила нас изменить планы как пишется
  • Неправильно выбрана амортизационная группа как исправить
  • Нельзя преобразовать тип real к integer как исправить паскаль
  • Неправильное ударение это речевая ошибка