Неописанная переменная
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
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
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
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.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
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
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
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
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.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
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.