Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.26.176] |
|
Страницы: (3) 1 2 [3] все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
R@RED
Цитата Цитата (Virtuals @ Сегодня, 08:33) sizeof(mass1) =4 !!! как думаеш почему? Почему же? потому что это указатель pointer (аналог ярлыка в виндах, типа написано на бумажке "машина стоит за углом") тоесть самих данных в переменной нет, она ссылается на область памяти где хранятся сами данные. Цитата то как например я должен обходиться без динамических массивов? а как вы узнаете размер вашего массива? чтоб не вызвать AV если для строк еще боле менее узнать размер (ну напр по терминирующему #0) то как узнать размер структуры mass2 : array of integer; ? в от с mass2 : array of string; вообще грабли, вот разберем этот пример mass2 : array of string; есть не что иное как указатель на область памяти, где хранится массив, произвольной длинны, указателей, которые ссылаются на области памяти, произвольной длинны, где данные, теоритически, оканчиваются на #0 вот мы и пришли к тому что "сложные" структуры, (тоесть такие где используются переменные, с неизвестным размером") лучше сохранять в какую либо БД, а какая это БД будет вам решать, но учтите что в ней каждый раз должно сохранятся неизвестное количество полей с произвольной длинной ЗЫ смотрите в сторону XML |
Сообщ.
#32
,
|
|
|
Цитата Virtuals @ Потом уже догадался )потому что это указатель pointer Цитата Virtuals @ Ясненько! )есть не что иное как указатель на область памяти, где хранится, массив, произвольной длинны, указателей, которые ссылаются на области памяти, произвольной длинны, где данные, теоритически, оканчиваются на #0 Цитата Virtuals @ Не катит, не спрашивайте почему, просто БД в этом случае мне не подходит...вот мы и пришли к тому что "сложные" структуры, (тоесть такие где используются переменные, с неизвестным размером") лучше сохранять в какую либо БД Ладно, я уже почти смирился со способом предложенным Демо. )) Всем спасибо, вопрос решен. |
Сообщ.
#33
,
|
|
|
R@RED
Есть один вариант. Но насколько он сложен(или прост) не скажу, пока не попробую реализовать сам. Подумаю немного-) |
Сообщ.
#34
,
|
|
|
Буду очень рад свежей идее! =)
|
Сообщ.
#35
,
|
|
|
Я тебе уже дал идею в #2. То, что говорит Rouse по этому поводу - фигня. Но если уж хочется подстраховаться, то можно писать файл в текстовом виде, там уж разночтений не будет.
|
Сообщ.
#36
,
|
|
|
Пример заготовки для копирования в TStream любой структуры:
Необходимо описание самой структуры (packed record) и строка с описанием типов полей: один символ - одно поле в структуре. Это лишь заготовка, необходимо тестировать в различных условиях. unit uTypes; interface uses Classes; type tRec=packed record fString: String; fInt: Integer; fInt64: Int64; fBoolean: Boolean; end; function GetRec(PointerToRecord: Pointer; RecordSH: String; Stream: TStream): Integer; function PutRec(PointerToRecord: Pointer; RecordSH: String; Stream: TStream): Integer; const RecSh='si6b'; implementation function GetRec(PointerToRecord: Pointer; RecordSH: String; Stream: TStream): Integer; var p: Pointer; c: Char; i: integer; Len: Integer; begin Result := 0; p := PointerToRecord; for i := 1 to Length(RecordSH) do begin c := UpCase(RecordSH[i]); case c of 'S': begin Stream.ReadBuffer(Len,SizeOf(Integer)); SetLength(PString(p)^,Len); Stream.ReadBuffer(PString(p)^[1],Len); p := Pointer(Integer(p)+SizeOf(String)); Result := Result + SizeOf(String)+Len; end; 'I': begin Stream.ReadBuffer(PInteger(p)^,SizeOf(Integer)); p := Pointer(Integer(p)+SizeOf(Integer)); Result := Result + SizeOf(Integer); end; '6': begin Stream.ReadBuffer(PInt64(p)^,SizeOf(Int64)); p := Pointer(Integer(p)+SizeOf(Int64)); Result := Result + SizeOf(Int64); end; 'B': begin Stream.ReadBuffer(PBoolean(p)^,SizeOf(Boolean)); p := Pointer(Integer(p)+SizeOf(Boolean)); Result := Result + SizeOf(Boolean); end; end; end; end; function PutRec(PointerToRecord: Pointer; RecordSH: String; Stream: TStream): Integer; var p: Pointer; c: Char; i: integer; Len: Integer; begin Result := 0; p := PointerToRecord; for i := 1 to Length(RecordSH) do begin c := UpCase(RecordSH[i]); case c of 'S': begin Len := Length(PString(p)^); Stream.WriteBuffer(Len,SizeOf(Integer)); Stream.WriteBuffer(PString(p)^[1],Len); p := Pointer(Integer(p)+SizeOf(String)); Result := Result + SizeOf(String)+Len; end; 'I': begin Stream.WriteBuffer(PInteger(p)^,SizeOf(Integer)); p := Pointer(Integer(p)+SizeOf(Integer)); Result := Result + SizeOf(Integer); end; '6': begin Stream.WriteBuffer(PInt64(p)^,SizeOf(Int64)); p := Pointer(Integer(p)+SizeOf(Int64)); Result := Result + SizeOf(Int64); end; 'B': begin Stream.WriteBuffer(PBoolean(p)^,SizeOf(Boolean)); p := Pointer(Integer(p)+SizeOf(Boolean)); Result := Result + SizeOf(Boolean); end; end; end; end; end. Пример использования: procedure TForm1.Button1Click(Sender: TObject); type pRec=^TRec; var fs: TFileStream; tr: PRec; tr1: TRec; begin New(tr); tr^.fString := 'ПРоверка записи строки в файл'; tr^.fInt := 1; tr^.fInt64 := 2; tr^.fBoolean := True; fs := TFileStream.Create('c:\test.dat', fmCreate); try uTypes.PutRec(tr,RecSH,fs); finally fs.Free; Dispose(tr); end; fs := TFileStream.Create('c:\test.dat', fmOpenRead); try uTypes.GetRec(@tr1,RecSH,fs); finally fs.Free; end; ShowMessage(tr1.fString+'/'+ IntToStr(tr1.fInt)+'/'+ IntToStr(tr1.fInt64)+'/'+ IntToStr(Integer(tr1.fBoolean))); end; |