Ошибка паскаль повторно объявленный идентификатор

begin var o := new object; var b: boolean; b := o is byte(var i); b := o is word(var i);//Ошибка: Повторно объявленный идентификатор i end. Это очень похоже на #1413. Но тут не нужен yield.

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

SunSerega opened this issue

Nov 22, 2018

· 7 comments

Comments

@SunSerega

begin
  var o := new object;
  var b: boolean;
  
  b := o is byte(var i);
  b := o is word(var i);//Ошибка: Повторно объявленный идентификатор i
  
end.

Это очень похоже на #1413. Но тут не нужен yield.

@SunSerega
SunSerega

changed the title
Повторно объявленный идентификатор i при 2 is-var вне if, с одинаковыми именами переменных

Повторно объявленный идентификатор при 2 is-var вне if, с одинаковыми именами переменных

Nov 22, 2018

@ibond84

А в чем ошибка, если оказывается i добавляется в область видимости begin-end??
Что мне крайне не нравится, ибо я считаю, что такие конструкции допустимы только в if и while. И только там им и место

@ibond84

И опять нагрузка на интеллисенс, который должен проходить все выражения в поисках этих var i

@SunSerega



Copy link


Contributor

Author

По моему, i тут не должно добавляться в области видимости begin-end, потому что тогда получается что она может быть не инициализирована. Такой код нужен только в данном виде:

begin
  var o := new object;
  var b: boolean;
  
  b := (o is byte(var i)) and (i > 5);
  
end.

Если надо чтоб i появилось в области видимости — это выражение должно быть в if. Потому что нет смысла присваивать ещё переменной b.

А в примере из заголовка — я упростил до минимума вызывающего ошибку. Но та запись бесполезна.

@ibond84

Да ну? Такое компилируется

`
begin
var o := new object;
var b: boolean;

b := o is byte(var i);
writeln(i);

end.
`

@ibond84

о, сразу видно, майкрософт купил гитхаб. теги для кода неправильно добавляются..

begin
var o := new object;
var b: boolean;

b := o is byte(var i);
writeln(i);

end.

@SunSerega



Copy link


Contributor

Author

Да, сейчас работает, но это ведь неправильно… Я же говорю, это имеет смысл только если использовать переменную только на строчке с объявлением, то есть если добавить ещё условия…

@miks1965

Закрываю Issue.

Переменная i описывается второй раз — ровно это выводится в ошибке.

В C#:

            var o = new object();
            var b = o is byte i;
            i = 2;
            b = o is byte i;
            i = 2;

Локальная переменная или функция с именем «i» уже определена в этой области.

Чтобы
программа решения задачи обладала
свойством массовости, следует вместо
конкретных значений величин использовать
их обозначения, чтобы иметь возможность
изменять их значения по ходу выполнения
программы. Для обозначения переменных
и постоянных величин, различных процедур,
функций, объектов используются имена
— идентификаторы, устанавливающие
соответствие между объектом и некоторым
набором символов.

Стандартные
идентификаторы

Для
обозначения заранее определенных
разработчиками языка типов данных,
констант, процедур и функций служат
стандартные идентификаторы, например:
integer, Sin, Cos, Ln, Sqr, Sqrt, Read, Readln, Write, Writeln. В
этом примере стандартный идентификатор
Sin вызывает функцию, вычисляющие синус
заданного угла. Read, Readln вызывают процедуру,
организующую ввод данных. Write, Writeln
вызывают процедуру, организующую вывод
данных. Любой из стандартных идентификаторов,
в отличие от зарезервированных слов,
можно переопределить, но это чаше всего
приводит к ошибкам. Поэтому на практике
стандартные идентификаторы лучше
использовать без каких-либо изменений.

Пользовательские
идентификаторы

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

Компилятор
Pascal строго следит этим, и если это
требование не выполняется, то компиляция
прерывается, а на экран выводится
сообщение об ошибке «Ошибка: повторно
объявленный идентификатор» («Error
4: Duplicate Identifier») и указывается
дублирующийся идентификатор.

В
идентификатор не могут входить пробелы
и специальные символы. Буквы русского
алфавита также не могут входить в
идентификатор языка Pascal.

При
написании программ следует соблюдать
общие правила написания идентификаторов.

Идентификатор
может начинаться только с буквы или
знака подчеркивания (исключение
составляют метки, которые могут начинаться
также и с цифры).

Идентификатор
может состоять из букв, цифр и знаков
подчеркивания (пробелы, точки и другие
специальные символы недопустимы).

Между
двумя идентификаторами должен быть по
крайней мере один пробел.

Максимальная
длина идентификатора составляет 127
символов, но значимыми являются только
первые 63 символа.При записи идентификаторов
можно использовать как прописные, так
и строчные буквы. Компилятор не делает
различий между ними, хотя они и имеют
различные ASCII-коды. На практике
рекомендуется применять эту особенность
для более простого чтения и понимания
значений идентификаторов. Так, вместо
идентификатора nomerotdela лучше написать
NomerOtdela, выделив прописными буквами
каждую из двух смысловых частей.

Правильно
выбранные идентификаторы значительно
облегчают чтение и понимание программы,
а также уменьшают вероятность появления
ошибок при модификации программ.
Например, значение даты удобнее обозначить
идентификатором Data, чем просто буквой
D или любым другим символом.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
IPB

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется …
2. Все тексты программ должны помещаться в теги [code=pas][/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Что тут за ошибка?

сообщение 10.10.2016 17:40

Сообщение
#1

Группа: Пользователи
Сообщений: 1
Пол: Мужской

Репутация: -  0  +



Вроде бы все правильно, а компилятор пишет «Повторно объявленный идентификатор «
Почему он повторно объявленый? Вторая ошибка: Необявленная переменная Power. Насколько мне известно это встроенная ф-ция. Так зачем ее объявлять? Что изменить, чтоб код нормально работал?

uses crt;
var x,n:integer;

function F(const x, n: Real): Real; //x - вещественное, n - вещественное
var
Result: Real;
flag: Boolean;
begin
flag := (x < 0);
Result := Exp(n * Ln(Abs(x)));
if (flag)
then
Result := -Result;
Power := Result;
end;

begin
readln(x,n);
write('Ответ = ',F(x,n));
end.

Сообщение отредактировано: RabbitRabbit — 10.10.2016 17:41

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

OCTAGRAM

сообщение 10.10.2016 19:13

Сообщение
#2


Большевик–концептуал
***

Группа: Пользователи
Сообщений: 194
Пол: Мужской
Реальное имя: Иван Левашев
Jabber: bu_gen@octagram.name
Skype: i.levashew
QQ: 3152538431
WeChat
Ада: Сторонник
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик
Turbo Pascal: Установлен

Репутация: -  1  +



Выглядит так, будто был код для Turbo Pascal с функцией Power, а потом функцию Power в сигнатуре переименовали в F, забыв поменять имя при возврате результата. В Turbo Pascal не было псевдопеременной Result, вместо этого, чтобы вернуть результат, нужно было присвоит значение псевдопеременной, имя которой совпадает с именем функции, однако в неё можно только писать, а если пытаться читать, компилятор воспринимает это как рекурсивный вызов, и если нужно читать, то создавалась ещё одна переменная, в данном случае Result, а при выходе из функции «Power := Result;» должен был передать значение этой переменной в окончательный результат.

Если совместимость с Turbo Pascal не требуется, нужно убрать строки с объявлением переменной Result и присваиванием «Power := Result;». Если требуется, то заменить Result везде на какое–то другое имя, например, ProtoResult, а в последнем присваивании тогда будет «F := ProtoResult;»

———————

If you want to get to the top, you have to start at the bottom

 Оффлайн  Профиль  PM 

 К началу страницы 

+ Ответить 

1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)

Пользователей: 0

500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают

Связь с администрацией: bu_gen в домене octagram.name

Понравилась статья? Поделить с друзьями:
  • Ошибка парсинга файла что это
  • Ошибка пежо 308 electrical circuit fault
  • Ошибка парсинга запроса некорректное значение поля items 0 payment object 0
  • Ошибка пежо 308 airbag or pretensioner seat belt faulty
  • Ошибка парсинга документа блендер