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

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

Ошибка [D3]


Страницы:   1 2

Ann ©   (2003-11-03 14:12:00) 

Мне очень нужна Ваша помощь. Разбираюсь с чужой программой, написанной на делфи3, парадоксовская база.
И вылетает следующая ошибка при расчете "Access violation at address 00583731 in module PrProgram.exe"
вылетает на следующих строках
Zc:=dim.GetData(0,i);
if ZcArtTableColor.Value<>Null then Zc^.Color:=ZcArtTableColor.Value else Zc^.Color:=0;
if ZcArtTableUp.Value<>Null then Zc^.Typ:=ZcArtTableUp.Value else Zc^.Typ:=0;
if ZcArtTableProcent.Value<> Null then Zc^.Proc:=ZcArtTableProcent.Value else Zc^.Proc:=0;
Уже полдня воюю с этой ошибкой и никак, а трассировкой не проверить, данных очень много, да и расчет жутко громоздкий. А вылетает не сразу, а к концу рассчета.
Понимаю, что дать совет на такие "абстрактные" вопросы трудно, но буду рада любым предположениям!


Ann   (2003-11-04 09:52:00) [1]


> [23] ЮЮ © (04.11.03 02:32)
> Т.к. GetData может возвращать nil, то в коде это следует
> учесть:
>
> if Zc <> nil then begin
> ...
> end;

Спасибо большое за совет!
Помогло.. после следующего все прошло нормально
Zc:=dim6.GetData(0,i);
if Zc <> nil then Zc^.Color:=ZcArtTableColor.Value;
if Zc <> nil then Zc^.Typ:=ZcArtTableUp.Value;
if Zc <> nil then Zc^.Proc:=ZcArtTableProcent.Value;


MORA   (2003-11-04 04:38:00) [2]

Проверь типы данных, они могут отличаться от 3 версии - Integer: -1 и $FFFFFFFF одно и то же. Real {$REALCOMPATIBILITY ON}


ЮЮ   (2003-11-04 02:32:00) [3]

Т.к. GetData может возвращать nil, то в коде это следует учесть:

if Zc <> nil then begin
...
end;

если же такая ситуация не должна возникать, то поставь точки останова в строках типа
if (X>=FMaxX) or (FPtr=nil) then
result:=nil <здесь Break Point>
и анализируй как туда попали


Ann   (2003-11-03 16:55:00) [4]


> [21] NAlexey © (03.11.03 16:55)
> Вот так вот... Посмотришь посмотришь вот так как люди мучаются,
> и начинаешь в два, нет, в три раза лучше форматировать и
> оттачивать код, сколько бы времени не уходило. Лучшеуж день
> потерять, потом за пять минут долететь.:)

легко долетать на своей программе..


NAlexey   (2003-11-03 16:55:00) [5]

Вот так вот... Посмотришь посмотришь вот так как люди мучаются, и начинаешь в два, нет, в три раза лучше форматировать и оттачивать код, сколько бы времени не уходило. Лучшеуж день потерять, потом за пять минут долететь.:)


Sandman25   (2003-11-03 16:54:00) [6]

[19] Ann © (03.11.03 16:49)

Перед тем, как разбираться, рекомендую исправить форматирование текста, поставив отступы, где надо. Тогда мозги перестанут помнить лишний контекст (while еще выполняется, из if еще не вышли, зашли в case...) и не будут кипеть :)


Ann   (2003-11-03 16:49:00) [7]

не.. я не к тому..
извините, я уже разобралась..


VAleksey   (2003-11-03 16:47:00) [8]

Она ничего не вернет.
Просто выполнит код внутри себя.
;-)


Ann   (2003-11-03 16:41:00) [9]

А можно еще один глупый вопрос(мозги уже закипают :( )?
А вот что должна вернуть в качестве результата например такая процедура:
procedure setzc(ColorCount:word);
var i:word;ZC:_Rec;
begin
With DataModule1 do begin{with}
dim:=TDinArray.Create;
dim.Granularity:=sizeof(TRec);
dim.Dimension:=DAD_2D;
dim.NumRows:=ColorCount;
dim.NumCols:=1;
dim.Clear;
i:=0;
ZcArtTable.First;
While not ZcArtTable.EOF do begin {ZcArtTable}
Zc:=dim.GetData(0,i);
Zc^.Color:=ZcArtTableColor.Value;
Zc^.Typ:=ZcArtTableUp.Value;
Zc^.Proc:=ZcArtTableProcent.Value;
i:=i+1;
ZcArtTable.Next;end;{ZcArtTable}
i:=0;
dim.Clear;
ZcRazTable.First;
While not ZcRazTable.EOF do begin {ZcArtTable}
Zc:=dim.GetData(0,i);
Zc^.Color:=ZcRazTableColor.Value;
Zc^.Typ:=ZcRazTableUp.Value;
Zc^.Proc:=ZcRazTableProcent.Value;
i:=i+1;
ZcRazTable.Next;end;{ZcArtTable}
dim.Destroy;
end;//with
end;
уже минут тридцать тупо на нее смотрю и не понимаю чего она вернет..
Простите, за глупые вопросы и не ругайте сильно....


Ann   (2003-11-03 15:14:00) [10]


> [15] Romkin © (03.11.03 15:11)
> Мда... Кошмар...
> Совсем мне это не нравится. Код надо бы менять, с дополнительными
> проверками. Память, как я вижу, копируется.
> То, что вылетает на указанной тобой строке - не факт, скорее
> всего именно на GetData, есть такое свойство, останов происходит
> на следующей строке.
> Трассировать надо, однако...

мда.. действительно кошмар, а времени переписывать сейчас нет, другая задача весит. :(
Спасибо большое за помощь :)
пошла трассировать..............


Romkin   (2003-11-03 15:11:00) [11]

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


Ann   (2003-11-03 14:59:00) [12]

AV вылетает на if ZcArtTableColor.Value<>Null then Zc^.Color:=ZcArtTableColor.Value else Zc^.Color:=0;

код GetData следующий
function TDinArray.GetData(X,Y:integer):pointer;
begin
if (FDim = DAD_1D) then
begin
if (X>=FMaxX) or (FPtr=nil) then result:=nil
else result:=pointer(integer(FPtr)+X*FGran);
end
else
begin
if (X>=FMaxX) or (Y>=FMaxY) or (FPtr=nil) then result:=nil
else result:=pointer(integer(FPtr)+(Y*FMaxX+X)*FGran);
end;
end;

а на счет первого (SetData) ..
procedure TDinArray.SetData(X,Y:integer;D:pointer);
var p:pointer;
begin
if (FDim = DAD_1D) then
begin
if (X>=FMaxX) or (FPtr=nil) then exit;
p:= pointer(integer(FPtr)+X*FGran);
end
else
begin
if (X>=FMaxX) or (Y>=FMaxY) or (FPtr=nil) then exit;
p:= pointer(integer(FPtr)+(Y*FMaxX+X)*FGran);
end;
move(D^,p^,FGran);
end;


Romkin   (2003-11-03 14:54:00) [13]

Нет,
1. в SetData выполняется копирование памяти или просто присвоение значения FPtr? Если второе, надо смотреть, что присваивается и когда освобождается.
2. Поставить лог внутри GetData, пусть сбрасывает, что указатель выдан.
Хотя хотелось бы на код этих методов глянуть.
Уточнить строку, в которой AV выпадает


Ann   (2003-11-03 14:51:00) [14]


> [11] Romkin © (03.11.03 14:49)
> Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
> Уточнить строку нельзя? А то как-то стремно.

не поняла.. какую строку уточнить? вернее, весь код привести?


Romkin   (2003-11-03 14:49:00) [15]

Тогда может и здесь вылетать :))) Zc:=dim.GetData(0,i);
Уточнить строку нельзя? А то как-то стремно.


Ann   (2003-11-03 14:45:00) [16]


> [7] Romkin © (03.11.03 14:40)
> Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде
> должно быть в D3. А так - может быть, хотя вряд ли, была
> бы ошибка насчет конвертации варианта

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


Anatoly Podgoretsky   (2003-11-03 14:44:00) [17]

Romkin © (03.11.03 14:40) [7]
Варианты вообще то немного капризная штука, особенно в младщих версиях. Для полей isNULL правильнее.


Ann   (2003-11-03 14:42:00) [18]


> [5] Romkin © (03.11.03 14:30)
> А что такое TdinArray?

unit DinArray;
{ DINAMIC ARRAY OBJECT IMPLEMENTATION MODULE
работает с элементами фиксированной длины
interface

type
TDADimension=(DAD_1D,DAD_2D);

TDinArray=class(TObject)
private
FPtr:pointer;
FDim:TDADimension;
FMaxX:integer;
FMaxY:integer;
FGran:integer;
procedure SetGranularity(Value:integer);
procedure SetMaxX(Value:integer);
procedure SetMaxY(Value:integer);
procedure SetDim(Value:TDADimension);
procedure Resize;
public
constructor Create;
destructor Destroy;override;
property Granularity:integer read FGran write SetGranularity;
property NumCols:integer read FMaxX write SetMaxX;
property NumRows:integer read FMaxY write SetMaxY;
property Dimension:TDADimension read FDim write SetDim;
function GetData(X,Y:integer):pointer;
function GetByte(X,Y:integer):byte;
function GetWord(X,Y:integer):word;
function GetInteger(X,Y:integer):integer;
procedure SetData(X,Y:integer;D:pointer);
procedure SetByte(X,Y:integer;D:Byte);
procedure SetWord(X,Y:integer;D:Word);
procedure SetInteger(X,Y:integer;D:Integer);
procedure Clear;
end;
и т.д. :)


Romkin   (2003-11-03 14:40:00) [19]

Вообще-то надо бы if not ZcArtTableColor.isNULL ... Вроде должно быть в D3. А так - может быть, хотя вряд ли, была бы ошибка насчет конвертации варианта


Anatoly Podgoretsky   (2003-11-03 14:33:00) [20]

А меня смущает это Null почему Variant, так и должно быть? Но к ошибке наверно это не имеет отношения.


Страницы:   1 2

Наверх

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