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
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
changed the title
Повторно объявленный идентификатор i при 2 is-var вне if, с одинаковыми именами переменных
Повторно объявленный идентификатор при 2 is-var вне if, с одинаковыми именами переменных
Nov 22, 2018
А в чем ошибка, если оказывается i добавляется в область видимости begin-end??
Что мне крайне не нравится, ибо я считаю, что такие конструкции допустимы только в if и while. И только там им и место
И опять нагрузка на интеллисенс, который должен проходить все выражения в поисках этих var i
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
.
А в примере из заголовка — я упростил до минимума вызывающего ошибку. Но та запись бесполезна.
Да ну? Такое компилируется
`
begin
var o := new object;
var b: boolean;
b := o is byte(var i);
writeln(i);
end.
`
о, сразу видно, майкрософт купил гитхаб. теги для кода неправильно добавляются..
begin
var o := new object;
var b: boolean;
b := o is byte(var i);
writeln(i);
end.
Copy link
Contributor
Author
Да, сейчас работает, но это ведь неправильно… Я же говорю, это имеет смысл только если использовать переменную только на строчке с объявлением, то есть если добавить ещё условия…
Закрываю 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
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
changed the title
Повторно объявленный идентификатор i при 2 is-var вне if, с одинаковыми именами переменных
Повторно объявленный идентификатор при 2 is-var вне if, с одинаковыми именами переменных
Nov 22, 2018
А в чем ошибка, если оказывается i добавляется в область видимости begin-end??
Что мне крайне не нравится, ибо я считаю, что такие конструкции допустимы только в if и while. И только там им и место
И опять нагрузка на интеллисенс, который должен проходить все выражения в поисках этих var i
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
.
А в примере из заголовка — я упростил до минимума вызывающего ошибку. Но та запись бесполезна.
Да ну? Такое компилируется
`
begin
var o := new object;
var b: boolean;
b := o is byte(var i);
writeln(i);
end.
`
о, сразу видно, майкрософт купил гитхаб. теги для кода неправильно добавляются..
begin
var o := new object;
var b: boolean;
b := o is byte(var i);
writeln(i);
end.
Copy link
Contributor
Author
Да, сейчас работает, но это ведь неправильно… Я же говорю, это имеет смысл только если использовать переменную только на строчке с объявлением, то есть если добавить ещё условия…
Закрываю 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 или любым другим символом.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Прочтите прежде чем задавать вопрос!
1. Заголовок темы должен быть информативным. В противном случае тема удаляется …
2. Все тексты программ должны помещаться в теги [code=pas] … [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Что тут за ошибка? |
10.10.2016 17:40 Сообщение |
|
Группа: Пользователи Репутация: 0
|
Вроде бы все правильно, а компилятор пишет «Повторно объявленный идентификатор « uses crt; Сообщение отредактировано: RabbitRabbit — 10.10.2016 17:41 |
|
|
OCTAGRAM |
10.10.2016 19:13 Сообщение |
Большевик–концептуал
Группа: Пользователи Репутация: 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 |
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
Связь с администрацией: 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. |
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;
Прочтите прежде чем задавать вопрос!
1. Заголовок темы должен быть информативным. В противном случае тема удаляется …
2. Все тексты программ должны помещаться в теги [code=pas] … [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. «FAQ«, если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение — только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы — на PM!
6. Одна тема — один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Что тут за ошибка? |
10.10.2016 17:40 Сообщение |
|
Группа: Пользователи Репутация: 0 |
Вроде бы все правильно, а компилятор пишет «Повторно объявленный идентификатор « uses crt; Сообщение отредактировано: RabbitRabbit — 10.10.2016 17:41 |
|
|
OCTAGRAM |
10.10.2016 19:13 Сообщение |
Большевик–концептуал
Группа: Пользователи Репутация: 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 |
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
Связь с администрацией: bu_gen в домене octagram.name