Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
ВнизДинамические массивы и 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.008 c