Dasta 0 / 0 / 1 Регистрация: 05.10.2016 Сообщений: 25 |
||||
1 |
||||
06.10.2016, 15:31. Показов 5712. Ответов 7 Метки нет (Все метки)
В чем ошибка ? Можете исправить ?
__________________
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
06.10.2016, 15:31 |
Ответы с готовыми решениями: Ошибка: нельзя преобразовать тип integer к boolean Practic1.pas(53) : Нельзя преобразовать тип real к integer … Program4.pas(4) : Нельзя преобразовать тип boolean к real Ошибка: Нельзя преобразовать тип real к word 7 |
JokeR.BY CAPITAL OF ROCK! 1281 / 708 / 982 Регистрация: 03.03.2010 Сообщений: 2,286 |
||||
06.10.2016, 15:48 |
2 |
|||
у вас в этой 6 строке дикое скопление скобок и условий.
Добавлено через 1 минуту
0 |
0 / 0 / 1 Регистрация: 05.10.2016 Сообщений: 25 |
|
06.10.2016, 15:52 [ТС] |
3 |
Можешь по конкретнее написать
0 |
JokeR.BY CAPITAL OF ROCK! 1281 / 708 / 982 Регистрация: 03.03.2010 Сообщений: 2,286 |
||||
06.10.2016, 16:18 |
4 |
|||
0 |
0 / 0 / 1 Регистрация: 05.10.2016 Сообщений: 25 |
|
06.10.2016, 16:19 [ТС] |
5 |
Без функций
0 |
Почетный модератор 64272 / 47571 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
06.10.2016, 16:22 |
6 |
А где ты увидел функции кроме стандартных?
0 |
0 / 0 / 1 Регистрация: 05.10.2016 Сообщений: 25 |
|
06.10.2016, 17:16 [ТС] |
7 |
и без EPS мы не проходили еще
0 |
Почетный модератор 64272 / 47571 / 32739 Регистрация: 18.05.2008 Сообщений: 115,182 |
|
06.10.2016, 18:04 |
8 |
Иди в первый класс,там вообще ничего не проходили. Ты не путай знания по программированию и математике, в школу нужно было чаще ходить. Сравнение вещественных чисел возможно только с заданной точностью, что здесь и обозначено как EPS.
0 |
Неописанная переменная
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: Программы и алгоритмы для начинающих
При попытке компиляции программы:
var some_var: (real, real) := (1, 2);
begin end.
компилятор выдаёт ошибку:
Возможны два преобразования типа: к типу Tuple<real,real> и к типу Tuple<real,real>
Вероятно, имелось в виду: «к типу Tuple<integer,integer> и к типу Tuple<real,real>»,
но в то же время, странно, что здесь вообще есть ошибка, ведь «some_var» явно указан как (real, real).
PascalABC.net версии 3.6.3 сборка 2547 (01/07/2020)
Спасибо.
У меня в последней (самособранной) версии выдаёт:
Нельзя преобразовать тип Tuple<integer,integer> к Tuple<real,real>
.
Вообще всегда лучше писать var some_var := (1.0, 2.0)
, так на много короче.
Ну, стоит ещё дождаться что скажут разработчики.
Если когда то выдавало Возможны два преобразования типа
— значит, наверное, компилятор пытался преобразовать (1,2)
в (real,real)
. То есть алгоритм этого преобразования уже есть в компиляторе, надо только починить.
С простыми, массивами, записями и множествами такой проблемы не наблюдается:
var some_var: real := 1; // 1
var some_arr: array of real := (1, 2); // [1,2]
var some_rec: record a, b: real end := (a:1; b:2); // (1,2)
var some_set: set of real := [1, 2]; // {2,1}
Предположу, что с кортежами тоже планировалось автоматическое преобразование компилятором к нужному типу.
Пример MovingFrameBasedTime.pas содержит строки:
Key.Left: c.Direction := (-5, 0);
Key.Right: c.Direction := (5, 0);
Key.Up: c.Direction := (0, -5);
Key.Down: c.Direction := (0, 5);
...
c.Direction := (0, 0);
которые как раз не компилируются теперь (с этой ошибкой).
(P. S. Также нужно добавить uses GraphWPF;
в MovingFrameBasedTime.pas)
Скачайте последнюю версию.
Ошибка
Нельзя преобразовать тип Tuple<integer,integer> к Tuple<real,real>
и она правильная. Никто не предполагал делать преобразование между этими типами.
С простыми, массивами, записями и множествами — это специальные инициализаторы, которые работают и в Delphi. Мы делали это для совместимости. С кортежем — другая история. Это NET-тип и Tuple<integer,integer> и Tuple<real,real> неявно друг в друга не преобразуютсчя. Как и List < integer > и List < real >
Пример MovingFrameBasedTime.pas мы немного исправили — работающая версия на сайте. Но вы пишете об ошибке, которая могла быть в ранних версиях — сейчас её нет.
@miks1965
Версия 3.6.3, сборка 2657 (15/08/2020):
А у меня на той же версии компиляция почему то проходит успешно:
Я скачал новую версию отсюда:
http://pascalabc.net/downloads/PascalABCNETSetup.exe
Перед установкой удалил старую версию (сделал Uninstall).
В классе ObjectWPF
определено свойство Direction
:
property Direction: (real,real) read (Dx,Dy) write (Dx,Dy) := (value[0],value[1]);
т.е. если я правильно понял разработчиков, здесь всё-таки будет ошибка:
Нельзя преобразовать тип Tuple<integer,integer> к Tuple<real,real>
Значит, нужно исправить на:
Key.Left: c.Direction := (-5.0, 0.0);
Но почему, в последней версии, у меня осталось старое сообщение об ошибке?
А какая у вас версия .NET установлена? Мы замечали, что эта ошибка как-то с ней связана.
У вас всё понятно — у вас всё работает
@miks1965
У меня установлен и используется .NET версии 4.8.3752.0