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

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» уже определена в этой области.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
program censored;
var
 a:array[1..5,1..6] of real;
a[1,1] := 5.3; a[1,2] :=2.1; a[1,3] :=-3.2; a[1,4] :=-1.25; a[1,5] :=0.5; a[1,6]:=-3.05;
a[2,1] :=-0.25; a[2,2] :=7.1 ; a[2,3] :=4.3 ; a[2,4] := -0.7; a[2,5] :=-1.1 ;a[2,6]:=-0.15;
a[3,1] := 1.35; a[3,2] :=-2.5 ; a[3,3] := 6.83; a[3,4] := 0.35; a[3,5] :=1.8; a[3,6]:=-1.7;
a[4,1] := 2.25; a[4,2] :=0.9 ; a[4,3] :=-4.3 ; a[4,4] := 5.25; a[4,5] := -0.83; a[4,6]:=4.1;
a[5,1] :=-0.5 ; a[5,2] := -1.7; a[5,3] :=3.7 ; a[5,4] :=-1.25 ; a[5,5] :=8.9 ; a[5,6]:=2;
Procedure upor(a:real;n,m:integer);
var
i,j:integer;
p:boolean;
begin
for j:=1 to m do
p:=false;
while (not p) do
p:=true;
for i:1 to n-1 do
begin
if (m*(a[i+1,j]-a[i,j])<o)then
p=false;
c=a[i,j]
a[i,j]=a[i+1,j]
a[i+1,j]=c;
end;
begin
writeln('a=',a);
s=summ( a;1,5,1,6);
writeln ('s=',s);
end.

Member Avatar

11 Years Ago

Dear enlightened ones.
First of all. I am using Delphi 9.
My code compiles and run with no error at all, still I am confused about the structure window in the Delphi window.
It tells me that I have redeclared some identifiers.
The thing is that I have a few overloaded procedures of which uses different parameters only. The code in each procedure is however very similar, hence I use same local variables.

I think the structure window is wrong in its assumption, but I am not 100% certain.
All of these procedures are marked with overload-directive in unit declaration.

My logic say that maybe it is enough to declare the local variables in first procedure since they are Overloaded.
I tried commenting out the local var and variable where the Structure window tell me they are redeclared, and it seem to work alright.
what I don’t seem to grasp is that I do not get the redeclared error in all the overloaded procedures only a few of them.

I would really appreciate some thoughts on this issue.
I think that even though the procedures are Overloaded, the correct approach is to have the declaration of local variables in place in every one of them.
Compiling does not cause problems and unit works flawlessly.
:-/ Is this a known issue with the Structure window?

PROCEDURE DynamicCreateIndex(VAR ArrParam:DynamicLongIntArray; VAR ArrParamIndex: DynamicIntegerArray);
  VAR
    x : INTEGER;
  BEGIN
    FOR x:=0 TO HIGH(ArrParamIndex) DO BinarySortIndex(ArrParam,ArrParamIndex,x);
  END;
PROCEDURE DynamicCreateIndex(VAR ArrParam,ArrParamIndex: DynamicIntegerArray);
  VAR
    x : INTEGER; // Error in Structure Inspector. Tells me the identifier is redeclared.
  BEGIN
    FOR x:=0 TO HIGH(ArrParamIndex) DO BinarySortIndex(ArrParam,ArrParamIndex,x);
  END;
PROCEDURE DynamicCreateIndex(VAR ArrParam:DynamicStringArray;  VAR ArrParamIndex: DynamicIntegerArray);
  VAR
    x : INTEGER;
  BEGIN
    FOR x:=0 TO HIGH(ArrParamIndex) DO BinarySortIndex(ArrParam,ArrParamIndex,x);
  END;
PROCEDURE DynamicCreateIndex(VAR ArrParam:DynamicLongIntArray; VAR ArrParamIndex: DynamicIntegerArray; CONST HighBound:INTEGER);
  VAR
    x : INTEGER;
  BEGIN
    FOR x:=0 TO HighBound DO BinarySortIndex(ArrParam,ArrParamIndex,x);
  END;
PROCEDURE DynamicCreateIndex(VAR ArrParam,ArrParamIndex: DynamicIntegerArray; CONST HighBound:INTEGER);
  VAR
    x : INTEGER; // Error in Structure Inspector. Tells me the identifier is redeclared.
  BEGIN
    FOR x:=0 TO HighBound DO BinarySortIndex(ArrParam,ArrParamIndex,x);
  END;
PROCEDURE DynamicCreateIndex(VAR ArrParam:DynamicStringArray; VAR ArrParamIndex: DynamicIntegerArray; CONST HighBound:INTEGER);
  VAR
    x : INTEGER;
  BEGIN
    FOR x:=0 TO HighBound DO BinarySortIndex(ArrParam,ArrParamIndex,x);
  END;
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

Понравилась статья? Поделить с друзьями:
  • Ошибка папки ftp отсутствует доступ к папке
  • Ошибка паскаль встречено var а ожидалось
  • Ошибка папки ftp неверный дескриптор
  • Ошибка паскаль встречено else а ожидался оператор
  • Ошибка пароконвектомата абат 5u5