Variablen test1, test2, test3 leer - warum?

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Variablen test1, test2, test3 leer - warum?

Beitrag von Wolfgang_B »

Hallo,
ich hänge wieder mal. Ich habe folgendes Beispielkonstrukt:

Code: Alles auswählen

  AADD( aTest , {"1","Pos1","12,67 €" } )
  AADD( aTest , {"2","Pos2","23,77 €" } )
  AADD( aTest , {"1","Pos3","44,01 €" } )
  
  FOR i = 1 TO LEN(aTest)
    &("test"+ALLTRIM(STR(i))) := aTest[i,1]+"                    "+aTest[i,2]+"               "+aTest[i,3]
    MSgBox("test1: "+test1+"    test2: "+test2+"     test3: "+test3)
  NEXT
Ich möchte das Array in die Variablen test1-test3 einlesen. Diese Variablen sind aber nach dem Durchlauf leer. warum?

Gruß Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Variablen test1, test2, test3 leer - warum?

Beitrag von Tom »

Hast Du die als LOCALs definiert? Dann würden sie im Makro abermals als PRIVATEs erzeugt werden.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablen test1, test2, test3 leer - warum?

Beitrag von Wolfgang_B »

stimmt, waren als LOCAL definiert. Als "PRIVATE" funktionierts.

Danke und Gruß
Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Variablen test1, test2, test3 leer - warum?

Beitrag von Tom »

Eine kleine Erläuterung des Hintergrunds:

LOCALs dürfen zwar für, aber nicht in Makros verwendet werden. Makros werden zur Laufzeit interpretiert. Lokale Variablen existieren zu diesem Zeitpunkt nicht mehr unter den Namen, die wir ihnen gegeben haben, sondern sind vom Compiler aufgelöst. Namentlich existieren und in einer Symboltabelle verwaltet werden nur PRIVATEs und PUBLICs. Deshalb kann man private Variablen auch in Makros verwenden. Wenn ein lexikales Element als Speicher angesprochen wird (durch Zuweisung, in Formeln und Funktionen usw.), dann sucht Xbase++ nach diesem Element in den derzeit geöffneten Workareas und in den Symboltabellen. Wenn es dort nicht gefunden wird, wird das Element durch Wertezuweisung erzeugt (ansonsten crasht die Zeile). Genau das (also das Erzeugen) passiert in Deinem Code in dieser Zeile:

Code: Alles auswählen

&("test"+ALLTRIM(STR(i))) := aTest[i,1]+"                    "+aTest[i,2]+"               "+aTest[i,3]
Der Makroexpander macht daraus bei i = 1:

Code: Alles auswählen

test1 := aTest[1,1]+ ...
Beim Ausführen der Zeile wird geprüft, ob das lexikale Symbol (!) "test1" ein Tabellenfeld oder eine private oder globale Variable ist. Da Du "test1" als LOCAL definiert hast, wird hier nicht gesucht - zur Laufzeit weiß Xbase++ quasi nicht mehr, dass diese Variable, die Du da deklariert hast, mal "test1" hieß. Also erzeugt es hier eine zusätzliche private Variable "test1" (Du hast jetzt zwei davon). Dann kommt die nächste Zeile:

Code: Alles auswählen

MSgBox("test1: "+test1+"    test2: "+test2+"     test3: "+test3)
Die arbeitet ohne Makro, wird also vom Compiler entsprechend aufgelöst. Hier wird auf lokale Variable zugegriffen, so sie existieren - und das tun sie, Du hast sie ja definiert. Anders wäre das bei diesem Code:

Code: Alles auswählen

MSgBox("test1: "+&("test1")+"    test2: "+&("test2")+"     test3: "+&("test3"))
Hier arbeitet der Makroexpander und erzwingt den Zugriff auf private Variable.

Das ist ein Vorteil der Sprache, aber auch ein Fallstrick. Lokale Variablen können in Makros nicht verwendet werden. Erfolgt im Makro eine Wertezuweisung zu einer bis dahin nicht existenten Variablen, wird sie erzeugt.
Herzlich,
Tom
Benutzeravatar
Wolfgang_B
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 484
Registriert: Do, 14. Jun 2007 18:22
Wohnort: 94065 Waldkirchen
Hat sich bedankt: 14 Mal
Danksagung erhalten: 5 Mal

Re: Variablen test1, test2, test3 leer - warum?

Beitrag von Wolfgang_B »

Hallo Tom,
endlich mal eine verständliche Erklärung dieser Zusammenhänge. Das war mir so nicht klar. Hab mir schon einen Wolf gesucht, warum das nicht klappt.

Vielen Dank!
Gruß Wolfgang
Beste Grüße
Wolfgang

Mitglied des Deutschsprachigen Xbase-Entwickler e. V.
Mitglied der XUG Osnabrück
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Variablen test1, test2, test3 leer - warum?

Beitrag von Tom »

Gerne, freut mich! :D
Herzlich,
Tom
Antworten