www.mikrocontroller.net

Forum: PC-Programmierung Delphi 4 Variablen als Array ansprechen


Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dunkelmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: AxelR. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo, Leute. passt! Vielen herzlichen Dank!!

AxelR.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.