Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.59 MB
Время: 0.043 c
1-39331
Артём
2003-03-01 01:00
2003.03.13
DLL


14-39582
IM
2003-02-26 19:24
2003.03.13
Проблемы с оладчиком (Delphi5)


14-39463
Colt
2003-02-25 09:32
2003.03.13
Оптимальный инсталятор


3-39179
mib431
2003-02-20 23:31
2003.03.13
Что я не так делаю с ODBC?


14-39554
Dunkan
2003-02-26 11:19
2003.03.13
нажатие нескольких клавиш...





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