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

Вниз

Проблемы с памятью   Найти похожие ветки 

 
Vikuksa ©   (2002-10-25 10:27) [0]

Объявляю массив: mas: array of array of integer;
Потом выполняю запрос, выделяю память SetLength(mas,2, days);
заполняю массив, строю по нему график.
Но допустим мне нужен более подробный график и я опять выполняю запрос, обнуляю массив mas := nill, т.к. у меня может измениться его размерность, опять выделяю память и запалняю его.

И где-то на третий раз он ругается "Invalid pointer operation"

Во, и я не знать что делать....


 
Skier ©   (2002-10-25 10:31) [1]

>Vikuksa
Перед новым вызовом SetLength(...) можно использовать
Finalize(...).
Не поможет ?


 
Anatoly Podgoretsky ©   (2002-10-25 10:31) [2]

Делаешь правильнл, наверно ошибка в другом месте, например обращение не по индексу, может где то хранится ссылка на этот массив, после переопределения адреса у элементов и массива будут другие.


 
Peter Gluhiy ©   (2002-10-25 10:31) [3]

Не делай mas := nill!
Просто ещё раз SetLength


 
Vikuksa ©   (2002-10-25 10:33) [4]

Skier © (25.10.02 10:31)

А что такое Finalize(...)?


 
Skier ©   (2002-10-25 10:35) [5]

>Vikuksa
"Принудительное" освобождение дин. массива или строки...
Но возможно тебе вполне хватит Peter Gluhiy © (25.10.02 10:31)


 
Vikuksa ©   (2002-10-25 10:36) [6]

Ща попробую, а память не будет забиваться, или она перезаписывается?


 
Anatoly Podgoretsky ©   (2002-10-25 10:37) [7]

Это без разницы, делать или не делать := nil, произойдет сначала освобождение, а потом создание, с nil по надежнее или без разницы


 
Vikuksa ©   (2002-10-25 10:41) [8]

Без nill рушится на пятый раз!


 
Skier ©   (2002-10-25 10:45) [9]

>Vikuksa
Эх, вот ежели кусочек кода бы увидеть...:)


 
Vikuksa ©   (2002-10-25 10:47) [10]

Выполнение запроса и заполнение массива и рисование графика!
Все остальное вы уже и так знаете! while not imag.ADOQuery2.Eof do begin
if (imag.ADOQuery2.FieldByName("yyyy").AsInteger = StrToInt(yy1)) then begin
if (imag.ADOQuery2.FieldByName("days").AsInteger = j) then begin
if (imag.ADOQuery2.FieldByName("days").AsInteger <> 0) then begin
mas[1,i] := imag.ADOQuery2.fieldbyname("kol").AsInteger;
inc(i);
inc(j);
imag.ADOQuery2.Next;
end; end
else begin mas[1,i] := 0; inc(j); inc(i); end;
end
else begin j := 1; yy1 := IntToStr(StrToInt(yy1)+1); end;
end;
imag.ADOQuery2.Close;
for i:=0 to days-1 do
imag.Series1.AddXY( i+1, mas[0,i],"",clTeeColor);
for i:=0 to days-1 do
imag.Series2.AddXY( i+1, mas[1,i],"",clTeeColor);
end


 
Vikuksa ©   (2002-10-25 10:52) [11]

На первой строке вылетает.
mas := nil;
SetLength(mas,2, days);

Больше я его(массив) нигде не использую!!!!!!!!!


 
Vikuksa ©   (2002-10-25 10:59) [12]

Вот так Вам больше нравиться?
i := 0;
yy1 := yy;
imag.ADOQuery1.Active := false;
imag.ADOQuery1.SQL.Clear;
txt:="SELECT DatePart(dy,Входящие.Дата_поступления) AS days,DatePart(yy,Дата_поступления) AS yyyy, Count(Входящие.Дата_поступления) AS kol "+
"FROM Входящие WHERE (Входящие.Входящий_кому= 10) AND ((Входящие.Дата_поступления) Between CONVERT(Datetime,"""+data1+""",103) And CONVERT(Datetime,"""+data2+""",103)) "+
"GROUP BY DatePart(dy,Входящие.Дата_поступления), DatePart(yy,Дата_поступления)ORDER BY DatePart(yy,Входящие.Дата_поступления),DatePart(dy,Входящие.Дата_поступления);";
imag.ADOQuery1.SQL.Text := txt;
imag.ADOQuery1.Open;
imag.ADOQuery1.First;
j := StrToInt(n_day);
while not imag.ADOQuery1.Eof do begin
if (imag.ADOQuery1.FieldByName("yyyy").AsInteger = StrToInt(yy1)) then begin
if (imag.ADOQuery1.FieldByName("days").AsInteger = j) then begin
if (imag.ADOQuery1.FieldByName("days").AsInteger <> 0) then begin
mas[0,i] := imag.ADOQuery1.fieldbyname("kol").AsInteger;
inc(i);
inc(j);
imag.ADOQuery1.Next;
end; end
else begin mas[0,i] := 0; inc(j); inc(i); end;
end
else begin j := 1; yy1 := IntToStr(StrToInt(yy1)+1); end;
end;
imag.ADOQuery1.Close;
i := 0;
yy1 := yy;
imag.ADOQuery2.Active := false;
imag.ADOQuery2.SQL.Clear;
txt := "SELECT DatePart(dy,T_Docs.F13) AS days,DatePart(yy,T_Docs.F13) AS yyyy, Count(T_Docs.F13) AS Kol "+
"FROM T_DocFace LEFT JOIN T_Docs ON T_DocFace.SN = T_Docs.SNE "+
"WHERE ((T_Docs.F13) Between CONVERT(Datetime,"""+data1+""",103) And CONVERT(Datetime,"""+data2+""",103)) "+
"GROUP BY DatePart(dy,T_Docs.F13), DatePart(yy,T_Docs.F13) ORDER BY DatePart(yy,T_Docs.F13),DatePart(dy,T_Docs.F13)";
imag.ADOQuery2.SQL.Text := txt;
imag.ADOQuery2.Open;
imag.ADOQuery2.First;
j := StrToInt(n_day);
while not imag.ADOQuery2.Eof do begin
if (imag.ADOQuery2.FieldByName("yyyy").AsInteger = StrToInt(yy1)) then begin
if (imag.ADOQuery2.FieldByName("days").AsInteger = j) then begin
if (imag.ADOQuery2.FieldByName("days").AsInteger <> 0) then begin
mas[1,i] := imag.ADOQuery2.fieldbyname("kol").AsInteger;
inc(i);
inc(j);
imag.ADOQuery2.Next;
end; end
else begin mas[1,i] := 0; inc(j); inc(i); end;
end
else begin j := 1; yy1 := IntToStr(StrToInt(yy1)+1); end;
end;
imag.ADOQuery2.Close;
for i:=0 to days-1 do
imag.Series1.AddXY( i+1, mas[0,i],"",clTeeColor);
for i:=0 to days-1 do
imag.Series2.AddXY( i+1, mas[1,i],"",clTeeColor);
end


 
Peter Gluhiy ©   (2002-10-25 11:04) [13]

А ты уверен что days - это провильный размер массива?
И на какой строке вылетает?


 
Vikuksa ©   (2002-10-25 11:09) [14]

Объясняю еще раз!
Я хочу увидеть график с ... по ..., Задаю размерность массива, вызываю функцию : Vikuksa © (25.10.02 10:59).
Посмотрела, мне захотелось узнать еще что-то, ввожу дату с ... по ..., обнуляю массив , задаю новую размерность, вызываю функцию : Vikuksa © (25.10.02 10:59) и так далее пока не надоест!

Теперь понятно?
А вылетает на обнулении...


 
Vikuksa ©   (2002-10-25 11:10) [15]

Peter Gluhiy © (25.10.02 11:04)

Во первых уверенА!
а во вторых размер правильный


 
Skier ©   (2002-10-25 11:13) [16]

>Vikuksa
Попробуй объявить тип
type
Tmas = array of array of integer;
и Переменную
var
mas : Tmas;

и динамический массив передавай в Vikuksa © (25.10.02 10:47)
по ссылке

procedure Vikuksa_25.10.02 10:47(var AMas : Tmas; ...);

и в теле Vikuksa_25.10.02 10:47 работай с AMas...

Не поможет ?




 
Игорь Шевченко ©   (2002-10-25 11:14) [17]

while not imag.ADOQuery2.Eof do begin
if (imag.ADOQuery2.FieldByName("yyyy").AsInteger = StrToInt (yy1)) then begin
if (imag.ADOQuery2.FieldByName("days").AsInteger = j) then begin
if (imag.ADOQuery2.FieldByName("days").AsInteger <> 0) then begin
mas[1,i] := imag.ADOQuery2.fieldbyname("kol").AsInteger;
inc(i);
inc(j);
imag.ADOQuery2.Next;
// Это только в этом случае надо делать ?
end;
end else begin
mas[1,i] := 0;
inc(j);
inc(i);
end;
end else begin
j := 1;
yy1 := IntToStr(StrToInt(yy1)+1);
end;
end;
imag.ADOQuery2.Close;
for i:=0 to days-1 do
imag.Series1.AddXY( i+1, mas[0,i],"",clTeeColor);
for i:=0 to days-1 do
imag.Series2.AddXY( i+1, mas[1,i],"",clTeeColor);
end



 
Peter Gluhiy ©   (2002-10-25 11:37) [18]

Vikuksa © (25.10.02 11:10)
>Во первых уверенА!
Извините мадам :)

Как заметил Игорь Шевченко © (25.10.02 11:14)
imag.ADOQuery2.Next нужно в другом месте написать.

while not imag.ADOQuery2.Eof do begin

imag.ADOQuery2.Next;
end;
imag.ADOQuery2.Close;

Правда, в этой программе могут быть и другие ошибки.



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

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

Наверх




Память: 0.51 MB
Время: 0.013 c
7-11508
UWater
2002-09-01 16:54
2002.11.04
Серийный номер жесткого диска


4-11556
@Ujin
2002-09-04 21:07
2002.11.04
Как программно изменить частоту развертки монитора?


14-11394
$hade
2002-10-15 13:48
2002.11.04
Бойцовский клуб


14-11403
Arbin
2002-10-02 11:00
2002.11.04
Анализ текста - общение с компом


1-11154
chak
2002-10-24 11:12
2002.11.04
Поиск в массиве?