![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Access Violation on AssignFile(fp, file_name)
LDV © (2012-02-28 00:43:00)Доброго времени суток.
почему, когда передаю в качестве параметра file_name строку
load_file('D:\Test\Updater\Bin\Updater.exe', @Len);
возникает исключение Access Violation при выполненииAssignFile(fp, file_name)?
{ load file, returning pointer to file //
data, exits with error message if out //
of memory or not found } //
function load_file(file_name: PChar; //char* load_file(char* file_name,
size_ret: Psize_t): PShortIntArray; //..size_t* size_ret)
var //
fp: File of Char; //FILE* fp;
data: PShortIntArray; //char* data;
buffer: array[0..BUFFER_SIZE-1] of //char buffer[BUFFER_SIZE];
Char; //
len: size_t; //size_t len;
cur_len: size_t; //size_t cur_len;
tmp: PShortIntArray; //char* tmp = realloc(data, cur_len
//..+ len);
begin //{
// FILE* fp;
// char* data;
// char buffer[BUFFER_SIZE];
// size_t len;
// size_t cur_len;
{ open file } //
AssignFile(fp, file_name); // fp = fopen(file_name, "rb");
Reset(fp); //
if (IOResult <> 0) then // if(!fp) {
begin //
perror(file_name); //
Halt(1); // exit(1);
end; // }
//
{ read file } //
cur_len := 0; // cur_len = 0;
data := nil; // data = 0;
BlockRead(fp, buffer, BUFFER_SIZE, // while((len = fread(buffer, 1,
len); //.. BUFFER_SIZE, fp))) {
while (len > 0) do //
begin //
tmp := data; // char* tmp = realloc(data, cur_len
ReallocMem(tmp, cur_len + len); //.. + len);
if not Assigned(tmp) then // if(!tmp) {
begin //
WriteStrFmt(stderr, // fprintf(stderr,
'%s: Virtual memory exhausted' //.. "%s: Virtual memory exhausted
+ #13#10, [progname]); //.. \n", progname);
Halt(1); // exit(1);
end; // }
data := tmp; // data = tmp;
Move(buffer, data[cur_len], // memcpy(data + cur_len, buffer,
len); //.. len);
Inc(cur_len, len); // cur_len += len;
BlockRead(fp, buffer, BUFFER_SIZE, // }
len); //
end; //
if not EOF(fp) then // if(!feof(fp)) {
begin //
perror(file_name); // perror(file_name);
CloseFile(fp); // fclose(fp);
Halt(1); // exit(1);
end; // }
//
{ exit } //
CloseFile(fp); // fclose(fp);
if Assigned(size_ret) then // if(size_ret)
size_ret^ := cur_len; // *size_ret = cur_len;
Result := data; // return data;
end;
CRLF (2012-02-28 10:04:00) [1]Да, перепутал ShortInt и SmallInt.
Но ведь в Delphi (по крайней мере, XE и XE2) нет встроенного типа PShortIntArray? Или я куда-то не туда смотрю?
sniknik (2012-02-28 09:54:00) [2]нет, правильный по тому, что означает тип в С и делфи. см. [3]
CRLF (2012-02-28 09:51:00) [3]"Правильный" = "такой, как нужно автору"? Возможно. Хотя ещё вопрос, как именно определён тип PShortIntArray.
sniknik (2012-02-28 09:34:00) [4]> Что вообще за PShortIntArray? В исходном тексте char *.
вообще, именно здесь правильный "перевод" по типам.
CRLF (2012-02-28 09:11:00) [5]Что вообще за PShortIntArray? В исходном тексте char *.
А вообще не майся фигнёй, а используй TFileStream (возможно, вместе с TMemoryStream).
sniknik (2012-02-28 08:14:00) [6]p.s. AV может возникать если ты где то выше переопределил PChar, и он лишился "магии дельфи"... (хотя не должно быть, там, в AssignFile вроде явный тип, должно привести правильно, даже массив... или тоже замена?).
неважно, попробуй так
load_file('D:\Test\Updater\Bin\Updater.exe' #0, @Len);
sniknik (2012-02-28 08:00:00) [7]> почему, ...
это кара небесная за то что в дельфи на С пытаешься писать... пиши на дельфи и наступит счастье...
всю эту лабуду из [0] в дельфи делают парой тройкой строк с TFileStream.
sniknik (2012-02-28 07:54:00) [8]> и забавно - бинарники чарами...
"переведено" с С, и как видно не корректно, char в дельфи и в С разные типы. там это чистый "байт", а то и shortint, а "чистый" это unsigned char... ну что то типа.
Забаненный (2012-02-28 03:17:00) [9]
> LDV (28.02.12 00:46) [1]
>
> аналогично:
>
что аналогично? АV? Ну вот я тупо вставил этот код [1], у меня все хорошо.
Уверен в месте определения ошибки? AssignFilу пофиг даже наличие файла, и правильность имени. Например, у меня вполне работает
var
fp: File of Char;
file_name: PChar;
begin
file_name := '@!%@^&*:::&%&@@&$@!!>>';
AssignFile(fp, file_name);
и забавно - бинарники чарами...
LDV (2012-02-28 00:46:00) [10]аналогично:
procedure TForm1.FormCreate(Sender: TObject);
var
fp: File of Char;
file_name: PChar;
begin
file_name := 'C:\Program Files\Updater\bin\Updater.exe';
AssignFile(fp, file_name);
end;