Prüfen ob Variable existiert

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

Moderator: Moderatoren

peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Prüfen ob Variable existiert

Beitrag von peternmb »

Hallo, gibt es eine Möglichkeit zu prüfen ob eine public-Variable existiert?
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
valtype( name_der_variable ) == "U" -> Variable nicht definiert.

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.
Karlo Bender
Rookie
Rookie
Beiträge: 16
Registriert: So, 29. Jan 2006 23:20
Wohnort: Hilden

Beitrag von Karlo Bender »

Hallo Martin und Peter,
bei PUBLIC und PRIVATE Variablen muss meines Wissens anstelle von valtype(name_der_variablen) die Funktion type("name_der_variablen") verwendet werden.
Gruß,
Karlo
MfG
Karlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Karlo,
laut Alaska Xbase++-Referenzdokumentation ist das so nicht ganz korrekt!
Schau mal unter dem Punkt Type(), dort sind die Unterschiede zwischen ValType() und Type() genau erklärt.
  • ValType() liefert den Typ der Variable.
  • Type() liefert den Typ der per Makrooperator evaluierten Variable!
Also je nachdem, was Peter braucht, kann das eine oder das andere von Belang für ihn sein.
Ich hatte ihn so verstanden, dass er nur wissen will, ob die public-Variable definiert ist.

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.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

Hallo. Wie auch immer - bei valtype kommt ein Laufzeitfehler - mit type funktioniert es wunderbar. Bei NIL gibt es die Variable noch nicht, und muss definiert werden um einen Absturz zu vermeiden. Ich habe gewusst, dass es irgendeine Funktion dafür gab, nur auf (val)type bin ich einfach nicht gekommen.

Mein eigentliches Problem war, dass ich die Werte von Checkboxen, Radiobuttons, SLEs usw. als eine Art "Schema" speichere. Jetzt kommt noch `ne Checkbox dazu. Das möchte ich einfach ohne aufwändige Abfragen meiner internen Versions-Nummer lösen - so funktioniert es jetzt problemlos.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
peternmb hat geschrieben:Wie auch immer - bei valtype kommt ein Laufzeitfehler
das kann (darf) eigentlich nicht sein!
Zeig doch mal bitte Deinen Codeschnipsel und die entsprechende Fehlermeldung.

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.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

funktioniert nicht:

Code: Alles auswählen

   if valtype(OP_09a) == "U"   //-> noch nicht definiert.
      OP_09a:=.T.
      OP_09b:=.F.
   endif
funktioniert nicht:

Code: Alles auswählen

   if valtype("OP_09a") == "U"   //-> noch nicht definiert.
      OP_09a:=.T.
      OP_09b:=.F.
   endif
funktioniert:

Code: Alles auswählen

   if type("OP_09a") == "U"   //-> noch nicht definiert.
      OP_09a:=.T.
      OP_09b:=.F.
   endif
Fehlermeldung:
oError:description : Unknown variable
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
ich gehe mal davon aus, dass Deine Fehlermeldung in einer der Zeilen kommt, in denen der Variablen der Wert zugewiesen werden soll, oder? In der Zeile mit ValType() darf diese Fehlermeldung nicht kommen!!
Bei Deinem zweiten Beispiel würde er sowieso nicht in den IF-Teil gehen, da der ValType() ein "C" liefert (schließlich willst Du ja den Typ eines Strings erfragen, und der ist nun mal "C")!

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.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

die Fehlermeldung kam es bei beiden nicht funktionierenden Beispielen in der if-Zeile, beim Prüfen ob es meine Variable gibt. Mich interessiert auch NICHT der Type der Variablen, sondern ausschließlich ob die bereits definiert ist. Mit type funktioniert es tadellos - das genügt mir :)
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
es freut mich, dass es Dir genügt ;-)
Aber ich verstehe den Fehler trotzdem nicht! Zumindest nicht, wenn ich die Hilfe richtig verstehe :roll:

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.
rassekst
UDF-Programmierer
UDF-Programmierer
Beiträge: 97
Registriert: Mi, 01. Feb 2006 23:49
Wohnort: Glauchau
Kontaktdaten:

Beitrag von rassekst »

Hallo Martin,

Habe das Beispiel getestet. Peter hat Recht es kommt der genannte Fehler.

VALTYPE ist bei an eine Procedure oder Function übergebene Variable anzuwenden.

Gruss Steffen
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Steffen, davon steht in der Hilfe aber nichts!
Schau Dir mal bitte das zweite Beispiel in der Hilfe zu Type() an. Dort werden die Unterschiede zwischen Type() und ValType() aufgeführt...

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.
rassekst
UDF-Programmierer
UDF-Programmierer
Beiträge: 97
Registriert: Mi, 01. Feb 2006 23:49
Wohnort: Glauchau
Kontaktdaten:

Beitrag von rassekst »

Hallo Martin,

Nein in der Hilfe steht nichts davon.

Alle Parametervariablen die über Function xxx ( var1, var2 )
sind LOCAL
Alle Parametervariablen die über
Procedure xxx
PARAM var1m var2

sind nicht LOCAL

Deshalb auf VALTYPE beim ermitteln des Typs verwenden.

In der Hilfe ist die Variable cArray ja definiert. Ein Test auf nicht vorhanden fehlt ja. Und das war das Problem von Peter.

Gruss Steffen
Karlo Bender
Rookie
Rookie
Beiträge: 16
Registriert: So, 29. Jan 2006 23:20
Wohnort: Hilden

Beitrag von Karlo Bender »

Hallo,

ich habe gerade mal wieder rein geschaut und bin ganz verblüfft, was sich zur Frage valtype / type für ein Traffic entwickelt hat. Ich hab darauf hin selbst mal in die Alaska-Hilfe geschaut unter valtype(), und da steht schwarz auf weiß:

"Valtype() can determine the data type of variables which are declared as LOCAL or STATIC."

Soll heißen: valtype() ist *nur* für deklarierte Variablen vom Typ LOCAL oder STATIC verwendbar. Genauso war es auch schon bei Clipper.
MfG
Karlo
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Karlo,
Karlo Bender hat geschrieben:"Valtype() can determine the data type of variables which are declared as LOCAL or STATIC."

Soll heißen: valtype() ist *nur* für deklarierte Variablen vom Typ LOCAL oder STATIC verwendbar. Genauso war es auch schon bei Clipper.
nein - so ausdrücklich kann man das leider nicht übersetzen - dann müßte dort in etwa stehen:
"Valtype() can only determine the data type of variables which are declared as LOCAL or STATIC."
In der Deutschen Hilfe heißt es dazu auch:
"Dadurch kann Valtype() den Datentyp von Variablen feststellen, die als LOCAL oder STATIC deklariert sind."
Also eigentlich auch nur der Hinweis, dass es für local oder static Variablen funktioniert - aber eben nicht ausschließlich! Zumindest steht das da nicht ausdrücklich drin.
Aber egal - muss man eben auch bei der guten Hilfe zwischen den Zeilen lesen :-)
Wahrscheinlich wäre auch die Funktion Var2Char() sinnvoller (weil universeller) gewesen, um die Existenz zu prüfen.

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.
schmiterlöw
Rookie
Rookie
Beiträge: 11
Registriert: Sa, 15. Apr 2006 11:36
Wohnort: D-14558 Nuthetal

Den Einfluß der UserGroup nutzen

Beitrag von schmiterlöw »

Hallo Gemeinde,

das Thema reizt mich. Nach beinahe 20 Jahren Abstinenz wieder auf dem Platz stelle ich fest, dass da noch immer kräftige Lücken klaffen.

Bevor ich in 2005 auf Xbase++ stieß, hatte ich mich ein paar Monate mit C++ beschäftigt. Nun das sind natürlich stolze Leute. Wer kein C beherrscht, wird nicht als Programmierer bezeichnet. COBOL oder PASCAL sind eher Werkzeuge für die Anwendungs-Selbsthilfegruppe. Aber nichts für ungut. Da sind ein paar Schmankerl, die uns aufhorchen lassen sollten.

Z.B. die strikte Typprüfung der Variablen oder das Überladen von Funktionen. Macht alles der Compiler. Ich habe mich mit C++ leider nicht weiter beschäftigen können. Mit der mir verbleibenden Lebenszeit muß ich maximal ökonomisch umgehen. Aber als ich hier die Beiträge las, da grauste mir schon.

Ich rege daher an, die Wirkkraft des Forums auch dazu zu Nutzen auf die zukünftige Entwicklung von Xbase++ Einfluß zu nehmen.

Mfg -löw
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
nun - gerade die fehlende Typisierung der Variablen ist zum Einen auch ab und an von Vorteil!
Zum Anderen ist es natürlich auch der Clipperkompatibilität geschuldet - wir dürfen ja nicht vergessen, dass Xbase++ in erster Linie ( :!: ) entwickelt wurde, um den toten Clipperanwendungen eine Existenz unter einem 32-Bit Betriebssystem zu gewährleisten.
Alleine schon aus diesem Grunde mußte auf den alten Grundfesten aufbauend entwickelt werden.
Ich gebe Dir sicherlich dahingehend Recht, dass eine im Voraus vorgenommene Typisierung der Variablen eine bessere Laufzeit und eine genauere Fehlerbehandlung erlaubt - nur kann es halt aus den genannten Gründen nicht Ad-hoc implementiert werden!
Was also Sinn machen würde, wäre ein Compilerschalter, mit dem man das Verhalten entsprechend ändern könnte. Wenn eingeschaltet, müssen die Variablen im Code entsprechend typisiert vorliegen, sonst gibt es Fehlermeldungen.
Genau das ist auch (wenn mich meine grauen Zellen nicht trügen) auf der DevCon in Holland entsprechend angesprochen worden.

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.
schmiterlöw
Rookie
Rookie
Beiträge: 11
Registriert: Sa, 15. Apr 2006 11:36
Wohnort: D-14558 Nuthetal

Wie geht es jetzt hier weiter?

Beitrag von schmiterlöw »

Wie geht es jetzt hier weiter? Fragt sich Hausfrau Schmiterlöw.

Dem jungen Mann konnte geholfen werden. Spitze! Wir haben auch gelernt, dass die Dokumentation kein Streitpunkt sein sollte. Dass es da, und ich meine zwangsweise, Abweichungen von der Wirklichkeit geben muß.

Aber das darf doch nicht das Ende sein. Softwareentwickler haben doch die Aufgabe die Fehler der Nutzer Ihrer Produkte vorhersehen zu müssen. Fehlertoleranz nennt man das gemeinhin. Und was für die Entwickler von Xbase-Programmen gilt, gilt zumindest im gleichen Maße doch für die Entwickler der Entwicklungswerkzeuge.

Ich will darum einen konstruktiven Vorschlag machen, der durch die Diskussion der wirklichen Fachleute genüssig zerpflückt werden darf. Die Fairnis sollte aber gebieten im Sinne der Sache nur konstruktives beizutragen.

Vorschlag:
Hausfrau Schmiterlöw hat gelernt, das eine Variable ein Speicheplatz ist. Ihr Name ein Synonym für dessen Adresse. Eine Variable wird deklariert, damit das System/Program überhaupt weiß, da kommt möglicherweise eine Anforderung. Darum trägt es diese Anforderung in eine Liste ein.

Wenn es dem Programmierer beliebt diese Anforderung/Reservierung später zu nutzen, dann initialisiert er die Variable. Beim Xbase heißt das, ihr wird ein Wert zugewiesen. Xbase analysiert den Wert und ordnet den gefundenen Wertype der Variablen zu. Valtype() liefert (wenn ich das richtig erinnere) nach der Deklaration NIL nach jeder! nachfolgenden Initialisierunzu diesen Type.

Aufgehend von dieser rudimentären Wissensbasis, kann ich jetzt eine Zielvorstellung für die Weiterentwicklung der Functionen Valtype() und Type() definieren:

1.) Es gibt nur eine! Funktion aber zwei Namen (Kompatibilität).

2.) Das zukünftige Valtype() liefert einen definierten Wert auch dann, wenn die Variable unbekannt, nämlich nicht deklariert wurde.

Halali, die Jagd ist eröffnet. Ich freue mich auf geistreiche Beiträge, als Futter für mein Gehirn

MfG -löw
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: Prüfen ob Variable existiert

Beitrag von Lewi »

peternmb hat geschrieben:Hallo, gibt es eine Möglichkeit zu prüfen ob eine public-Variable existiert?
Ja!
Ganz einfach mit: IsMemvar( <cVarName>, MEMVAR_PUPLIC)
Informationen dazu und andere Möglichkeiten von Variablen bzw. Methodenprüfungen findest in der Hilfe unter "Debug Funktionen".

Gruß, Olaf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15696
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Prüfen ob Variable existiert

Beitrag von brandelh »

Lewi hat geschrieben:Ganz einfach mit: IsMemvar( <cVarName>, MEMVAR_PUPLIC)
Tja, beim letzten Update hatte ich das auch gelesen, wirklich erschreckend, was man alles so wieder vergisst :?
Gruß
Hubert
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Tja Hubert, da bist Du wahrscheinlich hier nicht der einzige. :wink:
Auch ich habe hin und wieder den Eindruck, dass ich mehr vergessen habe als ich zur Zeit weiß. *g* Im fortgeschrittenen Alter nennt sich das dann "presenile Demenz" ;-)

Gruß Olaf
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Olaf,
Lewi hat geschrieben:Im fortgeschrittenen Alter nennt sich das dann "presenile Demenz"
au - das erklärt vieles! Jetzt weiß ich also, dass ich nicht nur an Alzheimer-Bulimie leide... :D

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.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21192
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

aha, interessant. :oops:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hi Tom,
unter "Bulimie" versteht man eine Eß-Erkrankung. Im Zusammenhang mit Alzheimer würde ich jetzt vermuten, dass dies bei Dir nicht im Zusammenhnag mit der Berliner Currywurst steht. Ich meine, das tröstet mich, habe ich selbst in Berlin ein Jahr gearbeitet und mich "hemmungslos" dieser "Berliner Spezialität" hingegeben habe. ;-)

Gleichwohl, ist das ein Thema für dieses Forum? *g*
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16516
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Olaf,
ich bin der Martin, nicht der Tom :)
Alzheimer-Bulimie heißt einfach, den ganzen Tag lang zu :tongue8: und abends vergessen zu :pukeleft:
;-)

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.
Antworten