Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.13;
Скачать: CL | DM;

Вниз

Динамические массивы и sizeof   Найти похожие ветки 

 
GIL ©   (2003-03-04 04:48) [0]

Проблема в следующем: если у динамическаго массива менять длину функцией setlength, то sizeof показывает не то значение, которое мне нужно, как сделать так, чтобы функция sizeof выдавала нужное значение? И еще, пытался сделать внутреннюю функцию и в нее как параметр передавать нужное значение, а в ней объявлять массив, но ничего не получается:
function ...(const i:integer;...):...;
var
b:array[1..i] of char;


 
Демонов Е.В. ©   (2003-03-04 05:05) [1]

sizeof Всегда вернёт 4 - переменная обьявленная как динамический масив это указатель а его размер=4. Чтобы узнать количестао элементов в дин масиве мспользуй ф-ию length()

>>не получается:
а так

function ...(const i:integer;...):...;
var
b:array of char;
begin
SetLength(b,i-1);




 
GIL ©   (2003-03-04 05:26) [2]

Я так делал, вся проблема в том, что после всех этих махинаций я вызываю функцию blockread и соответственно получаю послание от компа. Как ее вызвать для динамического массива?


 
MBo ©   (2003-03-04 06:29) [3]

var a:array of integer;

BlockRead(f,a[0],Length(a)*SizeOf(Integer));


 
GIL ©   (2003-03-04 07:04) [4]

Не получается Error998 или тип integer здесьь имеет какое-то особое значение? И как сделать s:=buf; где s:string, buf:array of char. с обычным массивом так получается, а как сделать с динамическим?


 
MBo ©   (2003-03-04 07:11) [5]

>тип integer здесьь имеет какое-то особое значение?
Здесь это для примера - тип элемента массива.

>И как сделать
вопрос невнятный
возможно, Move подойдет


 
GIL ©   (2003-03-04 07:27) [6]

То, что я считал из файла в массив надо записать в строковую переменную, делать цикл и поэлементно загонять все в строку мне кажется мягко говоря нерационально! Со статическим массивом это делается просто, а как с динамическим я не знаю. А пример тот не работает:
var a:array of integer;

BlockRead(f,a[0],Length(a)*SizeOf(Integer));



 
MBo ©   (2003-03-04 07:33) [7]

Так сразу читай в строку (SetLength не забудь)

>А пример тот не работает:
У кого как ;)
Что в файле? SetLength делал?


 
GIL ©   (2003-03-04 07:42) [8]

i:integer;
Buf:array of char;
begin
assignfile(f,"XVII


 
MBo ©   (2003-03-04 07:51) [9]

i:integer;
Buf:String;
begin
assignfile(f,"XVII


 
GIL ©   (2003-03-04 07:59) [10]

То же самое - не работает!! Опять 998


 
GIL ©   (2003-03-04 08:02) [11]

То же самое - не работает!! Опять 998
Я сделал по другому - цикл в try except а в except меняется условие цикла, так, что цикл завершается. со статическим массивом, но возникает исключительная ситуация, когда он хочет прочитать дальше конца файла, а мне хотелось бы без исключительной ситуации.


 
MBo ©   (2003-03-04 08:13) [12]

procedure TForm1.Button1Click(Sender: TObject);
var f:file;
i:integer;
Buf:String;
begin
assignfile(f,"e:\a.htm");
reset(f,1);
i:=filesize(f);
SetLength(buf,i);
Blockread(f,buf[1],i);
memo1.lines.text:=buf;
closefile(f);
end;

другой вариант

procedure TForm1.Button1Click(Sender: TObject);
var fs:tfilestream;
i:integer;
Buf:String;
begin
fs:=TFileStream.Create("e:\a.htm",fmOpenRead);
SetLength(buf,fs.Size);
fs.Read(buf[1],fs.Size);
memo1.lines.text:=buf;
fs.Free;
end;

А вообще файл текстовый, так что разумно Readln использовать или TStringList.LoadFromFile


 
nikto   (2003-03-04 08:20) [13]

Сравни две процедурки, должно помочь:



procedure TMainForm.Button1Click(Sender: TObject);
var ByteArr: PByteArray; //PChar тоже подойдет
//или самостоятельно объявленный тип:
//PCharArray = ^TCharArray;
//TCharArray = array [0..0] of char;
//попробуй просто изменить
hFile: THandle;
Size, Read: Cardinal;
begin
hFile := CreateFile("F:\some.txt",GENERIC_READ,FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
Size := GetFileSize(hFile,nil);

// Определили длину массива, выделяем для него память:

ByteArr := AllocMem(Size+1); //+1 обеспечивает 0 в конце строки полезно для строковых переменных

ReadFile(hFile,ByteArr^,Size,Read,nil);
CloseHandle(hFile);

Memo1.Text := String(ByteArr);
FreeMem(ByteArr, Size+1);
end;

procedure TMainForm.Button2Click(Sender: TObject);
var ByteArr: PByteArray;
AFile: File;
Size: Cardinal;
begin
AssignFile(AFile, "F:\some.txt");
Reset(AFile, 1);
Size := FileSize(AFile);
ByteArr := AllocMem(Size+1);
BlockRead(AFile,ByteArr^,Size);
CloseFile(AFile);
Memo1.Text := String(ByteArr);
FreeMem(ByteArr, Size+1);
end;


 
GIL ©   (2003-03-04 08:24) [14]

Спасибо!! оба примера работают. А Readln не подходит т.к. файл может быть большого объема (средний объем ~ 760Кб), а может достигать и 10Мб - получается, что очень долго обрабатывается. А TStringList просто в голову не приходил, и потом это вызывать процедуру - доп. память нужна, а у меня приложение и так до нее очень охоче.


 
nikto   (2003-03-04 08:30) [15]

В самом деле, FileStream не противопоказан, и даже показан



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

Текущий архив: 2003.03.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
1-39302
Term
2003-03-04 09:38
2003.03.13
Серверы Автоматизации..........


1-39374
VD601
2003-03-02 20:39
2003.03.13
Эмуляция Win98 при компиляции.


14-39471
Шишкин Илья
2003-02-27 10:13
2003.03.13
Что означает слово IMHO?


14-39481
}{enon
2003-02-27 14:51
2003.03.13
Вопрос по массивам.


14-39489
line
2003-02-23 09:01
2003.03.13
Изменение записей в таблице