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:
...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 ?
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 Dimensions
anzahl?
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
...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:
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