![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с памятью [D5, Win95/98]
Vikuksa © (2002-10-25 10:27:00)Объявляю массив: mas: array of array of integer;
Потом выполняю запрос, выделяю память SetLength(mas,2, days);
заполняю массив, строю по нему график.
Но допустим мне нужен более подробный график и я опять выполняю запрос, обнуляю массив mas := nill, т.к. у меня может измениться его размерность, опять выделяю память и запалняю его.
И где-то на третий раз он ругается "Invalid pointer operation"
Во, и я не знать что делать....
Peter Gluhiy (2002-10-25 11:37:00) [1]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;
Правда, в этой программе могут быть и другие ошибки.
Игорь Шевченко (2002-10-25 11:14:00) [2]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
Skier (2002-10-25 11:13:00) [3]>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...
Не поможет ?
Vikuksa (2002-10-25 11:10:00) [4]Peter Gluhiy © (25.10.02 11:04)
Во первых уверенА!
а во вторых размер правильный
Vikuksa (2002-10-25 11:09:00) [5]Объясняю еще раз!
Я хочу увидеть график с ... по ..., Задаю размерность массива, вызываю функцию : Vikuksa © (25.10.02 10:59).
Посмотрела, мне захотелось узнать еще что-то, ввожу дату с ... по ..., обнуляю массив , задаю новую размерность, вызываю функцию : Vikuksa © (25.10.02 10:59) и так далее пока не надоест!
Теперь понятно?
А вылетает на обнулении...
Peter Gluhiy (2002-10-25 11:04:00) [6]А ты уверен что days - это провильный размер массива?
И на какой строке вылетает?
Vikuksa (2002-10-25 10:59:00) [7]Вот так Вам больше нравиться?
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
Vikuksa (2002-10-25 10:52:00) [8]На первой строке вылетает.
mas := nil;
SetLength(mas,2, days);
Больше я его(массив) нигде не использую!!!!!!!!!
Vikuksa (2002-10-25 10:47:00) [9]Выполнение запроса и заполнение массива и рисование графика!
Все остальное вы уже и так знаете! 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
Skier (2002-10-25 10:45:00) [10]>Vikuksa
Эх, вот ежели кусочек кода бы увидеть...:)
Vikuksa (2002-10-25 10:41:00) [11]Без nill рушится на пятый раз!
Anatoly Podgoretsky (2002-10-25 10:37:00) [12]Это без разницы, делать или не делать := nil, произойдет сначала освобождение, а потом создание, с nil по надежнее или без разницы
Vikuksa (2002-10-25 10:36:00) [13]Ща попробую, а память не будет забиваться, или она перезаписывается?
Skier (2002-10-25 10:35:00) [14]>Vikuksa
"Принудительное" освобождение дин. массива или строки...
Но возможно тебе вполне хватит Peter Gluhiy © (25.10.02 10:31)
Vikuksa (2002-10-25 10:33:00) [15]Skier © (25.10.02 10:31)
А что такое Finalize(...)?
Skier (2002-10-25 10:31:00) [16]>Vikuksa
Перед новым вызовом SetLength(...) можно использовать
Finalize(...).
Не поможет ?
Peter Gluhiy (2002-10-25 10:31:00) [17]Не делай mas := nill!
Просто ещё раз SetLength
Anatoly Podgoretsky (2002-10-25 10:31:00) [18]Делаешь правильнл, наверно ошибка в другом месте, например обращение не по индексу, может где то хранится ссылка на этот массив, после переопределения адреса у элементов и массива будут другие.