Array Pointer

Anfängerfragen zum Programmieren mit PureBasic.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Array Pointer

Beitrag 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
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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?
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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?
Zuletzt geändert von Kaeru Gaman am 08.10.2006 15:42, insgesamt 2-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

mknjc ist sichersich eher in den 'empfang' interessiert, bzw die verarbeitung in der proc/dll. die übergabe wird wahrscheinlich von anderso geregelt.
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
mknjc
Beiträge: 217
Registriert: 09.09.2006 12:59

Beitrag 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
Ich nutze PureBasic 4.02 unter Linux und Windows.

Momentane Projekte:
Das geheimste aller geheimen Projekte... FPBC
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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)
Zuletzt geändert von Kaeru Gaman am 08.10.2006 15:58, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten