Parameterübergabe

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
mrparity
Rookie
Rookie
Beiträge: 17
Registriert: Mi, 06. Aug 2008 14:28

Parameterübergabe

Beitrag von mrparity »

Hallo :-),

gibt es die Möglichkeit benannte Parameter (named parameter) zu übergeben? Vielleicht ein Hash oder sowas in der Richtung?

Sowas wie das:

Code: Alles auswählen

c1 = Customer.new(:first => 'Hans', :last = 'Peter')
c2 = Customer.new(:last => 'Schmidt', :zip => '47807', :first => 'Martin')
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Parameterübergabe

Beitrag von AUGE_OHR »

hi,
mrparity hat geschrieben:gibt es die Möglichkeit benannte Parameter (named parameter) zu übergeben? Vielleicht ein Hash oder sowas in der Richtung?

Sowas wie das:

Code: Alles auswählen

c1 = Customer.new(:first => 'Hans', :last = 'Peter')
c2 = Customer.new(:last => 'Schmidt', :zip => '47807', :first => 'Martin')
Ja es gibt PValue() für die Parameter.

Code: Alles auswählen

PROCEDURE Main() 
LOCAL i, imax 
   imax := PCount()                 // Anzahl übergebener Argumente 
 
      FOR i:=1 TO imax   
         DO CASE
              CASE "/FIRST:" $ UPPER( PValue(i) )
...
              CASE "/LAST:"  $ UPPER( PValue(i) )
...
         ENDCASE
      NEXT 
 
gruss by OHR
Jimmy
mrparity
Rookie
Rookie
Beiträge: 17
Registriert: Mi, 06. Aug 2008 14:28

Beitrag von mrparity »

Hallo und Danke für die Antwort.

Wenn ich das richtig verstehe muss ich bei PValue() die Parameter in der richtigen Reihenfolge angeben und kann keinen auslassen. Könnte man vielleicht einen Hash übergeben? Leider habe ich noch nicht gefunden wie man einen Hash definieren kann, lediglich ein einfaches Array :-(
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15708
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 72 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Re: Parameterübergabe

Beitrag von brandelh »

mrparity hat geschrieben:gibt es die Möglichkeit benannte Parameter (named parameter) zu übergeben? Vielleicht ein Hash oder sowas in der Richtung?
Hallo,

NEIN, Xbase kennt keine named parameters !
Die Parameter müssen immer in der richtigen Reihenfolge übergeben werden, allerdings kann man einige überspringen oder ganz weglassen:


funktion XYZ(P1, P2, P3, P4)

Aufruf z.B. ohne Paramter XYZ() ist ok, P1, P2, P3 und P4 werden dann NIL enthalten ! Einige Xbase++-Funktionen haben andere Standardwerte, wenn man nichts übergibt.

Aufruf mit einigen ...

XYZ("a", , @Name) ->

ergibt in der aufgerufenen Funktion ->

P1 == "a" // übergabe per Value = Standard
P2 == NIL // dieser wurde übersprungen
P3 == Referenz auf die Variable vom aufrufenden Programm Name
ich weiß nicht ob du das mit Hash meinst, aber eine Änderung in der Funktion wird auch den Wert im Hauptprogramm ändern und umgekehrt !
P4 == NIL // übersprungen

@Jimmy,

named Parameter kann man z.B. bei VB verwenden um nur einige Parameter zu übergeben, wobei die Reihenfolge egal ist und das sieht so aus:

Code: Alles auswählen

function XYZ(cName,cVorname,cPLZ,cOrt)

VB:          ? xyz(cPLZ="67345")
Xbase++:  ? XYZ(,,"67345")
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15708
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 72 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

mrparity hat geschrieben:lediglich ein einfaches Array :-(
Übergabe per Referenz habe ich oben ja schon erwähnt:

Code: Alles auswählen

a := "AB"

? a, MyFunk(@a),a

->   AB XA BA

funktion MyFunk(a)
   a := "BA"
return "XA"
so einfach müssen die Arrays bei Xbase++ übrigens gar nicht sein:

Code: Alles auswählen

aTeilnehmer := { { "Hans", "Moser", 64, "Zimmer 45", ... },;
                 { "Heinz", "Müller", 45, "Zimmer 5", ... },;
                 ... }
Man kann Arrays schachteln so tief man will (und überblicken kann ;-) ) und so groß machen, wie Windows Speicher liefern kann ... ab der Auslagerungsdatei wird es dann langsamer ;-) aber 5000 und mehr sind gar kein Problem.

Wirklich komplexe Variablen übergibt man aber am Besten per Objekt:

Code: Alles auswählen

CLASS TEILNEHMER
    VAR vorname
    VAR name
    VAR alter
    VAR zimmer
    ...
ENDCLASS
....

oTeilnehmer := Teilnehmer():new() // create braucht man hier nicht
oTeilnehmer:name := "Müller"
...

DruckeRechnung( oTeilnehmer )  // Objekte sind immer per Referenz

...
Gruß
Hubert
mrparity
Rookie
Rookie
Beiträge: 17
Registriert: Mi, 06. Aug 2008 14:28

Beitrag von mrparity »

Danke für die ausführliche Antwort.

Ein Hash oder auch assoziatives Array ist eine Datenstruktur, die ähnlich einem Array ist. Genau wie bei einem Array gibt es Key/Value Paare. In einem Array sind die Keys jedoch immer Zahlen, also so:

array[key] := value
array[2] := 40
array[6] := 42


Bei einem Hash sind die Keys jedoch Objekte oder Strings:
hash[key] := value
hash['order'] := 'desc'
hash['limit'] := 50


Bye :-)
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
mrparity hat geschrieben: Wenn ich das richtig verstehe muss ich bei PValue() die Parameter in der richtigen Reihenfolge angeben und kann keinen auslassen. Könnte man vielleicht einen Hash übergeben? Leider habe ich noch nicht gefunden wie man einen Hash definieren kann, lediglich ein einfaches Array :-(
Bei dem Demo oben wird ja noch der "Options" Parameter angegeben
und deshalb auch die DO/CASE Schleife sodas es keine Rolle spielt in
welcher Reihenfolge die Parameter angegeben werden.

Code: Alles auswählen

myExe.EXE /FIRST:Jimmy /LAST:Yiu

myExe.EXE /LAST:Yiu /FIRST:Jimmy
´
beide Aufrufe liefern die selben Ergebnisse
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15708
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 72 Mal
Danksagung erhalten: 38 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Jimmy,

die Frage nach den named parameters bezieht sich nicht auf die Parameter beim Starten des Programmes, sondern auf den Aufruf von Funktionen.

Sein Beispiel war aber ein Mix aus Xbase++ Klassen und VB named parameters ;-)

Die HASH Tabelle habe ich beim Yucon Projekt letzthin gelesen, das ist eine Art von Erweiterung zu Xbase++ ob das aber nötig ist, muss jeder Selbst wissen:

aArray := { { "Müller",..."}, {"Maier",...} ... } mit ASCAN(aArray,cName) durchsucht kann tausende von Einträgen haben, die Suche ist dennoch so schnell dass man es nicht messen kann. (Eine Suche !)
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16560
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 116 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Moin,
mrparity hat geschrieben:Bei einem Hash sind die Keys jedoch Objekte oder Strings:
hash[key] := value
hash['order'] := 'desc'
hash['limit'] := 50
nun - das könntest Du ähnlich machen!
Ein Array für die Werte und #define für die Elementzähler des Arrays:

Code: Alles auswählen

#define dOrder 1
#define dLimit 2
#define dAnzahl 2
aHash := Array( dAnzahl )
aHash[ dOrder ] := "desc"
aHash[ dLimit ] := 50
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
mrparity
Rookie
Rookie
Beiträge: 17
Registriert: Mi, 06. Aug 2008 14:28

Beitrag von mrparity »

Hallo :-),

danke für die Infos. Da die Sprache Hashes nicht unterstützt werde ich das wohl selber implementieren müssen, damit wären dann auch nemad Parameter möglich.

Gibt es eine freie (GPL, LGPL, o.ä.) Bibiliothek um solche Erweiterungen zu sammeln, damit diese nicht jeder wieder neu machen muss?

Bye,
Patrick


ps. das war kein VB, sondern Ruby + Xbase++ ;-)
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14662
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Beitrag von Jan »

Hannes hat sowas geschrieben. Schau mal hier nach

Jan
Antworten