Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизAccess Violation on AssignFile(fp, file_name) Найти похожие ветки
← →
LDV (2012-02-28 00:43) [0]Доброго времени суток.
почему, когда передаю в качестве параметра 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;
← →
LDV (2012-02-28 00:46) [1]аналогично:
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;
← →
Забаненный (2012-02-28 03:17) [2]
> 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);
и забавно - бинарники чарами...
← →
sniknik © (2012-02-28 07:54) [3]> и забавно - бинарники чарами...
"переведено" с С, и как видно не корректно, char в дельфи и в С разные типы. там это чистый "байт", а то и shortint, а "чистый" это unsigned char... ну что то типа.
← →
sniknik © (2012-02-28 08:00) [4]> почему, ...
это кара небесная за то что в дельфи на С пытаешься писать... пиши на дельфи и наступит счастье...
всю эту лабуду из [0] в дельфи делают парой тройкой строк с TFileStream.
← →
sniknik © (2012-02-28 08:14) [5]p.s. AV может возникать если ты где то выше переопределил PChar, и он лишился "магии дельфи"... (хотя не должно быть, там, в AssignFile вроде явный тип, должно привести правильно, даже массив... или тоже замена?).
неважно, попробуй так
load_file("D:\Test\Updater\Bin\Updater.exe"#0, @Len);
← →
CRLF (2012-02-28 09:11) [6]Что вообще за PShortIntArray? В исходном тексте char *.
А вообще не майся фигнёй, а используй TFileStream (возможно, вместе с TMemoryStream).
← →
sniknik © (2012-02-28 09:34) [7]> Что вообще за PShortIntArray? В исходном тексте char *.
вообще, именно здесь правильный "перевод" по типам.
← →
CRLF (2012-02-28 09:51) [8]"Правильный" = "такой, как нужно автору"? Возможно. Хотя ещё вопрос, как именно определён тип PShortIntArray.
← →
sniknik © (2012-02-28 09:54) [9]нет, правильный по тому, что означает тип в С и делфи. см. [3]
← →
CRLF (2012-02-28 10:04) [10]Да, перепутал ShortInt и SmallInt.
Но ведь в Delphi (по крайней мере, XE и XE2) нет встроенного типа PShortIntArray? Или я куда-то не туда смотрю?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.06 c