Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-11397
kronprince
2002-10-04 10:44
2002.11.04
Надо на него напустить MJH :) - он популярно объяснит


3-11044
FelS
2002-10-14 11:42
2002.11.04
Как вставить картинку в табл. Paradox используя Query?


1-11205
Oleg_G
2002-10-23 20:05
2002.11.04
Помогите узнать размер любого файла


3-11114
jen_bond
2002-10-12 14:16
2002.11.04
Узнать разницу между датами


6-11378
Beglec
2002-08-23 08:57
2002.11.04
Техническое задание. По сети/интернет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский