Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с компилятором   Найти похожие ветки 

 
turonix   (2004-02-04 16:17) [0]

Тут возникла интересная ситуация: пишу строку i:=0; а компилятор ее игнорирует, пишет мол она нигде не используется. Хотя ее обнуление мне очень важно, без этого прога работает некорректно! Как его заставить выполнить эту операцию?


 
Тимохов   (2004-02-04 16:18) [1]


> turonix © (04.02.04 16:17)

Код приведи полностью.
Компилятор ошибается чрезвачайно редко...


 
h0use   (2004-02-04 16:21) [2]

Он не игнорирует, а выдете тебе Hint: Value assigned to "<element>" never used. Это не влияет на компилируемый код, а только предупреждает тебя, что ты объявил переменную, но не используешь.
Вот что пишет по этому поводу Борланд:
"The compiler gives this hint message if the value assigned to a variable is not used. If optimization is enabled, the assignment is eliminated.

This can happen because either the variable is not used anymore, or because it is reassigned before it is used."


 
turonix   (2004-02-04 16:21) [3]

в данном случае ошибся поверь на слово! Код довольно громоздкий


 
Тимохов   (2004-02-04 16:22) [4]


> Код довольно громоздкий

Тогда довольствуйся тем, что есть, а есть, понятно ровным счетом ничего.


 
h0use   (2004-02-04 16:25) [5]


> в данном случае ошибся поверь на слово! Код довольно громоздкий

Вставь shoumessage(IntToStr(I)) и посмотри...


 
Плохиш   (2004-02-04 16:27) [6]


> turonix © (04.02.04 16:21) [3]
> в данном случае ошибся поверь на слово! Код довольно громоздкий

Мы не верим на слово! Это первое. А второе, если кто и ошибся, то это ты!


 
McSimm   (2004-02-04 16:28) [7]

> в данном случае ошибся поверь на слово! Код довольно громоздкий
И сколько раз уже это звучало :)))

Компилятор не может в этом вопросе ошибиться. Если после присвоения значения переменной эта переменная используется, то компилятор (оптимизатор) никак ее не может проигнорировать.


 
Sandman25   (2004-02-04 16:33) [8]

Код наподобие такого?
i := 0;
case myboolean of
true: i := 1;
false: i := 2
end;


 
h0use   (2004-02-04 16:34) [9]


> Мы не верим на слово! Это первое. А второе, если кто и ошибся,
> то это ты!

"Истина где-то рядом" (с) Малдер
Говорят тебе, чтоб убедиться в правоте компилятора засунь вывод значения переменной в код.


 
h0use   (2004-02-04 16:35) [10]

вставь перд процедурой
{$HINTS OFF}
а после
{$HINTS ON}
и увидишь, компилятор тутже проглотит твое "обнуление" ;)


 
Плохиш   (2004-02-04 16:37) [11]

>h0use © (04.02.04 16:34) [9]
Не понял :-( Кого и куда я должен засунуть?


 
Плохиш   (2004-02-04 16:38) [12]

>Sandman25 © (04.02.04 16:33) [8]
В этом случае компилятор будет полностью спокоен ;-)


 
Рамиль   (2004-02-04 16:39) [13]

Убери эту строчку и все. Компилятор всегда прав;-)


 
h0use   (2004-02-04 16:40) [14]


> Плохиш

То что в фигурных скобках...первое перед процедурой, второе после процедуры


 
Sandman25   (2004-02-04 16:41) [15]

[12] Плохиш (04.02.04 16:38)

Согласен.
Вместо последнего надо было написать else.
Кстати, если написать без i := 0 в моем первом варианте, то компилятор предупреждает, что i может быть неинициализирована.


 
Плохиш   (2004-02-04 16:43) [16]

>h0use © (04.02.04 16:40) [14]

Я Вас не понимаю :-( По-моему, Вы потеряли нить разговора :-(
Я вообше беседовал [6] с автором вопроса, если Вы не заметили?


 
Плохиш   (2004-02-04 16:44) [17]

>Sandman25 © (04.02.04 16:41) [15]
Да и Да ;-)


 
McSimm   (2004-02-04 16:54) [18]

>Кстати, если написать без i := 0 в моем первом варианте, то компилятор предупреждает, что i может быть неинициализирована.

А можно дословно узнать мнение компилятора? Вот это:

> компилятор ее игнорирует, пишет мол она нигде не используется


 
turonix   (2004-02-05 10:12) [19]

Извените все вчера Net гикнулся поэтому не смог поучавствовать в обсуждении
Пожалуста вод код:

...

for i:= 1 to StringGrid4.RowCount - 1 do
StringGrid4.Rows[i].Clear();
StringGrid4.RowCount:=2;

//StringGrid4.RowCount в данном случае = 5, i тоже принимает значение 5

...

i:=0; //вот тут он и не присваевает!

//здесь DataModule2.OraQuery1.RecordCount может быть равным 0 //тогда цикл не выполняется и значения и значения i остается из //предыдущего цикла т.е 5
for i:=0 to DataModule2.OraQuery1.RecordCount-1 do
begin
StringGrid4.Cells[1, StringGrid4.RowCount-1]:=DataModule2.OraQuery1.FieldbyName("FIO").AsString;
StringGrid4.Cells[2, StringGrid4.RowCount-1]:=DataModule2.OraQuery1.FieldbyName("POST").AsString;
//caiieiaiea ianneaa ieeaie
NDList1.Add(DataModule2.OraQuery1.FieldbyName("NIK").AsString);
DataModule2.OraQuery1.Next;
StringGrid4.RowCount:=StringGrid4.RowCount+1;
end;

//здесь мне надо знать сколько столбцов было заполнено в //предыдущем цикле
NCount:= i;
if not (NCount = 0) then
begin
for i := 0 to NCount-1 do
begin
NDList2.Add(FileRe(NDList1.Strings[i]));
StringGrid4.Cells[3, i+1]:= NDList2.Strings[i];
StringGrid4.Cells[4, i+1]:= NDList2.Strings[i];
end;

WHandle2 := GetActiveWindow;
IDTimer2 := SetTimer(WHandle, 0, 1000, @TimerProc2);
end;

Попытка отключать оптимизатор компилятора никчему не привела,
попытка поставить директивы {$HINTS OFF}... {$HINTS ON} тоже.
Вот что пишет компилятор: [Hint] main.pas(756): Value assigned to "i" never used


 
MBo   (2004-02-05 10:16) [20]

i:=0; //вот тут он и не присваевает!
...
for i:=0 to DataModule2.OraQuery1.RecordCount-1 do

Ну для чего мудрому компилятору выполнять это присвоение, если следующей же строкой этой переменной присваивается другое значение???????????

И, мягко говоря, не стоит использовать значение переменной цикла после его завершения.


 
Anatoly Podgoretsky   (2004-02-05 10:20) [21]

А ведь компилятор правду говорит, сразу же происходит переопределение. Наряду с этой ошибкой также использование неопределенной переменной. На остальные нет желания смотреть, тем более, что не по теме.


 
turonix   (2004-02-05 10:28) [22]

В том то и дело, если DataModule2.OraQuery1.RecordCount равно 0 то переопределение не происходит, i остается равнем 5 (из прошлого цикла! Конечно можно ввести другую переменную цикла, но это дополнительная память... Меня вопрос интересует скорее с акадимической точки зрения. Вед этот "умный" компилятор еще что- нибудь модет подобным образом счесть не нужным. А потом ищи ошибку...


 
Verg   (2004-02-05 10:33) [23]

If initialValue is greater than finalValue in a for...to statement, or less than finalValue in a for...downto statement, then statement is never executed. After the for statement terminates, the value of counter is undefined.
(С) Delphi Help

Понятно?

After the for statement terminates, the value of counter is undefined.


 
Anatoly Podgoretsky   (2004-02-05 10:35) [24]

Этой информации нет на этапе компиляции, и я не стал бы делать выводы, что делает компилятор с переменной, если количество чиклов <= 0, это внутреннее дело компилятора, никак не документированое. А уж использовать переменную цикла, за пределами цикла это сплошное безобразие, Борланд это хорошо документировал.

Но ы [2] тебе привели следующее If optimization is enabled, the assignment is eliminated. Так что твои потуги тщетны!

Это твое дело прислушиваться к сообщениям компилятора или нет, в зависимости хочешь ли ты иметь правильно работающую программу или нет.


 
Плохиш   (2004-02-05 10:35) [25]

>turonix © (05.02.04 10:28) [22]

Может пойдёшь всё-таки хелп про циклы по-читаешь. Для кого там люди старались писали, что переменная цикла после завершения цикла не определена?
Термины "определено/не определено" разжёвывать надо?


 
Anatoly Podgoretsky   (2004-02-05 10:38) [26]

Если не понятно, что такое " is eliminated" так это означает, что значение не присваивается, то есть строка полностью игнорируется. Про использовалие за пределами цикла тебе уже несколько раз сказали.
И все это сказано на основе документированых вещей, а не дикого предположения об работе компилятора.


 
turonix   (2004-02-05 10:40) [27]

Резонно. Просто в C++Builder подобных проблем никогда не возникало. Если оператор написан, то он будет выполнен, пусть самый бесполезный! И компилятор там за тебя не думает (что очень приятно) :) Всем спасибо за помощь.


 
Anatoly Podgoretsky   (2004-02-05 10:43) [28]

turonix © (05.02.04 10:40) [27]
Опять же не правда и следует только из знания особенностей компилятора определенной версии, да и то при определенных условиях. Многие компиляторы Си еще более своевольные. Могут не только не выполнить написанное, но даже не выполнить цикл, а заменить его константой.

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


 
Тимохов   (2004-02-05 10:45) [29]


> turonix © (05.02.04 10:40) [27]

Слушайте АП - он вешь говорит.
Главное - пользоваться тем, что есть в доке и не умничать...


 
Mystic   (2004-02-05 11:00) [30]

После цикла for значение переменной цикла по определению считается неопределенным (вне зависимости от того, сколько раз выполнялся цикл). Обычно это значение на единицу больше, чем последнее значение, но на это полагаться не стоит (т. е. использовать переменную цикла после цикла без инициализации новым значением). Посему компилятор все счел нужным совершенно правильно.

Если тебе будет легче, считай что цикл

for i := 0 to LastValue do ForBody;
эквивалентен

i := 0;
while i <= LastValue do
begin
ForBody;
i := i + 1;
end;


Таким образом

i := 5;
for i := 0 to LastValue do ForBody;


єквивалентно

i := 5;
i := 0;
while i <= LastValue do
begin
ForBody;
i := i + 1;
end;


Отсюда видно, что присваивание i := 5 совершенно лишнее и убивается компилятором.


 
Плохиш   (2004-02-05 11:09) [31]

>Mystic © (05.02.04 11:00) [30]

Не пудри человеку мозги, прочитай с чего всё началось.
if LastValue >= 0 then забыл


 
jack128   (2004-02-05 11:14) [32]

Есть у компилятора небольшие погршности всетаки(по крайней мере D5 Update Pack1)
if FReadType = ratHourArhive then
ArhType := hc1HourArhive
else
ArhType := hc1DayArhive;
try
try
DBDatePeriods := GetDBNoDataPeriods(ArhType, FFirstDate, FLastDate);
for i := 0 to Length(DBDatePeriods) - 1 do
begin
if Terminated then
Exit;
fd := DBDatePeriods[i].FirstDateTime;
ld := DBDatePeriods[i].LastDateTime;
if not Assigned(hc) then
hc := THeatCounter.Create(10);
ReadArhiveData(ArhType, fd, ld);
end; // for
finally
FreeAndNil(hc);
end;
except
end;
Этот код выдает
Variable DBDatePeriods might not have been initialized
P.S. Качество самого кода - не оцениваем, я тут 90% кода удалил для читабильности ;-)


 
Тимохов   (2004-02-05 11:30) [33]


> Этот код выдает
> Variable DBDatePeriods might not have been initialized

Логично - ты же гасишь exception - выполение может пойти дальше с незазанным занчением DBDatePeriods если в GetDBNoDataPeriods случилась ошибка.


 
jack128   (2004-02-05 11:36) [34]


> Логично - ты же гасишь exception - выполение может пойти
> дальше с незазанным занчением DBDatePeriods если в GetDBNoDataPeriods
> случилась ошибка.
это весь текст процедуры. После погашенного исключения процедура завершается и к DBDatePeriods нигде обращения нету.


 
Mystic   (2004-02-05 11:46) [35]

jack128 © (05.02.04 11:14) [32]
в какой строке, какого типа DBDatePeriods?


 
jack128   (2004-02-05 16:47) [36]

type
TDatePeriod = record
FirstDate: TDAteTime;
LastDate: TDAteTime;
end;
TDAteTimePeriodDynArray = array of TDatePeriod;
var
DBDatePeriods: TDAteTimePeriodDynArray;


 
Sandman25   (2004-02-05 17:40) [37]

[36] jack128 © (05.02.04 16:47)

DBDatePeriods - модульная переменная или локальная?



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.013 c
1-53592
Gad
2004-02-07 11:35
2004.02.17
RichEdit и документы Word


1-53531
jiurajhgjhgty
2004-02-05 16:14
2004.02.17
Как запустить а затем закрыть внешнее приложение.


14-53713
тихий вовочка
2004-01-28 07:14
2004.02.17
Куда пойти учиться?


14-53743
syte_ser78
2004-01-28 08:58
2004.02.17
Коаксиал и витая пара


1-53537
Denis
2004-02-05 11:55
2004.02.17
Что быстрее - с процедурами или без них?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский