Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.07.18;
Скачать: CL | DM;

Вниз

Проблема с целочисленной переменной.   Найти похожие ветки 

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

Что за черт! Объявляю целочисленную переменную 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;


 
Yanis ©   (2005-06-28 23:57) [1]

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


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

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


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


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


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


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

> 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:36) [5]


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


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


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

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 01:01) [7]


> Чайник ©   (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 01:13) [8]

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

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


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

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


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

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

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


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

> Германн ©   (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:48) [12]

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


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

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


 
Defunct ©   (2005-06-29 05:06) [14]

> Чайник

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


 
Defunct ©   (2005-06-29 05:10) [15]

> Чайник

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

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


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

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


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

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


 
evvcom ©   (2005-06-29 08:39) [17]

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


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

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


 
evvcom ©   (2005-06-30 08:55) [19]


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

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



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

Текущий архив: 2005.07.18;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.044 c
6-1113212545
Chubais
2005-04-11 13:42
2005.07.18
WSA SENDTO и передача больших структур


1-1119795223
heady
2005-06-26 18:13
2005.07.18
окно поверх ВСЕХ остальных


14-1119418202
Sandman29
2005-06-22 09:30
2005.07.18
Верите?


1-1120240535
Бу
2005-07-01 21:55
2005.07.18
jpg


6-1113309267
ламерок
2005-04-12 16:34
2005.07.18
Программа для работы с поисковыми запросами на делфи