[gelöst] array als Argument bei Prozeduren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

[gelöst] array als Argument bei Prozeduren

Beitrag von mulcheo »

Hallo zusammen,

in meinem aktuellen Projekt übergebe ich ein zweidimensionales array eines etwas umfangreicheren records (unten: TWort) an meine proc. bzw. func.

in der Deklaration schaut es bspw. wie folgt aus:

Code: Alles auswählen

procedure TForm1.Faerbe(Wort: TWort; Farbe: Tcolor); overload;
und wenn ich aufrufe so: (wobei a und b integers sind, die in verschiedenen Schleifen durchrotieren):

Code: Alles auswählen

Faerbe(W[a,b], clLime);
nun zu meiner Frage: kann ich innerhalb der proc. in irgendeiner Weise auf 'a' bzw. 'b' zugreifen, bzw. die Prozedur auslesen lassen, aus welchem Teil des arrays heraus sie aufgeurfen wurde? Natürlich kann ich auf alle Werte des records zugreifen und es wäre denkbar, dass ich statt der Deklaration oben etwa Folgendes mache

Code: Alles auswählen

procedure TForm1.Faerbe(Wort: TWort; a,b: integer; Farbe: Tcolor); overload;
und dann aufrufe:

Code: Alles auswählen

Faerbe(W[a,b], a, b, clLime);
aber das wirkt ... derart unschön und unpraktisch, dass es mir einfach widerstrebt ... genauso wie die Idee, a und b nochmals künstlich im record zu hinterlegen, etwa nach dem Muster

Code: Alles auswählen

 W[a,b].a:=a; w[a,b,].b:=b;
welche Optionen bleiben mir?
Zuletzt geändert von mulcheo am Do 14. Okt 2021, 09:59, insgesamt 3-mal geändert.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: array als Argument bei Prozeduren

Beitrag von Winni »

Hi!

Definiere das Array innerhalb der Klasse TForm1 und dann übergibst du nur den Zeilen- und Spalten-Wert an Deine Procedure. Die kann dann selbst den Wert rausfinden.

Fertig

Winni
Zuletzt geändert von Winni am Di 12. Okt 2021, 20:34, insgesamt 1-mal geändert.

mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

Re: array als Argument bei Prozeduren

Beitrag von mulcheo »

das ist genau der Kniff, nach dem ich suchte, Danke!

mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

Re: [gelöst] array als Argument bei Prozeduren

Beitrag von mulcheo »

sorry fürs Wiederaufwärmen, aber die Lösung, die Zeile und Spalte als integer zu übergeben, ist leider doch nicht so toll, wie gedacht. Mir fällt das auf die Füße, weil ich im Weiteren via overload auch andere 2D-arrays verschiedener records (unten: TWort, TMarker) an die Proc. übergeben möchte, u.a.

Code: Alles auswählen

procedure TForm1.Faerbe(Start,Ziel: TWort; Farbe: Tcolor); overload;
procedure TForm1.Faerbe(Start,Ziel: TMarker; Farbe: Tcolor); overload;
das floppt natürlich, wenn die Proc. dann nur Spalte und Zeile kennt, aber nicht weiß auf welchen recordtyp das zurückgeht...

meine Prioritäten sind:
(a) den Prozeduraufruf selbst möglichst kurz zu halten (d.h. möglichst keine 'Stützargumente' oder vorbereitende Zeilen)
(b) keine globale Variable opfern

könnten mich Pointer weiterbringen?
Im Moment habe ich als Umweg ein CompareMem direkt zu Beginn der proc. im Auge, etwa so:

Code: Alles auswählen

procedure TForm1.Faerbe(Start,Ziel: TWort; Farbe: Tcolor); overload;

var
  i,j: integer;

begin
  for i:=1 to High(W) do  
  for j:=1 to High(W[i]) do
  if CompareMem(@Start, @W[i,j], SizeOf(TWort)) = true then begin
    [...]
aber das ist halt auch nur ne Krücke ... :/
Danke schonmal!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: [doch nicht gelöst] - reboot: array als Argument bei Prozeduren

Beitrag von wp_xyz »

Code: Alles auswählen

type
  TWort = record [...] end;
  TWortMatrix = array of array of TWort;
  
  TMarker = record [...] end;
  TMarkerMatrix = array of array of TMarker;
  
  procedure TForm1.Faerbe(const Woerter: TWortMatrix; a, b: Integer; Farbe: TColor);
  procedure TForm1.Faerbe(const Marker: TMarkerMatrix; a, b: Integer; Farbe: TColor); 

mulcheo
Beiträge: 57
Registriert: Do 1. Aug 2013, 15:11

Re: [gelöst] array als Argument bei Prozeduren

Beitrag von mulcheo »

ich habe mich nun entschlossen, Zeile und Spalte mit in das record aufzunehmen und den Typ record an die proc. zu übergeben. Das ist langfristig am saubersten und ermöglicht mir auch, TWort und TMarker zu übergeben, die nicht aus dem zweidimensionalen array kommen (wobei sich hier neue Fragen ergeben, dann aber mit eigenem Thred)...
Danke fürs helfen.

Antworten