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

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

Проблемы с памятью [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]

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


Наверх

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