Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Проблема с передачей массива в ф-цию


Автор: dimych83 12.2.2008, 10:02
Добрый день!
Помогите пожалуйста... есть след. код:

Код

type
  TFileArray = array of string;

var
  LogFiles: TFileArray;

function GetLogFile (var Mask, Path: string; var FileArray: TFileArray): integer;
var
  LogFile: TSearchRec;
  FullPath: string;
  i: integer;
begin

  i := 1;

  FullPath := Path + Mask; //формируем полную маску поиска

  if DirectoryExists(Path) then //если путь существует
    if FindFirst(FullPath,faAnyFile,LogFile)=0 then  //каждый подходящий файл
    begin                                          //заносим в массив
      FileArray[i] := LogFile.Name;
      while FindNext(LogFile) = 0 do
      begin
        inc(i);
        FileArray[i] := LogFile.Name;
      end;
    end;

  Result := i; //возвращаем кол-во файлов

end;

procedure TFMain.BitBtn1Click(Sender: TObject);
begin
  SetLength(LogFiles,5);
  LogFileCount := GetLogFile(edMask.Text,edPath.Text,LogFiles); //ЗДЕСЬ ОШИБКА!
  if LogFileCount > 0 then
    for i:=Low(LogFile) to High(LogFile) do
      ListBox1.Items.Add(LogFile(i))
end;


Есть ф-ция которая должна заполнять указанный массив именами файлов и возвращать их кол-во. Но при вызове ф-ции возникает ошибка (указано в комментариях), что не совпадают типы переменных. Но по идеи-то в ф-ции описано что должен передаваться массив и фактически передается массив, в чем проблема?


M
Alexeis
Модератор: используйте подсветку кода!

Автор: Qu1nt 12.2.2008, 10:18
Один из вариантов:
Код

function GetLogFile(Mask, Path: string; var FileArray: TFileArray): Integer;

Т.е. убрать var.

Автор: dimych83 12.2.2008, 10:29
Цитата(Qu1nt @ 12.2.2008,  10:18)
Один из вариантов:
Код

function GetLogFile(Mask, Path: string; var FileArray: TFileArray): Integer;

Т.е. убрать var.

Спасибо... не заметил smile

Автор: dimych83 12.2.2008, 12:33
Еще проблемка появилась smile

Код


type
  TFileArray = array of string;

var
  LogFiles: TFileArray; //массив с именами файлов

function GetLogFile (Mask, Path: string; FileArray: TFileArray): integer;
var
  LogFile: TSearchRec;
  FullPath: string;
  i: integer;
begin

  i := 1;

  FullPath := Path + '\' + Mask; //формируем полную маску поиска

  if DirectoryExists(Path) then //если путь существует
    if FindFirst(FullPath,faAnyFile,LogFile)=0 then  //каждый подходящий файл
    begin
      SetLength(FileArray,i+1);             //заносим в массив, соответственно
      FileArray[i] := LogFile.Name;      //увеличивая размер массива
      while FindNext(LogFile) = 0 do
      begin
        inc(i);
        SetLength(FileArray,i+1);                              //заносим в массив
        FileArray[i] := LogFile.Name;
      end;
    end;

  Result := i; //возвращаем кол-во файлов

end;

function ExtractFile(Name: string): boolean;
var
  IP_ADR: string;
  buf: string[255];
  Log_File: TextFile;
  data: string;
  url: string;
  size: integer;
begin

  Assign(Log_File,Name);
  try
    Reset(Log_File);     //открываем файл, если не открывается - выдаем ошибку
  except
    MessageDlg('Ошибка открытия файла '+Name,mtError,[mbOk],0);
    Result := false;
    Exit;
  end;

  while not EOF(Log_File) do
  begin
    Readln(Log_File,buf);
    IP_ADR := CopyColumn(buf,' ',1);
    data := CopyColumn(buf,' ',4);
    url := CopyColumn(buf,' ',7);
    size := StrToInt(CopyColumn(buf,' ',10));
    FMain.Memo1.Lines.Add(IP_ADR+' '+data+' '+url+' '+IntToStr(size));
  end;

  Result := true;

end;

procedure TFMain.BitBtn1Click(Sender: TObject);
var
  i: integer;
begin

  i := 1;

  LogFileCount := GetLogFile(edMask.Text,edPath.Text,LogFiles);
  if LogFileCount = 0 then //если файлов не найдено - выдаем ошибку, выходим из процедуры
  begin
    MessageDlg('Лог-файлов не найдено!',mtError,[mbOk],0);
    Exit;
  end;

  while i < LogFileCount do
    ExtractFile(LogFiles[i]); //ошибка

end;



Вызывается ф-ция GetLogFile которая заполняет массив LogFiles именами файлов и возвращает кол-во файлов. Далее, для каждого файла из массива вызывается ф-ция ExtractFile, но там вываливается ошибка AccessViolation. Подскажите пожалуйста в чем проблема может быть?

Автор: THandle 12.2.2008, 13:46
dimych83, может быть потому что в цикле
   
Цитата(dimych83 @  12.2.2008,  12:33 Найти цитируемый пост)
  while i < LogFileCount do
    ExtractFile(LogFiles[i]); //ошибка


переменная i всегда равна 1? Хотя я могу быть не прав, нет возможности проверить.

Автор: Qu1nt 12.2.2008, 17:13
Гхм.
Во-первых:
Зачем использовать
Код

  TFileArray = array of string;

Будем пользоваться, например, TStringList.
Во-вторых:
Твоя функция GetLogFile - содержит много ошибок. Например, она никогда не вернет 0.
Заменим ее на более логичную процедуру:
Код

procedure GetLogFile(Mask, Path: string; var FileArray: TStringList);
var
  SearchRec : TSearchRec;
begin
  if FindFirst(Path + '\' + Mask, faAnyFile, SearchRec) = 0 then
    repeat
      FileArray.Add(SearchRec.Name);
    until
      FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;

В-третьих:
Функция ExtractFile - написана не лучше, предыдущей smile. В общем, RTFM!
Будем использовать такую:
Код

procedure ExtractFile(FileName: string);
var
  f : TextFile;
  s : string;
begin
  AssignFile(f, FileName);
  Reset(f);
  while not eof(f) do
  begin
    ReadLn(f, s);
    // тут некие манипуляции со строкой
    Form1.Memo1.Lines.Add(s);
  end;
  CloseFile(f);
end;

Наконец, перепишем BitBtn1Click:
Код

var
  LogFiles : TStringList;
  i        : Integer;
begin
  LogFiles := TStringList.Create;
  GetLogFile(edMask.Text, edPath.Text, LogFiles);
  if LogFiles.Count = 0 then
    MessageDlg('Лог-файлов не найдено!', mtError, [mbOk], 0)
  else
    for i := 0 to LogFiles.Count - 1 do
      ExtractFile(LogFiles[i]);
  LogFiles.Free;

Фухх, вроде все. smile 

Автор: MetalFan 12.2.2008, 23:29
Цитата(Qu1nt @  12.2.2008,  17:13 Найти цитируемый пост)
procedure GetLogFile(Mask, Path: string; var FileArray: TStringList);

а смысл тогда в var, если внутри функции список не создается?

Автор: Qu1nt 12.2.2008, 23:39
Цитата(MetalFan @  12.2.2008,  22:29 Найти цитируемый пост)
а смысл тогда в var, если внутри функции список не создается? 

Первоначально так и задумывалось. Излишки производства)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)