Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с передачей массива в ф-цию 
:(
    Опции темы
dimych83
Дата 12.2.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 21.3.2007
Где: Красноярск

Репутация: нет
Всего: нет



Добрый день!
Помогите пожалуйста... есть след. код:

Код

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
Модератор: используйте подсветку кода!


Это сообщение отредактировал(а) Alexeis - 12.2.2008, 10:21
PM MAIL ICQ   Вверх
Qu1nt
Дата 12.2.2008, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Один из вариантов:
Код

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

Т.е. убрать var.
PM MAIL   Вверх
dimych83
Дата 12.2.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 21.3.2007
Где: Красноярск

Репутация: нет
Всего: нет



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

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

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

Спасибо... не заметил smile
PM MAIL ICQ   Вверх
dimych83
Дата 12.2.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 81
Регистрация: 21.3.2007
Где: Красноярск

Репутация: нет
Всего: нет



Еще проблемка появилась 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. Подскажите пожалуйста в чем проблема может быть?

Это сообщение отредактировал(а) dimych83 - 12.2.2008, 12:34
PM MAIL ICQ   Вверх
THandle
Дата 12.2.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 50
Всего: 372



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


переменная i всегда равна 1? Хотя я могу быть не прав, нет возможности проверить.
PM   Вверх
Qu1nt
Дата 12.2.2008, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



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

  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 

Это сообщение отредактировал(а) Qu1nt - 12.2.2008, 17:14
PM MAIL   Вверх
MetalFan
Дата 12.2.2008, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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

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


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Qu1nt
Дата 12.2.2008, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



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

Первоначально так и задумывалось. Излишки производства)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.