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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.103 c
2-1330408314
AV
2012-02-28 09:51
2013.03.22
Владение критической секцией


2-1329850454
Аццкий
2012-02-21 22:54
2013.03.22
вопрос про чар


15-1343200140
boriskb
2012-07-25 11:09
2013.03.22
Программисты становятся дефицитом


3-1277448717
pavel_guzhanov
2010-06-25 10:51
2013.03.22
Можно ли сравнить два набора данных?


15-1341211017
KilkennyCat
2012-07-02 10:36
2013.03.22
Понедельничная задачка :)