Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с целочисленной переменной. [D6]


Чайник ©   (2005-06-28 23:44:00) 

Что за черт! Объявляю целочисленную переменную FND, инициализирую в Create, тут же вызываю метод, где она используется и имею FND=256 (!). Что бы это значило?

type
 TGraphOpenGL3DSerie = class(TPersistent)
 private
   ...
   FND : Integer;
   ...
 public
   constructor Create;
   procedure SetNewLength;
   property ND: Integer read FND;
   ...
 end;

constructor TGraphOpenGL3DSerie.Create;
begin
 FND := 1;
 ...
end;

procedure TGraphOpenGL3DSerie.SetNewLength;
var NN : Integer;
begin
 NN := (FND div DEF_GRAPH3D_BLOCK_DATA) + 1;
 - здесь оказывается, что FND=256
 SetLength(FX, NN*DEF_GRAPH3D_BLOCK_DATA);
 ...
end;


evvcom   (2005-06-30 08:55:00) [1]


> Отладчик плохо понимает массивы

Ну эт ты зря. Другое дело, отладчик неправильно поймет, если у тебя есть массив записей, а в записи присутствует FND, и объявлена переменная FND. Ты используешь конструкцию with <массив>[<индекс>] do <использование FND> и наводишь мышу на этот FND, по неопытности думая что покажет <массив>[<индекс>].FND, а отладчик показывает самостоятельную переменную FND. И вообще все, для чего используется конструкция with, отладчик показывает неверно (или не показывает вообще), т.к. пытается определить соответствующий идентификатор как самостоятельный.


Strech   (2005-06-30 02:26:00) [2]

А как ты знаешь, что у тебя FND = 256. Если в отладчике, то это может быть не так. Отладчик плохо понимает массивы, каковым у тебя является Series[...]. Однажды я тоже долго маялся непонимая, что происходит, в отладчике одно значение показывается, а если его вывести на экран (хотябы ShowMesage), то другое.


evvcom   (2005-06-29 08:39:00) [3]

Есть такая комбинация Ctrl+F5. Загони туда Series[0].FND и отслеживай, где оно поменяется.


Strech   (2005-06-29 07:27:00) [4]

Покажи кусок кода, где создается экземпляр TGraphOpenGL3DSerie. Надеюсь он вообще у тебя создается :)


Defunct   (2005-06-29 05:10:00) [5]

> Чайник

Для начала поставь заплатку, чтобы удостовериться в ошибке выхода за границу:

private
 Temp1 : Array[0..$FFFFF] of byte;
 FND   : Integer;
 Temp2 : Array[0..$FFFFF] of byte;


а также включи Range Checking.

Исследование массивов Temp1 и Temp2 даст тебе представление хотя бы о том с какой стороны происходит перетирание и насколько сильно ты где-то выходишь за границы.


Defunct   (2005-06-29 05:06:00) [6]

> Чайник

Проблема проста как Мир. Ты перетираешь поле FND какой-то другой структурой в памяти, при этом сей глюк происходит фиг знает в каком месте. Однако, если ты говоришь, что для отладки проверяешь значение поля FND сразу после вызова конструктора, тогда логично предположить, что именно в конструкторе у тебя и есть ошибка, вызывающая перетирание поля FND.


Чайник   (2005-06-29 01:54:00) [7]

Ладно, спать пойду. Завтра на свежую голову...


Просто Джо   (2005-06-29 01:48:00) [8]

Чайник, дружище, твой код просто удручает :(
В независимости от этого, приведи полный код класса, может быть найдутся желающие покопаться, а то с каждым постом появляются новые подробности.


Чайник   (2005-06-29 01:41:00) [9]

> Германн ©   (29.06.05 01:32) [10]
> 1. Попробуй для начала отключить "оптимизацию" в свойствах
> проекта.

Щас попробую...

> 2. слова "на каждом 50-м шаге" наводят на мысль, что есть у
> тебя какой-то цикл. Но реализацию его ты не привел!

Это не цикл. FND - просто счетчик:

function TGraphOpenGL3DSerie.AddNewXY(const X, Y: Double): Integer;
begin
 IF (FND mod DEF_GRAPH3D_BLOCK_DATA) = 0 Then SetNewLength;
 FX[FND] := X;
 FY[FND] := Y;
 FND := FND+1; Result := FND;
end;


Германн   (2005-06-29 01:32:00) [10]

2 Чайник ©   (29.06.05 01:13) [8]
>НЕ ДЛЯ ОТЛАДКИ я задаю начальное значение FND=0 и >DEF_GRAPH3D_BLOCK_DATA = 50 и процедура SetNewLength вызывается >на каждом 50-м шаге.

1. Попробуй для начала отключить "оптимизацию" в свойствах проекта.
2. слова "на каждом 50-м шаге" наводят на мысль, что есть у тебя какой-то цикл. Но реализацию его ты не привел!


Чайник   (2005-06-29 01:23:00) [11]

Помнится, в D5 были похожие проблемы с целочисленными константами - объявленные в одном модуле, в другом модуле получали произвольные значения. Рекомендовали лечить явным указанием типа. Но у меня не константа, а переменная ...


Чайник   (2005-06-29 01:13:00) [12]

НЕ ДЛЯ ОТЛАДКИ я задаю начальное значение FND=0 и DEF_GRAPH3D_BLOCK_DATA = 50 и процедура SetNewLength вызывается на каждом 50-м шаге.

Проблема не в ЭТОМ.
Как бы я не вызывал процедуру SetNewLength (вообще-то она должна сидеть в секции Prvate, это я ее перенес в Public задолбавшись с FND - пробовал напрямую вызывать из главной программы), что бы я не делал, какое бы значение ни присваивал переменной FND в Create - в процедуре SetNewLength она упорно получает = 256.


Verg   (2005-06-29 01:01:00) [13]


> Чайник ©   (29.06.05 00:52) [6]


А НЕ для отладки? Сделаешь > 1 ?

И что получишь при первом вызове?


> Series[0] := TGraphOpenGL3DSerie.Create;
> Series[0].AddNewXY(3.14, 2.71);


SetNewLength не вызовется вообще, пока FND не станет равным DEF_GRAPH3D_BLOCK_DATA (если до этого, конечно не случится AV за счет присваваний значений несуществующим элементам дин. массива, хотя и необязательно). Т.е. бред.

FND д.б. = 0 при конструировнии.


Чайник   (2005-06-29 00:52:00) [14]

Verg ©   (29.06.05 00:36) [5]
> Для какого DEF_GRAPH3D_BLOCK_DATA отличного от 1 будет
> выполняться это условие при FND = 1?

Для всех FND кратных DEF_GRAPH3D_BLOCK_DATA.
DEF_GRAPH3D_BLOCK_DATA - const, для отладки пока залано как раз равным 1.


Verg   (2005-06-29 00:36:00) [15]


> IF (FND mod DEF_GRAPH3D_BLOCK_DATA) = 0 Then SetNewLength;


Для какого DEF_GRAPH3D_BLOCK_DATA отличного от 1 будет выполняться это условие при FND = 1?


Чайник   (2005-06-29 00:31:00) [16]

> Verg ©   (29.06.05 00:18) [3]
> Не вижу вызовов методов. Пока одни объявления.

Пардон, забыл указать:

type
TGraphOpenGL3DSerie = class(TPersistent)
private
  ...
  FND : Integer;
  ...
public
  constructor Create;
  procedure SetNewLength;
  function AddNewXY(const X,Y : Double): Integer;
  property ND: Integer read FND;
  ...
end;

...

function TGraphOpenGL3DSerie.AddNewXY(const X, Y: Double): Integer;
begin
 IF (FND mod DEF_GRAPH3D_BLOCK_DATA) = 0 Then SetNewLength;
 FX[FND] := X;
 FY[FND] := Y;
 FND := FND+1; Result := FND;
end;


Метод AddNewXY вызываю из главной программы:

Series[0] := TGraphOpenGL3DSerie.Create;
Series[0].AddNewXY(3.14, 2.71);


Verg   (2005-06-29 00:18:00) [17]


> тут же вызываю метод, где она используется и имею FND=256
>


Не вижу вызовов методов. Пока одни объявления.


Чайник   (2005-06-29 00:10:00) [18]

Попробовал вместо Integer делать ее Cardinal и т.д - то же результат.


Yanis   (2005-06-28 23:57:00) [19]

С чего ты взял? Такого не бывает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо