На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Проблемы c ДЛЛ и масивами
    ПОмогите кто сталкивался!!!
    Проблема заключается в том что в ДЛЛ нужно передать масив (двухмерный) не определенного размера.
    А из ДЛЛ нужно получить масив (одномерный) тоже не определенного размера.
    Размер по ходу меньше 100 поетому я в проге и в ДЛЛ создал два типа
    mas=array[0..100,0..100] of real;
    arra=array[0..100] of real ;
    ДЛЛ вызываю динамически но оно чет не хочет пахать там где должна вызыватся функция из ДЛЛ произходит ошыбка.
    Вот фрагменты кода:
    ПРограммы:
    ExpandedWrap disabled
      procedure TfMain.btnVidClick(Sender: TObject);
      var i: integer;
          vid:arra;
      begin
          @vidhul:= nil;
        hLib:= LoadLibrary('5_DLL');
        if hLib < 32 then
        begin
          ShowMessage('Dll не загружено!');
          Exit;
        end;
        if chbAutoClear.Checked then mmRes.Lines.Clear;
      mmRes.Lines.Add('отклоннения среднего столбца : ');
        vid:=vidhul(ar,sgres.ColCount,sgres.rowcount);
        for i:=1 to sgres.ColCount-2 do
      mmRes.Lines.Add(floattostr(vid[i]));
          FreeLibrary(hLib);
        end;


    ДЛЛ:
    ExpandedWrap disabled
      function Vidhul(ar:mas;Cl,Rw: integer):arra; export; stdcall;
       var count,i,j:integer;
       ser:real;
      begin
        count:=0;
        ser:=0;
        for i := 0 to CL-2 do
         for j := 0 to Rw-2 do
          begin
           ser:=ser+ar[i,j];
           inc(count);
          end;
         ser:=ser/count;
         for i := 0 to Cl-2 do
        result[i]:=(ser-abs(ar[i,trunc((Cl)/2)]));
      end;


    я уже 10 раз проверял все кажись правильно но выкидает ошыбку пишет:
    Project 5.exe raised exception class EAccessViolation with message 'Access violation at address 00000000. Read of address 00000000'. Process stopped. Use step to Run continiue

    Пишу на Делфи 6
    Сообщение отредактировано: LiteLime -
      ExpandedWrap disabled
        library Project1;
         
        {$R *.res}
         
        uses
          Types;
         
        type
          PSingleDynArray = ^TSingleDynArray;
          TSingleDynArray = array of Real;
          TDoubleDynArray = array of array of Real;
         
        function Test(const InValue: TDoubleDynArray;
          const ArrayLength: TSize; var OutValue: TSingleDynArray): Boolean; stdcall;
        var
          Count, X, Y: Integer;
          Ser: Real;
          AOutValue: TSingleDynArray;
        begin
          Result := True;
          try
            Count := 0;
            Ser := 0;
            for X := 0 to ArrayLength.cx - 2 do
              for Y := 0 to ArrayLength.cy - 2 do
              begin
                Ser := Ser + InValue[X, Y];
                Inc(Count);
              end;
             Ser := Ser / Count;
             for X := 0 to ArrayLength.cx - 2 do
               OutValue[X]:=(Ser - Abs(InValue[X, Trunc(ArrayLength.cx / 2)]));
           except
             Result := False;
           end;
        end;
         
        exports
          Test;
         
        begin
        end.


      ExpandedWrap disabled
        unit Unit1;
         
        interface
         
        uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls;
         
        type
          TForm1 = class(TForm)
            Button1: TButton;
            procedure Button1Click(Sender: TObject);
          end;
         
        var
          Form1: TForm1;
         
        implementation
         
        type
          PSingleDynArray = ^TSingleDynArray;
          TSingleDynArray = array of Real;
          TDoubleDynArray = array of array of Real;
         
          function Test(const InValue: TDoubleDynArray;
            const ArrayLength: TSize; var OutValue: TSingleDynArray): Boolean; stdcall; external 'project1.dll';
         
        {$R *.dfm}
         
        procedure TForm1.Button1Click(Sender: TObject);
        var
          X, Y: Integer;
          InArray: TDoubleDynArray;
          InSize: TSize;
          OutArray: TSingleDynArray;
        begin
          Randomize;
          InSize.cx := 20;
          InSize.cy := 20;
          SetLength(InArray, InSize.cx, InSize.cy);
          for X := 0 to InSize.cx - 1 do
            for Y := 0 to InSize.cy - 1 do
              InArray[X, Y] := Random(100);
          SetLength(OutArray, InSize.cx);
          if Test(InArray, InSize, OutArray) then
            // тут работаем с массивом
        end;
         
        end.
        Спасибо так рабтоет.
        Но есть еще вопрос: а можно зделать так как я делал, чтобы ДЛЛ загружалось динамически по надобности.
          Угу, LoadLibrary + GetProcAddress
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0221 ]   [ 15 queries used ]   [ Generated: 17.05.24, 16:24 GMT ]