Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.12.2012, 20:28
juraman1 juraman1 вне форума
Прохожий
 
Регистрация: 05.12.2012
Сообщения: 6
Репутация: 10
Восклицание Помогите Срочно! Ошибка доступа к памяти

Ребята помогите в таком вопросе, это фрагмент кода моего приложения, он отвечает за поиск в вбраном каталоге (TreeView1) файлов и подсчета контрольных сумм. Внимание вопрос, после работы с этой кнопкой (procedure TRGZ.Button1Click(Sender: TObject) последующее событие выдает ошибку Acces violation, ошибка доступа к участку памяти и указывается адресс. Полагаю я не правильно обеспечил работу с файлами, буду благодарен любой подсказке.

Код:
procedure TRGZ.Button1Click(Sender: TObject);
var
 sR: TSearchRec;
 sPath: string;
 s:string;
 f:longint;
 h,cs:DWORD;
begin
Memo1.lines.add('___________________________________________');
//Определение пути каталога
sPath:= '';
  if TreeView1.Selected=nil then
    Memo1.Lines.Add('Ошика! Вы не выбрали каталог!')
  else begin                                             //begin
  while TreeView1.Selected <> nil do
  begin
    sPath:= TreeView1.Selected.Text +'\'+sPath;
    TreeView1.Selected:= TreeView1.Selected.Parent;
  end;
  Delete(sPath, length(sPath), 1);


//Подсчет контрольных сумм
  if FindFirst(sPath+'\*.*', faAnyFile - faDirectory - faVolumeID, sR) = 0 then
  begin
    Memo1.Lines.Add('Найдены файлы со следующими суммами:'); i:=0;
    repeat
      f:=fileopen(sR.Name,fmOpenRead);   sA[i]:=sPath+'\'+sR.Name;
      SetLength(s,sR.Size);
      FileRead(f,s[1],length(s));
      fileclose(f);
      CheckSumMappedFile(@s[1],length(s),@h,@cs); iB[i]:=cs;  //Главная функция- изучи ее
      Memo1.Lines.Add(sA[i]+': '+IntToStr(cs)+';');
      inc(i);
    until FindNext(sR) <> 0;
  FindClose(sR);
  end
  else Memo1.Lines.Add('Файлов не найдено!');
  end;    //end
Memo1.lines.add('___________________________________________');
end;
Ответить с цитированием
  #2  
Старый 05.12.2012, 20:37
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от juraman1
Внимание вопрос, после работы с этой кнопкой (procedure TRGZ.Button1Click(Sender: TObject) последующее событие выдает ошибку Acces violation, ошибка доступа к участку памяти и указывается адресс.
Смотрел что находится по этому "адрессу"?
Что такое (как объявлено) sA ?
Цитата:
Сообщение от juraman1
Код:
.....
      CheckSumMappedFile(@s[1],length(s),@h,@cs); iB[i]:=cs;  //Главная функция- изучи ее
.....
Ты изучил эту функцию?
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
juraman1 (06.12.2012)
  #3  
Старый 05.12.2012, 20:41
juraman1 juraman1 вне форума
Прохожий
 
Регистрация: 05.12.2012
Сообщения: 6
Репутация: 10
Восклицание

sA- глобальный массив

Код:
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  RGZ: TRGZ;
  sA: array [1..1000] of string;
  iB: array [1..1000] of DWORD;
   i: integer;
implementation

функцию изучил)
Ответить с цитированием
  #4  
Старый 06.12.2012, 00:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от juraman1
sA- глобальный массив

Код:
.....
var
  RGZ: TRGZ;
  sA: array [1..1000] of string;
  iB: array [1..1000] of DWORD;
   i: integer;
implementation
Прекрасно... Значит элементы массива sA могут индексироваться от 1 до 1000? Теперь посмотрим на твой код выше:
Код:
    Memo1.Lines.Add('Найдены файлы со следующими суммами:'); i:=0;
    repeat
      f:=fileopen(sR.Name,fmOpenRead);   sA[i]:=sPath+'\'+sR.Name;
Ты присваиваешь переменной i значение 0, и потом пытаешься присвоить значение элементу sA[i], а так как i=0 то получается пытаешься записать это значение в элемент sA[0], а разве элемент с индексом 0 допустим в этом массиве?
И почему переменная i глобальная?
И вообще где проверка, чтобы переменная i не "перевалила" за тыщу? Или ты "даёшь голову на отсечение", что ни в одном каталоге не может быть более 1000 файлов?
Цитата:
Сообщение от juraman1
функцию изучил)
Ну пока подозрение с этой функции снимается
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
juraman1 (06.12.2012)
  #5  
Старый 06.12.2012, 02:28
juraman1 juraman1 вне форума
Прохожий
 
Регистрация: 05.12.2012
Сообщения: 6
Репутация: 10
По умолчанию

во первых: спасибо большое! вы оказались правы!!)))
во вторых:переменная i глобальная чтобы знать сколько файлов было записано в массив, а вот массив от 1..1000 как раз потому, что вначале думал в 0-ой элемент длину записывать вместо глобальной i, а что то не получилось и вот исправить забыл
з.Ы. премного благодарен!!
Ответить с цитированием
  #6  
Старый 06.12.2012, 02:36
juraman1 juraman1 вне форума
Прохожий
 
Регистрация: 05.12.2012
Сообщения: 6
Репутация: 10
По умолчанию

а вот на счет проверки этой глобальной i я сознательно не парюсь, это ргз, которое мне нужно завтра (т.е. уже сегодня) будет сдать. так что мне нужно было быстро и эффективно сделать, уверен тут еще найдутся прорехи, но увы и ах как писал великий классик А.П.Чехов

а вам я очень благодарен, вы прям из безисходности спасли меня
Ответить с цитированием
  #7  
Старый 06.12.2012, 02:54
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от juraman1
так что мне нужно было быстро и эффективно сделать, уверен тут еще найдутся прорехи,
Из прорехов вот мне не понятно это место:
Код:
//Подсчет контрольных сумм
  if FindFirst(sPath+'\*.*', faAnyFile - faDirectory - faVolumeID, sR) = 0 then
.....
      f:=fileopen(sR.Name,fmOpenRead);   sA[i]:=sPath+'\'+sR.Name;
Т.е. файлы мы ищем в определённом каталоге sPath, но сам файл пытаемся открыть в текущем каталоге.
Скорее всего открывать найденный файл нужно тоже из того же каталога:
Код:
f:=fileopen(sPath+'\'+sR.Name,fmOpenRead);
Или же устанавливать каталог sPath как текущий: SetCurrentDir(sPath);
Цитата:
Сообщение от juraman1
но увы и ах как писал великий классик А.П.Чехов
А.П.Чехов мой любимый писатель - в детстве я перечитал практически всё что нашёл в библиотеке Рассказ "Идиллия — увы и ах!" тоже очень нравится, написан в специфичном чеховском стиле.
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
juraman1 (06.12.2012)
  #8  
Старый 06.12.2012, 11:26
juraman1 juraman1 вне форума
Прохожий
 
Регистрация: 05.12.2012
Сообщения: 6
Репутация: 10
По умолчанию

Код:
//Определение пути каталога
sPath:= ''; 
 if TreeView1.Selected=nil then   
 Memo1.Lines.Add('Ошика! Вы не выбрали каталог!')  
else begin                                            
while TreeView1.Selected <> nil do  
begin   
sPath:= TreeView1.Selected.Text +'\'+sPath;  
TreeView1.Selected:= TreeView1.Selected.Parent;  
end;  
Delete(sPath, length(sPath), 1);

вот в этом фрагменте уже сканится выбрана директория или нет, т.е если она selected, то мы "верстаем" в цикле путь к ней, а выбраная директория уже является директорией по умолчанию, вот как я думаю
Ответить с цитированием
  #9  
Старый 06.12.2012, 13:20
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от juraman1
Код:
//Определение пути каталога
sPath:= ''; 
 if TreeView1.Selected=nil then   
 Memo1.Lines.Add('Ошика! Вы не выбрали каталог!')  
else begin                                            
while TreeView1.Selected <> nil do  
begin   
sPath:= TreeView1.Selected.Text +'\'+sPath;  
TreeView1.Selected:= TreeView1.Selected.Parent;  
end;  
Delete(sPath, length(sPath), 1);

вот в этом фрагменте уже сканится выбрана директория или нет, т.е если она selected, то мы "верстаем" в цикле путь к ней, а выбраная директория уже является директорией по умолчанию, вот как я думаю
И как у тебя fileopen понимает, что нужно открыть файл не из текущей папки, а из папки путь к которой записан в какой-то там переменной sPath?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter