Форум: "Основная";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];
ВнизПроблемы с памятью Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c