Forum: PC-Programmierung Delphi 4 Variablen als Array ansprechen


von AxelR. (Gast)


Lesenswert?

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.

von AxelR. (Gast)


Lesenswert?

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.

von dunkelmann (Gast)


Lesenswert?

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.

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von Rufus T. Firefly (Gast)


Lesenswert?

Nachtrag:

Bitte in obigem Beitrag "Register" durch "I/O-Ports resp. Adressen"
ersetzen.

von Rufus T. Firefly (Gast)


Lesenswert?

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.

von AxelR. (Gast)


Lesenswert?

@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/

von Rufus T. Firefly (Gast)


Lesenswert?

@AxelR.: Bloß kein Zucker. Milch. Aber dafür echten
"Pumpe-Düse"-Kaffee (1 Pfund/Liter oder so ähnlich).

von Hagen (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

von Hagen (Gast)


Lesenswert?

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

von AxelR. (Gast)


Lesenswert?

Jo, Leute. passt! Vielen herzlichen Dank!!

AxelR.

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
Noch kein Account? Hier anmelden.