Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2016, 16:12   #1
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
Восклицание Ошибка: access violation at address 03d6d615 in module 'Matrix.dll' read of address 00000000

при выборе пункта меню "Разность" все считает нормально, а при выборе "Сумма" и "Умножение" выдает ошибку , пробовал убрать вызов функцию и просто поставить код в нужное место все нормально считает , а при обращение через dll , нет ... при этом код button"сумма" и "Разность" идентичен и код функций в самом Matrix.dll ... не могу понять что не так ...
PHP код:
library Matrix;

uses
  System
.SysUtils,
  
System.Classes;

{
$R *.res}
type
  mat 
= array of array of real;

function 
Cymma(amatbmatstr,stolb integer):mat;stdcall;
var 
ccmat;
    
i,j:integer;
begin
  setlength
(cc,str,stolb);
  for 
i:=0 to str-do
    for 
j:=0 to stolb-do
      
cc[i,j]:=a[i,j]+b[i,j];
  
result:=cc;
  
finalize(cc);
end;

function 
Pa3HocTb(amatbmatstr,stolb integer):mat;stdcall;
var 
ccmat;
    
i,j:integer;
begin
  setlength
(cc,str,stolb);
  for 
i:=0 to str-do
    for 
j:=0 to stolb-do
      
cc[i,j]:=a[i,j]-b[i,j];
  
result:=cc;
  
finalize(cc);
end;

function 
YmHow(amatbmatstr1,str2,stolb1,stolb2 integer):mat;stdcall;
var 
ccmat;
    
i,j,k:integer;
begin
  setlength
(cc,str1,stolb2);
  for 
i:=0 to str1-do
    for 
j:=0 to stolb2-do
    
begin
      cc
[i,j]:=0;
      for 
k:=0 to str2-do
        
cc[i,j]:=cc[i,j] + a[i,k]*b[k,j];
    
end;
  
result:=cc;
  
finalize(cc);
end;

exports Cymma;
exports Pa3HocTb;
exports YmHow;

begin
end

Изображения
Тип файла: jpg Безымянный.jpg (48.8 Кб, 126 просмотров)
Oda. вне форума Ответить с цитированием
Старый 03.04.2016, 16:13   #2
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
По умолчанию

код самой программы
Код:

  mat= array of array of real;
var
  Form1: TForm1;
  str1,stolb1,str2,stolb2: integer;
  frag :byte;

implementation

{$R *.dfm}

procedure TForm1.But_CymClick(Sender: TObject);
var
    a,b,c: mat;
    i,j: integer;
    dHandle: THandle; //Хендл загруженной Dll
    Cymma :function (a: mat; b: mat; str,stolb : integer):mat;stdcall;
begin
  @Cymma:=nil;  //Cymma теперь не на какой участок памити не указывает
  dHandle:=LoadLibrary('Matrix.dll');  //Пытаемся загрузить Dll
  if dHandle<>0 then    //Если загрузили то
  begin
    //Найдем адрес нужной функции и присвоим его переменной Cymma
    @Cymma:=GetProcAddress(dHandle,'Cymma');
    if @Cymma<>nil then  //если мы нашли функции в Dll и получили её адрес то
    begin
      setlength(a,str1,stolb1); setlength(b,str1,stolb1); setlength(c,str1,stolb1);
      for I := 0 to str1-1 do
        for J := 0 to stolb1-1 do
        begin
          a[i,j]:=strtofloat(sg1.cells[j,i]);
          b[i,j]:=strtofloat(sg2.cells[j,i]);
        end;
      c:= Cymma(a,b,str1,stolb1);
      for I := 0 to str1-1 do
        for J := 0 to stolb1-1 do
          sg3.cells[j,i]:=floattostr(c[i,j]);
      finalize(a); finalize(b); finalize(c);
    end
    else        //если мы  не нашли функцию в Dll
      begin
        ShowMessage('Функция не найдена в Dll');
        Exit;
      end;
    FreeLibrary(dHandle);    //выгружаем Dll из памяти
  end
  else
    begin
      //если Dll не может быть загружена или не найдена
      ShowMessage('Библеотека не найдена');
      Exit;
 end;
end;

procedure TForm1.But_Pa3HClick(Sender: TObject);
var
    a,b,c: mat;
    i,j: integer;
    dHandle: THandle; //Хендл загруженной Dll
    Pa3HocTb :function (a: mat; b: mat; str,stolb : integer):mat;stdcall;
begin
  @Pa3HocTb:=nil;  
  dHandle:=LoadLibrary('Matrix.dll');  
  if dHandle<>0 then   
  begin
    @Pa3HocTb:=GetProcAddress(dHandle,'Pa3HocTb');
    if @Pa3HocTb<>nil then 
    begin
      setlength(a,str1,stolb1); setlength(b,str1,stolb1); setlength(c,str1,stolb1);
      for I := 0 to str1-1 do
        for J := 0 to stolb1-1 do
        begin
          a[i,j]:=strtofloat(sg1.cells[j,i]);
          b[i,j]:=strtofloat(sg2.cells[j,i]);
        end;
      c:= Pa3HocTb(a,b,str1,stolb1);
      for I := 0 to str1-1 do
        for J := 0 to stolb1-1 do
          sg3.cells[j,i]:=floattostr(c[i,j]);
      finalize(a); finalize(b); finalize(c);
    end
    else      
      begin
        ShowMessage('Функция не найдена в Dll');
        Exit;
      end;
    FreeLibrary(dHandle); 
  end
  else
    begin
      ShowMessage('Библеотека не найдена');
      Exit;
 end;
end;

procedure TForm1.But_ymHClick(Sender: TObject);
var
    a,b,c: mat;
    i,j: integer;
    dHandle: THandle; 
    YmHow :function (a: mat; b: mat; str1,str2,stolb1,stolb2 : integer):mat;stdcall;
begin
  @YmHow:=nil; 
  dHandle:=LoadLibrary('Matrix.dll'); 
  if dHandle<>0 then   
  begin
    @YmHow:=GetProcAddress(dHandle,'YmHow');
    if @YmHow<>nil then  //если мы нашли функции в Dll и получили её адрес то
    begin
      setlength(a,str1,stolb1); setlength(b,str2,stolb2); setlength(c,str1,stolb2);
      for I := 0 to str1-1 do
        for J := 0 to stolb1-1 do
          a[i,j]:=strtofloat(sg1.cells[j,i]);
      for I := 0 to str2-1 do
        for J := 0 to stolb2-1 do
          b[i,j]:=strtofloat(sg2.cells[j,i]);
      c:= YmHow(a,b,str1,str2,stolb1,stolb2);
      for I := 0 to str1-1 do
        for J := 0 to stolb2-1 do
          sg3.cells[j,i]:=floattostr(c[i,j]);
      finalize(a); finalize(b); finalize(c);
    end
    else 
      begin
        Application.MessageBox('Функция не найдена в Dll','Результат', MB_OK);
        Exit;
      end;
    FreeLibrary(dHandle);
  end
  else
    begin
      Application.MessageBox('Библеотека не найдена','Результат', MB_OK);
      Exit;
    end;
end;

procedure TForm1.delClick(Sender: TObject);
begin
  groupbox1.Visible:=true;
  groupbox2.Visible:=false;
  But_Pa3H.Visible:=true;
  But_Cym.Visible:=false;
  But_ymH.Visible:=false;
  frag:=1;
end;

procedure TForm1.Ed_stolb1Change(Sender: TObject);       // stolb A
begin
  case frag of
    0,1:
      begin
        stolb1:=strtoint(ed_stolb1.Text);
        sg1.ColCount:=stolb1;
        sg2.ColCount:=stolb1;
        sg3.ColCount:=stolb1;
      end;
    2:
      begin
        stolb1:=strtoint(ed_stolb1.Text);
        sg1.ColCount:=stolb1;
        sg2.RowCount:=stolb1;
        ed_str2.Text:=ed_stolb1.Text;
        str2:=stolb1;
      end;
  end;
end;

procedure TForm1.Ed_stolb2Change(Sender: TObject);   //stolb B
begin
  stolb2:=strtoint(ed_stolb2.Text);
  sg2.ColCount:=stolb2;
  sg3.ColCount:=stolb2;
end;

procedure TForm1.Ed_str1Change(Sender: TObject);   //stroku A
begin
  case frag of
    0,1:
      begin
        str1:=strtoint(ed_str1.Text);
        sg1.RowCount:=str1;
        sg2.RowCount:=str1;
        sg3.RowCount:=str1;
      end;
    2:
      begin
        str1:=strtoint(ed_str1.Text);
        sg1.RowCount:=str1;
        sg3.RowCount:=str1;
      end;
  end;
end;

procedure TForm1.Ed_str1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9',#8:;
  else Key:= #0;
  end;
end;

procedure TForm1.Ed_str2Change(Sender: TObject);     //stroku B
begin
  str2:=strtoint(ed_str2.Text);
  sg2.RowCount:=str2;
  sg1.ColCount:=str2;
  ed_stolb1.Text:=ed_str2.Text;
  stolb1:=str2;
end;

procedure TForm1.sg1KeyPress(Sender: TObject; var Key: Char);
begin
  case Key of
    '0'..'9',#8:;
    ',','.' :
    begin // DicimalSeparator - гробальная переменная
        // в которой находится символ "десятичный разделитель"
      Key:= formatsettings.DecimalSeparator;
      if pos(formatsettings.DecimalSeparator,(Sender as Tstringgrid).Cells[(Sender as Tstringgrid).Col,(Sender as Tstringgrid).Row]) <> 0
        then Key:= #0;
    end;
    '-': if length((Sender as Tstringgrid).Cells[(Sender as Tstringgrid).Col,(Sender as Tstringgrid).Row])<>0 then Key:=#0;
    //так называемое "безопасное приведение типов", т.е. производится проверка: Sender - это на самом деле TEdit?
    // и если нет, возбуждается исключение EInvalidCast
  else Key:= #0;
  end;
end;

procedure TForm1.sumClick(Sender: TObject);
begin
  groupbox1.Visible:=true;
  groupbox2.Visible:=false;
  But_Pa3H.Visible:=false;
  But_Cym.Visible:=true;
  But_ymH.Visible:=false;
  frag:=0;
end;

procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType);    //строки А
begin
   ed_str1.Text:=inttostr(UpDown1.Position);
end;

procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType);   //столбцы A
begin
  case frag of
    0,1:
      begin
        ed_stolb1.Text:=inttostr(UpDown2.Position);
      end;
    2:
      begin
        ed_str2.Text:=inttostr(UpDown2.Position);
        ed_stolb1.Text:=inttostr(UpDown2.Position);
      end;
  end;
end;

procedure TForm1.UpDown3Click(Sender: TObject; Button: TUDBtnType);   //строки В
begin
  ed_stolb1.Text:=inttostr(UpDown3.Position); // цифры отображаются при переключении
  ed_str2.Text:=inttostr(UpDown3.Position);
end;

procedure TForm1.UpDown4Click(Sender: TObject; Button: TUDBtnType);  //столбцы В
begin
  ed_stolb2.Text:=inttostr(UpDown4.Position);
end;

procedure TForm1.ymHClick(Sender: TObject);
begin
  groupbox1.Visible:=true;
  groupbox2.Visible:=true;
  But_Pa3H.Visible:=false;
  But_Cym.Visible:=false;
  But_ymH.Visible:=true;
  frag:=2;
end;

end.
Oda. вне форума Ответить с цитированием
Старый 03.04.2016, 19:19   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

http://programmersforum.ru/showpost....34&postcount=4
поставьте отмеченное красным и попробуйте ЕЩЕ раз выполнить вычитание (можно даже с переносом кода в программу).
Цитата:
при выборе пункта меню "Разность" все считает нормально, а при выборе "Сумма" и "Умножение" выдает ошибку
Цитата:
и просто поставить код в нужное место
Цитата:
Код:
  result:=cc;
  finalize(cc);
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.04.2016 в 19:23.
evg_m вне форума Ответить с цитированием
Старый 03.04.2016, 19:57   #4
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
По умолчанию

Благодарю , за ответ, поставил галочку, но все по прежнему
Oda. вне форума Ответить с цитированием
Старый 04.04.2016, 07:17   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

передавать динамические данные между exe и dll - очень плохая идея.
как звучит задание в оригинале?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 04.04.2016, 14:27   #6
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
По умолчанию

В соответствии с указанным набором вариантов написать программу, пользующуюся ресурсами и функциями из DLL. Главное окно программы должно быть снабжено меню и собственным нестандартным значком. В одном из окон программы должен использоваться нестандартный курсор
мыши. Выход из программы предусмотреть при помощи соответствующего пункта меню. "Сложение , умножение матриц и обратная матрицы"
Oda. вне форума Ответить с цитированием
Старый 04.04.2016, 15:10   #7
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
По умолчанию

Работаю В delphi XE3 ... почитал , почитал на форумах ... о проблеме "передавать динамические данные между exe и dll " , советуют использовать библиотеки ShareMem или FastShareMem , при попытке подключения библиотеки FastShareMem - не распознает, а ShareMem - при запуске программы выдает ошибку "запуск программы невозможен, так как на компьютере отсутствует borlndmm.dll. Попробуйте переустановить программу ." сомневаюсь что переустановка поможет ... может стоит перейти на delphi 7 или выше ?
Oda. вне форума Ответить с цитированием
Старый 04.04.2016, 15:37   #8
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
По умолчанию

В общем ... не знаю , что произошло и как ... начал сегодня запускать , он перестал находить адрес dll , хотя ничего не менял и dll на том же месте , удалил его пересоздал , опять тоже сообщение "библиотека не найдена" дабавил в стороку вместо "Matrix.dll"
Код:
dHandle:=LoadLibrary('Matrix.dll');
полный путь к файлу ... удалил в dll сначала в функции Cymma выделение памяти на массив , умножение и разность не трогал ,запустил и все заработало ... не понимаю ... потом уже во всех функциях отредактировал ... "на всяких случай" , как я понял так нельзя или не правильно... в общем я не понял почему она заработала
PHP код:
function Cymma(amatbmat;matstr,stolb integer):mat;stdcall;
var
    
i,j:integer;
begin
  
for i:=0 to str-do
    for 
j:=0 to stolb-do
      
c[i,j]:=a[i,j]+b[i,j];
  
result:=c;
end;

function 
Pa3HocTb(amatbmat;matstr,stolb integer):mat;stdcall;
var
    
i,j:integer;
begin
  
for i:=0 to str-do
    for 
j:=0 to stolb-do
      
c[i,j]:=a[i,j]-b[i,j];
  
result:=c;
end;

function 
YmHow(amatbmat;matstr1,str2,stolb1,stolb2 integer):mat;stdcall;
var
    
i,j,k:integer;
begin
  
for i:=0 to str1-do
    for 
j:=0 to stolb2-do
    
begin
      c
[i,j]:=0;
      for 
k:=0 to str2-do
        
c[i,j]:=c[i,j] + a[i,k]*b[k,j];
    
end;
  
result:=c;
end
Oda. вне форума Ответить с цитированием
Старый 04.04.2016, 15:39   #9
Oda.
 
Регистрация: 03.04.2016
Сообщений: 8
По умолчанию

я конечно рад что заработало , но боюсь может быть и такое " бог дал -бог взял" ... надеюсь такого не будет
Oda. вне форума Ответить с цитированием
Старый 04.04.2016, 15:55   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

перестань немедленно!
не передавай динмассивы, это чревато мерцающими ошибками.
работай только с указателями!

Кто не спрятался - я не виноват!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Arktos1995 Общие вопросы Delphi 5 12.12.2012 22:33
Ошибка: "Access violation at address 0045E503 in module 'Project1.exe'. Read of address 00316777. Katexxxsa Общие вопросы Delphi 1 03.10.2011 23:16
Ошибка "Access violation at address 004043A8 in module 'Project1.exe'. Read of address 00FF5A53." ms.Karishka Общие вопросы Delphi 6 14.04.2011 22:18
Access violation at address 00478D0E in module 'Project1.exe'. Write of address 00000000 fondreykus-1 Общие вопросы Delphi 5 27.01.2010 14:25
Ошибка: "Access violation at address 00454F01 in module 'Project1.exe'. Read of address 00000000. Fen1x Общие вопросы Delphi 8 13.10.2007 20:13