Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Вниз

Указатели   Найти похожие ветки 

 
Del   (2009-08-13 19:30) [0]

Конец рабочего дня...
 Вопросик:

procedure TForm1.Button1Click(Sender: TObject);
var
 P: Pointer;
 J: Integer;
 IntArr: ^TIntegerDynArray;

begin
 New(IntArr);
 SetLength(IntArr^, 5);
 for J := 0 to 5 - 1 do
   IntArr^[J] := J;
 P := IntArr^;
 for J := 0 to Length(TIntegerDynArray(P)) - 1 do
   Memo7.Lines.Add(IntToStr(TIntegerDynArray(P)[J]));

 SetLength(TIntegerDynArray(P), 0);
 ----------Здесь P = nil и в итоге указатель сам не уничтожается методом
 ----------  Dispose(P) в итоге засоряю пармять... как лечить???
 Dispose(P);
 
end;


 
Palladin ©   (2009-08-13 19:47) [1]

нахрена тебе указатель на указатель?


 
Palladin ©   (2009-08-13 19:48) [2]


>  SetLength(TIntegerDynArray(P), 0);

если уж и приводишь тип, так будь добр после идентификатора поставить крышечку...

и повторюсь, дин массив уже указатель


 
Palladin ©   (2009-08-13 19:49) [3]

и SetLength(0) ему в конце делать не обязательно, об этом позаботится компилятор, все это написано в справке по динамическим массивам


 
Del   (2009-08-13 19:55) [4]

Вот понадобилось...
 Реализовываю метод принимающий в параметрах массив массивов неопределенных типов.

 Ну вот... если срубаю SetLength Dispose выдает ошибку... если добавляю крышку... тоже


 
Palladin ©   (2009-08-13 19:57) [5]

"вот понадобилось" это не причина

куда ты ее добавляешь?
SetLength(TIntegerDynArray(P,^), 0);
Dispose(P);


 
Palladin ©   (2009-08-13 19:57) [6]

без запятой... это апичатка


 
Palladin ©   (2009-08-13 19:58) [7]


> for J := 0 to Length(TIntegerDynArray(P)) - 1 do
>    Memo7.Lines.Add(IntToStr(TIntegerDynArray(P)[J]));

а это что за несусветство? где крышки емае??


 
Del   (2009-08-13 20:01) [8]

После проставления крышечек...
Компилятор вежливо ругнулся:
---------------------------
Debugger Exception Notification
---------------------------
Project Project4.exe raised exception class EInvalidPointer with message "Invalid pointer operation".
---------------------------
Break   Continue   Help  
---------------------------


 
Del   (2009-08-13 20:02) [9]

Ругается в момент dispose(P)


 
Palladin ©   (2009-08-13 20:04) [10]

и все таки, ты можешь расскрыть тайну необходимости именно указателя?


 
Del   (2009-08-13 20:05) [11]

Код очень маленьки... специально выложил, чтоб можно было скопипастить... запустить... и понять... в чем дело.

 Все работает... ток вот FastMM грит что:

---------------------------
Project4.exe: Memory Leak Detected
---------------------------
This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

1 - 4 bytes: Unknown x 1
21 - 28 bytes: Unknown x 1

Note: Memory leak detail is logged to a text file in the same folder as this application. To disable this memory leak check, undefine "EnableMemoryLeakReporting".

---------------------------
OK  
---------------------------

Вот это то и напрягает


 
Anatoly Podgoretsky ©   (2009-08-13 20:08) [12]

Do not apply the dereference operator (^) to a dynamic-array variable or pass it to the New or Dispose procedure.
Кроме того разименование для динамических массивов свихнет крышу любому компилятору.


 
Palladin ©   (2009-08-13 20:09) [13]


> [12] Anatoly Podgoretsky ©   (13.08.09 20:08)

У него указатель на дин массив, а не сам дин массив


 
Del   (2009-08-13 20:10) [14]

тайна такова...
 есть метод, принимающий массив массивов(неизвестных типов), он копит сие массивы в приватной переменной (тож дин массив).
 Далее есть другой метод который из этой переменной выдергивает порциями "сумму" массивов в строковом формате.
Поясню, первый массив допустим получил массив из трех массивов(int),
[[1,2], [3,4],[5,6]]
он заливает его в приватную переменную. Далее второй метод выдаст следующее:
"1,2"
"3,4"
"5,6"
в строковом виде (именно в таком порядке).


 
Del   (2009-08-13 20:17) [15]

очепятка:
Поясню, первый метод(!!!) допустим получил массив из трех массивов(int),


 
Palladin ©   (2009-08-13 20:18) [16]

массив массивов организуется проще пареной репы

mm:Array of Array of Integer;

и не нужно никаких указателей


 
Del   (2009-08-13 20:22) [17]

это то да...
 только не все так просто...
 
 дело в том что в метод могут передать допустим следующее:

{IntegerArray = [1, 2]
StringArray = ["Значение1","Значение2"]
BooleanArray = [True, False]}

Method([@IntegerArray, @StringArray, @BooleanArray])
 
 и как по вашему это описать?

а выдать должно:
"1, 2
Значение1, Значение2
True, False"


 
Palladin ©   (2009-08-13 20:24) [18]

Type
 TM=Array of Integer;
 TMM=Array of TM;

Var
 gmm:TMM;

Procedure AAToStr(Const mm:TMM):String;
Var
 i,j:Integer;
Begin
 Result:="";
 For i:=0 to Length(mm)-1 Do
  Begin
   For j:=0 to Length(mm[i])-1 Do
    Result:=Result+IntToStr(mm[i,j])+",";
   SetLength(Result,Length(Result)-1);
   Result:=Result+#13#10;
  End;
 SetLength(Result,Length(Result)-2);
End;

Procedure AddMToMM(Var mm:TMM;Const m:TM);
Begin
 SetLength(mm,Length(mm)+1);
 mm[Length(mm)-1]:=m;
End;

Function FillM:TM;
Var
 n,i:Integer;
Begin
 n:=Random(5);
 SetLength(Result,n);
 For i:=0 to n-1 Do
  Result[i]:=Random(100);
End;

Var
 i:Integer;
Begin
 gmm:=Nil;
 For i:=0 to Random(10)-1 Do
  AddMToMM(gmm,FillM);
 ShowMessage(AAToStr(gmm));
End;


ку?


 
Del   (2009-08-13 20:26) [19]

упс...
 чет я уже запарился...
 выдать должно так:
"1 Значение1 Trye
2 Значение2 False"


 
Palladin ©   (2009-08-13 20:26) [20]


>  [17] Del   (13.08.09 20:22)

тогда смотри в сторону VarArrayCreate и иже с ними (see also то бишь)... любые типы, любые пертурбации в пределах разумного


 
Сергей М. ©   (2009-08-13 20:27) [21]


> как по вашему это описать?


По-нашему это описывается array of variant.


 
Del   (2009-08-13 20:33) [22]

не "ку" далеко не "ку" потому что это явный массив массивов интов.
а мне нужно работать с массивом который содержит массивы разных типов данных.

 Реализовать сие можно через указатели, по другому не придумал.

 Вызываться будет примерно так:
 Method([@[1,2], @["asd", "dsfdfs"], @[True, False]])
 (я для примера... на самом деле вместо @["asd", "dsfdfs"] естественно @ArrayOfString, тоесть переменные)


 
Palladin ©   (2009-08-13 20:34) [23]

читать [20] и [21]


 
Palladin ©   (2009-08-13 20:34) [24]

до полного просветления )


 
Del   (2009-08-13 20:36) [25]

Вариант первое что пришло в голову...
 не подходит, объемы данных очень большие... будет много есть как памяти так и времени проца


 
Del   (2009-08-13 20:38) [26]

Тема уехала далеко от вопроса...
 я не спрашиваю как реализовывать... меня интересует как разрулить с указателями
читать [0]


 
Сергей М. ©   (2009-08-13 20:40) [27]


> Del   (13.08.09 20:36) [25]


> будет много есть как памяти так и времени проца


Это ты из пальца высосал ?
Или проводил собственноручные замеры и имеешь статданные для сравнения ?


 
Сергей М. ©   (2009-08-13 20:42) [28]


> читать [0]


В [0] полная ахинея, что ее читать ?


 
Anatoly Podgoretsky ©   (2009-08-13 20:50) [29]

> Palladin  (13.08.2009 20:09:13)  [13]

Я знаю. но вторая часть уже относится к динамической переменной ссылке на динамический массив - вот это может свихнуть любые мозги.


 
Loginov Dmitry ©   (2009-08-13 21:45) [30]

> не подходит, объемы данных очень большие... будет много
> есть как памяти так и времени проца


Существуют вариантные массивы. Элементы в памяти расположены обычным
образом - друг за другом, памяти ест не больше, чем обычные массивы,
преимущество - ими можно обмениваться между приложениями через COM
(DCOM, ActiveX, OLE уж не знаю, как это все правильнее обозвать).
Элементы могут быть одного из стандартных типов (Byte, Word, Integer,
Single, Double, Boolean, WideString, Date, Variant и т.п.). Создаются такие
массивы с помощью функции VarArrayCreate(). Можно сделать вариантный
массив вариантов и т.д. Преимещество в том, что всегда можно определить
тип элементов таких массивов, для этого есть функции в модуле Variants
(для динамических массивов сделать это куда сложнее).


 
Loginov Dmitry ©   (2009-08-13 21:48) [31]

> так и времени проца


Для ускорения обработки вариантных массивов можно запросить
адрес начала массива с помощью функции VarArrayLock().


 
Del   (2009-08-14 11:49) [32]


> Сергей М. ©   (13.08.09 20:42) [28]
>
>
> > читать [0]
>
>
> В [0] полная ахинея, что ее читать ?
>


Это не рабочий код, а пример на вскидку, дабы указать на суть проблемы, а именно как грохнуть Pointer из памяти.


 
Del   (2009-08-14 11:53) [33]

Вариантный массив полюбому будет занимать больше места, и есть больше времени... а вот насколько... не тестил.
Подход такой: лучше то что быстрее и меньше.
  С VarArrayCreate, не пробывал... ну ща замучу тестик...



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

Форум: "Начинающим";
Текущий архив: 2009.10.18;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.006 c
11-1200751243
Vladimir Kladov
2008-01-19 17:00
2009.10.18
Версия 2.86


11-1206427258
Петровичъ
2008-03-25 09:40
2009.10.18
MCK для BDS2005-2007


2-1250692255
Б
2009-08-19 18:30
2009.10.18
Перемещение курсора.


15-1249653864
Kerk
2009-08-07 18:04
2009.10.18
WiFI в Питере


15-1250358753
xayam
2009-08-15 21:52
2009.10.18
Как человек думает?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский