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

Вниз

Подскажите, выделяет ли память функция SetLength ..   Найти похожие ветки 

 
Alexsus   (2003-06-02 17:34) [0]

Подскажите, выделяет ли память функция SetLength для массивов структур или для этого нужно пользоваться GetMem

Зарание спасибо.


 
Skier   (2003-06-02 17:35) [1]

>Alexsus (02.06.03 17:34)
Код свой покажи, всё и выяснится...


 
Alexsus   (2003-06-02 17:48) [2]

Сами структуры

TCCondition = record
OprId : String;
Oper1 : String;
Oper2 : String;
end;
TCField = record
TblId : String;
TblPK : String;
CndNum : Integer;
CndArray : array of TCCondition;
end;

Добавляю элемент
Var fld : TCField;
begin
inc(fld.CndNum);
SetLength(fld.CndArray,fld.CndNum);
end;

после двух трёх итераций программа сваливается ((


 
Skier   (2003-06-02 17:51) [3]

Судя по всему ты добавляешь в массив, т.е. размер массива
меняется.
Если так, то лучше использовать для этой цели TList или его
потомок...


 
Alexsus   (2003-06-02 17:56) [4]

Не хочу показаться назойливым )), можно небольшой примерчик ?
И неужели нельзя обойтись без использования каких то стандартных классов ? Просто в том же VB есть необходимые средства, а Delphi должно быть вроде как помощнее.


 
Юрий Зотов   (2003-06-02 17:57) [5]

Попробуйте так:

PCCondition = ^TCCondition; //!!
TCCondition = record
OprId: String;
Oper1: String;
Oper2: String;
end;

TCField = record
TblId : String;
TblPK : String;
CndNum : Integer;
CndArray: array of PCCondition; //!!
end;

После этого, думаю, SetLength должна работать нормально. Но вот память под сами записи придется выделять/освобождать ручками:
New(CndArray[i]);
Dispose(CndArray[i]);


 
Sandman25   (2003-06-02 17:59) [6]

Alexsus (02.06.03 17:56)
Я только что прогнал Вашу программу у себя. Все работает нормально, даже после 10 "итераций". Покажите весь Ваш код, относящийся к работе с данными записями.


 
Alexsus   (2003-06-02 18:00) [7]

Спасибо буду пробовать.


 
Sandman25   (2003-06-02 18:01) [8]

Юрий Зотов © (02.06.03 17:57)

То есть если понадобится массив of integer, то придется использовать pinteger? Я думаю, надо разобраться, почему у человека программа вылетает.


 
Skier   (2003-06-02 18:04) [9]

>Alexsus
При работе с дин. массивами нужно помнить :
-что дин. массивы это структуры с контролируемым
временем жизни (как и строки).
-при присваивании массива происходит не копирование значений, а
копирование адреса массива


 
Alexsus   (2003-06-02 18:07) [10]

// Тип описания элемента дерева кубов
PCubeElement = ^TCubeElement;
TCubeElement = record
ElType : String;
ElID : String;
ElName : String;
TblId : String; // ID таблицы
TblPK : String; // Первичный ключ таблицы
end;
// Типы описания запроса
TCCondition = record // --- Условия
CndCode : Integer; // Код условия
OprId : String; // ID операции
Oper1 : String; // Операнд 1
Oper2 : String; // Операнд 2
end;
TCField = record
FldID : String; // ID поля
FldName : String; // Название поля
Belong : String; // Принадлежность(изм/перем)
SlcFlag : Boolean; // Флаг выборки
TblId : String; // ID таблицы
TblPK : String; // Первичный ключ таблицы
CndNum : Integer; // Количество условий
CndArray : array of TCCondition; // Условия
end;
TCQuery = record // --- Запрос
CubId : String; // ID куба
CubName : String; // Название куба
QryID : String; // ID запроса
QryName : String; // Название запроса
FldNum : Integer;// Количество полей
FldArray : array of TCField;
end;

Var
CTree : array of TCubeElement; // Объявлена в отдельнов модуле
Query : TCQuery; объявлена public секции формы
begin
inc(Query.FldNum);
SetLength(Query.FldArray,Query.FldNum);
Query.FldArray[Query.FldNum-1].FldID := PCubeElement(Selected.Data)^.ElID;
Query.FldArray[Query.FldNum-1].FldName := PCubeElement(Selected.Data)^.ElName;

myLst.Caption := Query.FldArray[Query.FldNum-1].FldID + " - " +Query.FldArray[Query.FldNum-1].FldName;
myLst.Data := PString(@Query.FldArray[Query.FldNum-1].FldID)

// Сваливается после при обращении полям data добавленных элементов
end;


 
Skier   (2003-06-02 18:17) [11]

Вот это весьма опасно, стоит подумать...
PString(@Query.FldArray[Query.FldNum-1].FldID)


 
Alexsus   (2003-06-02 18:19) [12]

А какие альтернативы ??


 
Skier   (2003-06-02 18:21) [13]

>Alexsus (02.06.03 18:19)
-> Pointer(Query.FldArray[Query.FldNum-1].FldID)
<- Integer(myLst.Data)



 
Serginio   (2003-06-02 18:22) [14]

Вообщето нужно обнулять стековые переменные перед использованием
Var fld : TCField;
begin
FillChar(fld,SizeOf(TCField),0);
inc(fld.CndNum);
SetLength(fld.CndArray,fld.CndNum);
end;
Во всяком случае у меня таких проблем не было.



 
Sandman25   (2003-06-02 18:22) [15]

>myLst.Data := PString(@Query.FldArray[Query.FldNum-1].FldID)

Каково описание myLst?

По-моему, нужно выделить память под myLst.Data и скопировать строку, а не просто присвоить указатель на нее.


 
Alexsus   (2003-06-02 18:25) [16]

var
myLst : TListItem;

begin
myLst := lsvAttr.Items.Add;
myLst.Caption := Query.FldArray[Query.FldNum-1].FldID;
myLst.Data := PString(@Query.FldArray[Query.FldNum-1].FldID)
end;


 
Sandman25   (2003-06-02 18:27) [17]

Возможно, поможет
@Query.FldArray[Query.FldNum-1].FldID[1]

Как происходит дальнейшее использование data?



 
Alexsus   (2003-06-02 18:31) [18]

Немного не понял FldID переменная типа string, что будет означать обращение FldID[1] ?? Data используется для ссылки на элементы выше описанных структур.



 
Skier   (2003-06-02 18:31) [19]

А какой тип у FldID ?
если строковый, то мой пост (02.06.03 18:21) отменяется !


 
Sandman25   (2003-06-02 18:33) [20]

Адрес первого символа.

Если потом происходит присваивание
var p: pchar;
begin
p := pchar(mylst.data);

На какой именно строке просходит вылет программы? Я поэтому спрашиваю, как именно используется data.


 
Skier   (2003-06-02 18:33) [21]

var
AStr : PString;
begin
//...........
New(AStr);
AStr^ := Query.FldArray[Query.FldNum-1].FldID;
myLst.Data := AStr
//...........
end;

Использование : PString(myLst.Data)^



 
Serginio   (2003-06-02 18:37) [22]

2(Skier) То что валится динамический массив это совсем не значит, что TList лучше динамического массива. Очень давно работаю с динамическими массивами и не разу не было что бы они валились а структуры были очень сложные.


 
Skier   (2003-06-02 18:39) [23]

>Serginio (02.06.03 18:37)
Рад за тебя !


 
Alexsus   (2003-06-02 18:41) [24]

VAr
lsvAttr: TListView;

for i:=0 to lsvAttr.Items.Count-1 do
begin
if PString(lsvAttr.Items[i].Data)^ = PCubeElement(Selected.Data)^.ElID
then
...
end;
Вылет происходит при обращении к PString(lsvAttr.Items[i].Data)^ для тех элементов которые добавлялись SetLength по одному,а не при начальном создании всего массива, и то не сразу а только после добавления 1,2 элементов


 
Serginio   (2003-06-02 18:42) [25]

2(Skier) Большое спасибо за Вашу радость.
2 (Alexsus) Не мог бы поподробнее показать код с динамическими массивами и какие значения наблюдал в отладчике. А именно
fld.CndNum; и
Length(fld.CndArray);



 
Sandman25   (2003-06-02 18:49) [26]

Alexsus
см. Skier © (02.06.03 18:33)
Если делать по его методике, то проблем быть не должно.
У Вас освобождалась память, выделенная под строки (так как ссылок на нее уже не было), и при следующем выделении памяти в то же место записывались другие данные.



 
VMcL   (2003-06-02 18:50) [27]

>Alexsus (02.06.03 17:34)
Initialize, Finalize.


 
Alexsus   (2003-06-02 18:56) [28]

fld.cndarray заполняется далее и в данном месте роли играть по моему не должен, ошибка возникает при добавление элементов Query.FldArray причем значения Query.CndNum и Length(Query.FldArray) увеличивается


 
Serginio   (2003-06-02 18:57) [29]

Используй метод Skier © (02.06.03 18:33) так как ссылки на строки весьма опасны.


 
Serginio   (2003-06-02 19:00) [30]

Теперь осталось спросить и строки присваиваются. И что такое Selected.Data


 
Alexsus   (2003-06-02 19:07) [31]

Строки присваиваются. TTreeView(t).Selected.Data


 
Serginio   (2003-06-02 19:20) [32]

Теперь осталось спросить откуда ссылки на TTreeView(t).Selected.Data. Да уж намешано у тебя будь здоров. Не думаю, что проблема с динамическими массивами


 
Alexsus   (2003-06-02 19:24) [33]

t : TreeView это просто компонент на форме, при работе с ним вряд ли могли возникнуть ошибки. Ошибки возникают только когда я по одному начинаю создавать новые элементы структур. При выделении памяти заранее этого не происходит.


 
Serginio   (2003-06-02 19:31) [34]

Откуда в TTreeView(t).Selected.Data появляются данные??? из твоего кода только можно гадать.
2. Цел ли еще массив так как у тебя строки ссылаются на элементы массива.
3. Пробовал ли Используй метод Skier © (02.06.03 18:33) так как ссылки на строки весьма опасны.



 
Alexsus   (2003-06-02 19:39) [35]

Имеется в виду пост Skier © (02.06.03 18:33) ??
В данный момент пробую но особых продвижений нет((


 
Serginio   (2003-06-02 19:43) [36]

А есть возможность того, что Selected.Data вообще не существует???


 
Song   (2003-06-02 19:50) [37]

А есть возможность того, что Selected.Data вообще не существует???

Запросто.
TTreeNode.Data:=nil;


 
Serginio   (2003-06-02 19:58) [38]

2(Song) Это вопрос Alexsus так как у него присваивается
Query.FldArray[Query.FldNum-1].FldID := PCubeElement(Selected.Data)^.ElID;


 
Alexsus   (2003-06-02 20:03) [39]

Нет такой возможности TTreeNode.Data везде существует.


 
Alexsus   (2003-06-02 20:24) [40]

Всем огромное спасибо ! В первом приближении заработало.



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

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

Наверх





Память: 0.54 MB
Время: 0.009 c
1-34897
Dimich1978
2003-05-30 11:09
2003.06.12
Туплю с датами


14-34992
etem
2003-05-26 14:55
2003.06.12
При создании индекса по строковому полю трабл...


1-34797
Dush
2003-06-02 11:54
2003.06.12
Word


3-34692
Marat111
2003-05-22 15:23
2003.06.12
Получить оповещение от базы


14-35014
b_baranov
2003-05-26 17:21
2003.06.12
Пакеты Erwin, xCase, RoboCase





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