Seite 1 von 2

Array Pointer

Verfasst: 08.10.2006 15:02
von mknjc
Hallo,

Ich möchte für ein Programm eine DLL schreiben.
Das Problem ist das das Programm mir zwei Pointer auf Arrays gibt und ich aus dem einen lesen muss und ins andere schreiben muss.

Aber ich hab keine Ahnung von Arrays.

Würd mich auf Hilfe freuen.

Mfg mknjc

Verfasst: 08.10.2006 15:28
von Kaeru Gaman
afaik übergibt ein arrayname mit klammern ohne indices den pointer auf den array-beginn:

Code: Alles auswählen

MyProc( a(), b() )
...oder braucht das noch * odern @?
bitte mit faulen lebensmitteln werfen, falls ich hier grad mist erzähle....

Verfasst: 08.10.2006 15:37
von #NULL
du kannst das prinzipell auch alles ohne arrays machen, is aber nich so sinnvoll.
wie ist den der typ und die anzahl der dimensionen?

Verfasst: 08.10.2006 15:37
von edel
Ich hab hier Tomaten und Eier , was magste lieber ? :D

Das waere eine Liste, fuer ein Array fehlt noch die Dimensionsanzahl.

also eher so :

Code: Alles auswählen


dim Array(10)
dim Array2(10,10)

Procedure Test(Array(1),Array2(2))
endprocedure

Verfasst: 08.10.2006 15:40
von Kaeru Gaman
@edel

hm....

die Dimensionsanzahl?
und wie unterscheidet PB dann, ob ich den Pointer aufs Array oder das x-te element übergeben will?

[edit]
argl

ok, wenn ichn element übergeben will, hab ich in der proc-kopfzeile ein

Code: Alles auswählen

Procedure Test( Bla1.l, Bla2.l)
...also muss ich das nich kennzeichnen?

Verfasst: 08.10.2006 15:40
von #NULL
mknjc ist sichersich eher in den 'empfang' interessiert, bzw die verarbeitung in der proc/dll. die übergabe wird wahrscheinlich von anderso geregelt.

Verfasst: 08.10.2006 15:43
von Kaeru Gaman
ja genau... es geht doch um den Call, nicht um die Deklaration...

...mensch edel, nu haste mich aber nervös gemacht...
(bin wohl heut nich ganz fit...)

Verfasst: 08.10.2006 15:46
von mknjc
Wenn ich das wüsste aber in der Anleitung des Progs finden sich sachen von den ich noch nie gehört habe.
Alle drei Pointer PINPUT und POUTPUT zeigen jeweils auf einen Speicherbereich in dem 100 Variablen vom Typ EXTENDED in einem Array abgelegt sind. Die Pointer sind vom Typ PDLLParams, dessen Deklaration in Delphi so aussieht:

type TDLLParams = array[0..100] of extended;
PDLLParams = ^TDLLParams;

Die Extended-Variablen des Pointers PINPUT enthalten die Eingangszustände des Bauteils. Auf den Wert eines Eingangs des Bauteils können Sie wie folgt zugreifen:

PInput^[0] enthält den numerischen Eingangswert des 1. Eingangs,
PInput^[1] enthält den numerischen Eingangswert des 2. Eingangs, usw.

Die Extended-Variablen des Pointers POUTPUT nehmen die Ausgangszustände des Bauteils auf. Um den Wert der Ausgänge des Bauteils zu setzen, benutzen Sie:

POutput^[0] nimmt den numerischen Ausgangswert des 1. Ausgangs auf,
POutput^[1] nimmt den numerischen Ausgangswert des 2. Ausgangs, usw.
Ich hab es mal hiermit versucht:

Code: Alles auswählen

Structure myStringi 
    s.l[0] 
EndStructure

Structure myStringo 
    s.l[0] 
EndStructure

ProcedureDLL Calculate(*PInput.myStringi,*POutput.myStringo)
    Protected I.l
    
    I = *PInput\s[0]
    *POutput\s[0] = I
    
EndProcedure
Dann bekommich aber eine Zugriffsverletzung bei Adresse 0441114C in Modul 'qq.dll'. Lesen von Adresse 0000000B

qq.dll ist meine DLL.

[edit]

Es geht hier um das Programm Profilab3 das wir hier verwenden um komplexe Schaltungen aufzubauen. Das Problem ist das da das IC 4094 nich eingebaut ist was ich sozusagen nachrüsten möchte

[/edit]

Mfg mknjc

Verfasst: 08.10.2006 15:54
von Kaeru Gaman
vielleicht ist der Typ "extended" größer als Long?
auf jeden Fall benötigst du die richtige anzahl dimensionen.

schau mal in deiner Delphi-Help, wieviel Byte der typ "Extended" hat,
dann musst du dein array auf die selbe größe basieren.
Wenn Extended = 64bit Dann DeinTyp = Quad.

Code: Alles auswählen

Structure PDLLParams
  S.q [99]
EndStructure

Define PINPUT.PDLLParams
Define POUTPUT.PDLLParams

PINPUT\S[2] = 1
PS:
unsicher, ob das Ansprechen korrekt ist, aber die Deklaration von Struct und Var müsste stimmen...

PPS:
Call:

Code: Alles auswählen

ProcCall(@PINPUT,@POUTPUT)

Verfasst: 08.10.2006 15:57
von #NULL
delphi 7.0 hilfe:
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10

..ein 10-byte, reeller typ