Hallo zusammen, erstelle gerade eine Visualisierung der Portzustände meines Mega16. Funktioniert soweit, habe mangels Kenntnisse /längerer Abstinenz alles straightforward programmiert und möchte jetzt die Portabfrage in ein Schleife packen. Meine Ports a-d sind als integer deklariert. diese möchte ich nun als Array ansprechen. wobei PORTs[0] porta represäntieren soll und ich via PORTs[3] auf portd zugreifen möchte. Die 4 Variablen sind bereits mit werten(0-255) gefüllt, die den aktuellen Zuständen am AVR entsprechen. So wirds ja wohl eher nichts: ... var Form1: TForm1; porta,portb,portc,portd: Integer; ports:array[porta,portb,portc,portd] of integer; ... wäre ja nett, wenn ich hier eine Richtung gewiesen bekäme. Wenn alles fertig ist, wirds auch veröffentlicht... Danke AxelR.
Habe gerade kurz telefoniert: ich verwerfe die Portvariablen porta,portb usw. und verwende von vornherein PORT[0..3] zu zuweisen der Werte. Hätt' ich ja gleich drauf kommen können. Aber wie iss das nun? wenn ich mehrere Variablen habe, die vorgegeben seien. Kann ich da mit TYPE o.ä. ein Konstukt erstellen, um auf diese Variablen über einen Index zuzugreifen? AxelR.
klar geht das! zuerst einen eigenen datentyp definieren: type MyType = record feld1:integer; feld2:string; feld3:boolean; end; dann ein array davon anlegen: Myarray: array[1..10] of MyType; auf die Arraykomponenten kann dann zugegriffen werden: myarray[0].feld1:=10; myarray[0].feld2:='Hallo Welt'; etc... ----------- www.loetstelle.net Forum, Projekte, Shop.
Wenn die verwendeten Variablen feste Register im Prozessor sind (was das Beispiel mit den Ports nahelegt), dann sollte das ganze mit Pointern funktionieren: Port : array[0..3] of Pointer; und die Pointer müssten entsprechend initialisiert werden: Port[0] = @Porta; Port[1] = @Portb; Port[2] = @Portc; Port[3] = @Portd; Ich mag mich mit der genauen Syntax vertun, da ich schon lange kein Pascal/Delphi mehr programmiere - aber das Konzept sollte klar werden.
Nachtrag: Bitte in obigem Beitrag "Register" durch "I/O-Ports resp. Adressen" ersetzen.
Noch ein Nachtrag: Vergesst I/O-Register und Adressen, mir fällt gerade auf, daß es ja um die Programmierung eines PCs geht, und nicht um Pascal auf irgendeiner anderen Zielhardware. Habe wohl heute zu wenig Kaffee getrunken. Sorry.
@dunkelmann genauso habe ich es letztendlich auch gemacht. Man muss sich nur wieder reinfinden, habe ja schon ganz andere Sachen hinbekommen! @Rufus mit viiel Zucker! Gruß und Danke! AxelR. http://people.freenet.de/Yetirobot/
@AxelR.: Bloß kein Zucker. Milch. Aber dafür echten "Pumpe-Düse"-Kaffee (1 Pfund/Liter oder so ähnlich).
nehme das Array das ist am einfachsten type TPorts = array[0..3] od Byte; TForm1 = class(TForm) private FPort: TPorts; end; Du kannst aber auch die Objectorientierten Weg gehen und über Properties arbeiten. type TForm1 = class(TForm) private FPort: array[0..3] of Byte; function GetPortValue(Index: Integer): Byte; procedure SetPortValue(Index: Integer; Value: Byte); public property Port[Index: Integer]: Byte read GetPortValue write SetPortValue; property PortA: Byte index 0 read GetPortValue write SetPortValue; property PortB: Byte index 1 read GetPortValue write SetPortValue; property PortC: Byte index 2 read GetPortValue write SetPortValue; property PortD: Byte index 3 read GetPortValue write SetPortValue; end; function TForm1.GetPortValue(Index: Integer): Byte; begin Result := FPort[Index]; end; procedure TForm1.SetPortValue(Index: Integer; Value: Byte); begin if FPort[Index] <> Value then begin FPort[Index] := Value; // hier kannst du ein Event auslösen, zb. // if Assigned(FOnPortChanged) then FOnPortChanged(Self, Index); end; end; Du kannst nun auf 2 Arten zugreifen: begin Port[0] := $12; if Port[3] = 0 then ; PortA := $12; if PortC = 0 then ; end; Und über die Getter/Setter Methoden .GetPortValue() und .SetPortvalue() kannst du sogar noch auf Veränderungen der Ports direkt reagieren und zb. Zeichroutinen aktualisieren oder andere Event aufrufen. Gruß Hagen
Achso, fange ja nichts mit Pointern oder so'n Quatsch an. Fast alles was mit Pointer geht geht in PASCAL auch syntaktisch viel bessser ohne Zeiger. Gruß Hagen
Deine Schleife könnte so aussehen: var I: Integer; begin for I := Low(FPort) to High(FPort) do if FPort[I] ..... then ; end; Gruß Hagen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.