Форум: "Основная";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизПроблема с целочисленной переменной. Найти похожие ветки
← →
Чайник © (2005-06-28 23:44) [0]Что за черт! Объявляю целочисленную переменную FND, инициализирую в Create, тут же вызываю метод, где она используется и имею FND=256 (!). Что бы это значило?
type
- здесь оказывается, что FND=256
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;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