AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

C-dll Speicheradressen

Ein Thema von Johannes G. · begonnen am 31. Okt 2017 · letzter Beitrag vom 6. Nov 2017
 
Johannes G.

Registriert seit: 23. Aug 2017
Ort: Lustenau
16 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#11

AW: C-dll Speicheradressen

  Alt 3. Nov 2017, 10:38
Ich habe noch eine Frage zu den Pointern. Das mit dem Pointer auf Array funktioniert alles bestens.
Doch wenn sich die Funktion ein einer Klasse befindet, zeigt der übergebene Pointer nicht mehr auf das definierte Array (sondern irgendwo hin).

Warum ist das so?? Was kann ich dagegen unternehmen??

Hier mein kleines Testprogramm:
Delphi-Quellcode:
unit newt;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;


 type

  PTArray = ^Tarray; //Pointer auf Tarray
  Tarray = array[0..1] of double;

  PTArray2 = ^Tarray2;
  Tarray2 = array[0..1] of double;

     
  Tnewt = function (n: integer; var x: Tarray; f : Pointer; jaco:Pointer;
  kmax,prim : integer; pfile:Pchar; var fval: Tarray2; var anziter: Pinteger;
  eps: double ): integer; cdecl;


   TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);

  private

    function f(x: PTarray; y: PTarray2) : integer; cdecl;
  
    function dnewt(n: integer; var x: Tarray; f : Pointer; jaco:Pointer;
    kmax,prim : integer; pfile:Pchar; var fval: Tarray2; var anziter: Pinteger;
    eps: double): integer; cdecl;
     
  public

  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

//hier zeigt x nicht auf das Array Tarray!!!!!! Selbes gilt für y

function TForm1.f( x: PTarray; y: PTarray2): integer; cdecl;
 begin

      y[0] := x[0]*x[0]/4 + x[1]*x[1]/5 + x[0] - 0.5;
      y[1] := x[0]*x[0]/4 + x[1]*x[1]/2 + x[1] - 0.5;
      result := 0;
 end;


//Funktion Newton-Iteration:
function TForm1.dnewt(n: integer; var x: Tarray; f : Pointer; jaco:Pointer;
  kmax,prim : integer; pfile:Pchar; var fval: Tarray2; var anziter: Pinteger;
  eps: double): integer; cdecl;

var
  Newton: Tnewt;
  Handle:THandle;

begin
  Handle:=LoadLibrary('C:\Delphi-Testprogramme\CNum.dll');

  if Handle <> 0 then begin
    @Newton:= GetProcAddress(Handle, 'newt');
    if @Newton <> nil then begin
      result := newton(n,x,f,jaco,kmax,prim,pfile,fval,anziter,eps);
    end;
    FreeLibrary(Handle);
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
x : Tarray;
fval: Tarray2;
Fehler: integer;
anz: Pinteger;

begin

//Wert zuweisen
x[0] := 0.5;
x[1] := 0.5;

//Funktionsaufruf (lösen des Glsys in der Funktion f)
Fehler:= dnewt(2,x,@TForm1.f,nil,4,0,Nil,fval,anz,1E-8);

end;

end.

Bin wirklich um jeden Hinweis dankbar!

Gruß Johannes
  Mit Zitat antworten Zitat
 

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz