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

Вниз

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

 
Чайник ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.038 c
14-1119904045
BigMac
2005-06-28 00:27
2005.07.18
Forex


1-1119937692
yusla
2005-06-28 09:48
2005.07.18
Создание компонентов в run-time?


14-1119365736
Зеленая Майка
2005-06-21 18:55
2005.07.18
Предлагаю отметить выход из клинической смерти любимого форума


4-1117101550
Dufe
2005-05-26 13:59
2005.07.18
Масштаб шрифта


1-1120032563
mefres
2005-06-29 12:09
2005.07.18
перевод числовых денег в строковые





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский