MEMVAR - PBULIC

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Antworten
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

MEMVAR - PBULIC

Beitrag von xbaseklaus »

Hallo,

irgendwie dachte ich immer , wenn ich alle PUBLICs in der MAIN

Code: Alles auswählen

PROCEDURE Main

MEMVAR V1, V2 , V3 ...

PUBLIC V1, V2, V3, ...
definiere reicht das auch für alle anderen PROCEDUREN in denen die PUBLICs vorkommen

aber da kommt dann mit /w der Fehler: "warning XBT0103: Ambiguous variable reference, assuming"

also muss ich in einer anderen PROCEDURE wo die PUBLIC vorkommt trotzdem:

Code: Alles auswählen

PROCEDURE NEU
MEMVAR V1
...

oder 

PROCEDURE NEU
...
MEMVAR->V1
...
schreiben , damit ich keine Fehlermeldung bekomme !?!

Mfg Klaus
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: MEMVAR - PBULIC

Beitrag von Manfred »

ja, woher soll der Compiler sonst wissen, dass es von einer Etage höher kommt? Es kann ja sein, dass der gleiche Name nochmal verwendet wird, dann aber eine Private ist. Dient alles dem Schutz....
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!!
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: MEMVAR - PBULIC

Beitrag von xbaseklaus »

im Prinzip hab ich mir das mit /W nie so genau beim Compilieren angeschaut ...

aber seit der Xbase++ 1.9SL1 bekomme ich nämlich ab und an solche FEHLER war unter 1.9.331 NIE der Fall !!

Code: Alles auswählen

Xbase++ version : Xbase++ (R) Version 1.90.355
 Operating system : Windows 7 06.01 Build 07601 Service Pack 1
 ------------------------------------------------------------------------------
 oError:args :
 -> NIL
 oError:canDefault : N
 oError:canRetry : Y
 oError:canSubstitute: N
 oError:cargo : NIL
 oError:description : Unknown variable
 oError:filename : 
 oError:genCode : 22,00
 oError:operation : nameae
 oError:osCode : 0,00
 oError:severity : 2,00
 oError:subCode : 2000,00
 oError:subSystem : BASE
 oError:thread : 1,00
 oError:tries : 1,00
 ------------------------------------------------------------------------------
 CALLSTACK:
 ------------------------------------------------------------------------------
 Called from (B)NAM(791)
 Called from T1(481)
 Called from EDITTERM(313)
 Called from (B)DBEDIT(0)
 Called from DBEDIT(198)
 Called from PSICHT(274)
 Called from AK1(116)
 Called from A1(33)
 Called from MAIN(244)

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: MEMVAR - PBULIC

Beitrag von Manfred »

das dürfte aber nur sein, wenn Du die Var einsetzt, ohne vorher zu initialisieren.
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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16488
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Martin Altmann »

Moin Klaus,
das ist der Zweck des /w- Parameters. Die Variable ist zwar in den anderen Prozeduren bekannt (was sie auch bei private-Deklaration in der main gewesen wären), aber der Parameter /w bedeutet ja noch mehr ;-)
Und da die Variable in der jeweiligen Prozedur nicht deklariert ist, kommt die entsprechende Warnung. Um das zu umgehen, gibt es den Parameter /v (aber Achtung! Damit werden alle undeklarierten als MEMVAR angenommen und somit implizit deklariert, sollten sie nicht vorher deklariert worden sein).

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.
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: MEMVAR - PBULIC

Beitrag von xbaseklaus »

Martin Altmann hat geschrieben:Moin Klaus,
... Um das zu umgehen, gibt es den Parameter /v (aber Achtung! Damit werden alle undeklarierten als MEMVAR angenommen und somit implizit deklariert, sollten sie nicht vorher deklariert worden sein).
...
Den /v kann ich bei mir nicht verwenden ... da ich erstmal alle ... DBF Felder .... mit FIELD->Feld1 oder DBFname->Feld1 deklarien muß ... müsste ...
was ich jetzt wohl nachholen werde/sollte :-)

Mfg Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von brandelh »

Wenn eine MEMVAR für alle PRG gelten soll, kannst du die in eine CH Datei stecken und die INCLUDEN somit ist nur eine Stelle zu warten ;-)

Alternativ M->MyPrivateOrPublicVar verwenden. Überall ;-)
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Re: MEMVAR - PBULIC

Beitrag von georg »

Hallo, Klaus -


der Compiler sieht immer nur eine Programmquelle zur Compile-Zeit. Für die Programmquelle, in der Main() definiert ist, sind alle PUBLIC-Variablen für den Compiler definiert, und da meckert er nicht. Bearbeitet der Compiler nun die nächste Quelle, ist die Definition nicht mehr sichtbar, und ein Verweis auf eine mittels MEMVAR definierte PUBLIC produziert eine Warnung.

Deine Überlegung verwechselt Runtime (ich habe a, b, c in Main() definiert, also müssen sie überall zu sehen sein in meinem Programm) mit Compile-Zeit: der Compiler "durchläuft" das komplette Programm eben nicht.

Der einfachste Weg dürfte der von Hubert vorgeschlagene sein, die MEMVAR-Deklarationen in eine .CH-Datei zu übernehmen und diese in allen Programmen einzubinden.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: MEMVAR - PBULIC

Beitrag von xbaseklaus »

ne ganz blöde Frage wie muß dann die CH Datei ausschauen ?

Ich muß dann also am Anfang jeder PRG Datei mit #include "PRGMVAR.CH" die CH Datei einbinden !?

Reicht es wenn ich die CH Datei beim Compilieren im gleichen Verzeichnis habe !?

Mfg Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Koverhage »

Die Frage ist warum Du die Variablen als MEMVAR und als Public deklarierst ?
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von brandelh »

MEMVAR stellt sicher, dass keine Compiler Warnungen erscheinen und soll ein besserer Stil sein, tatsächlich ändern tut es aber nicht.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Re: MEMVAR - PBULIC

Beitrag von georg »

Deine 'ProgVars.ch' könnte so aussehen:

Code: Alles auswählen

MEMVAR Public1
MEMVAR Public2, Public5, Geheim3
In Deinem Programm sollte das dann so aussehen:

Code: Alles auswählen

#INCLUDE "AppEvent.ch"
#INCLUDE "Xbp.ch"

#INCLUDE "ProgVars.ch"
...
Da die ProgVars.ch projekt-spezifisch ist, würde ich sie im jeweiligen Projektverzeichnis unterbringen. Die Anweisung #INCLUDE sucht zuerst im aktuellen Verzeichnis, dann in den Verzeichnissen, die in der Umgebungsvariablen INCLUDE definiert sind.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Herbert »

xbaseklaus hat geschrieben:Reicht es wenn ich die CH Datei beim Compilieren im gleichen Verzeichnis habe !?
Ja
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: MEMVAR - PBULIC

Beitrag von Manfred »

hm, das war jetzt etwas gewagt Herbert.

die CH Datei muß schon im Code eingebunden werden, nur ins Verzeichnis kopieren bringt da nicht viel. :wink:
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!!
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: MEMVAR - PBULIC

Beitrag von xbaseklaus »

georg hat geschrieben:Deine 'ProgVars.ch' könnte so aussehen:

Code: Alles auswählen

MEMVAR Public1
MEMVAR Public2, Public5, Geheim3
OK , wenn ich das so reinschreibe ... ist das dann automatisch eine PUBLIC oder eine PRIVATE ?

Mfg Klaus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Re: MEMVAR - PBULIC

Beitrag von georg »

Gar nichts.

Ich hatte das weiter oben schon einmal versucht zu erklären: MEMVAR ist eine Deklaration, die dem Compiler (= Compilezeit!) hilft, zu erkennen, ob eine Variable deklariert (= gewollt) oder falsch geschrieben (= so nicht gewollt) ist. Dem Compiler ist es schnuppe, ob irgendwo PUBLIC oder PRIVATE steht, denn das sind ausführbare Anweisung in Xbase++ (im Gegensatz zu Clipper).

Damit man als Programmierer sowohl PUBLIC als auch PRIVATE verwenden kann, und trotzdem vom Compiler Warnung(en) über nicht deklarierte Variablen erhält, gibt es die Deklaration MEMVAR.

Kommen wir zur Ausführungszeit Deines Programms. Die MEMVAR Deklarationen werden NICHT ausgeführt (da sie ein Hinweis an den Compiler sind und daher auch ausserhalb von Funktionen o.ä. stehen können), und wenn Du die erste der mit MEMVAR deklarierten Variablen verwendest, werden sie als PRIVATE angelegt (xBase-Sprachstandard).

Es macht also Sinn, sie z.B. in Main() mittels PUBLIC der Laufzeitumgebung Deines Programms gegenüber bekannt zu machen.


Dein Verständnis-Problem beruht nach meiner Vermutung darauf, dass Dir nicht klar ist, was nur zur Compile-Zeit ausgewertet wird, und was zur Laufzeit ausgewertet wird.

Konnte ich den Sachverhalt ein wenig klären?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
xbaseklaus
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 246
Registriert: Mi, 04. Jun 2014 12:01
Wohnort: FRANKEN

Re: MEMVAR - PBULIC

Beitrag von xbaseklaus »

@ Georg

Alles klar ,

wenn ich sie nicht weiter deklariere werden sie automatisch PRIVATE !

wenn ich will dass sie als PUBLIC behandelt werden muss ich sie in MAIN() extra als PUBLIC deklarieren !

und wenn ich nicht will dass der Compiler sich nicht beschwert dass kein Wert zugewiesen ist sollte ich sie in MAIN() gleich mit einem Anfangswert belegen:

V1 = 0 oder zb. V1 = " " oder V1 = space(10) ...

DANKE

Mfg Klaus

P.S:

kann man das auch mit Feldern machen ... also in eine CH

also statt im PRG Code: FIELD->Feld1 zu schreiben eine CH wo drinsteht:

FIELD Feld1
FIELD Feld2
usw...
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21150
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: MEMVAR - PBULIC

Beitrag von Manfred »

Hallo Klaus,

ich würde generell wegen der Übersicht usw. immer vor einem Feldnamen den Alias, oder den dbf Namen setzen datei->feldname. Du wirst dem irgendwann absolut dankbar entgegentreten, wenn DU mal richtig Fehler suchen mußt und sofort erkennst, was Variable, was Feldname und vor allen Dingen bei Feldnamen, welche DBF gemeint ist. Glaube es mir, hier sind einige (mich eingeschlossen) die Fremdprojekte übernommen haben, in denen das nicht gemacht wurde. Es gab Fluchen ohne Ende beim Kapieren, was da wie gemeint war.
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
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16488
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Martin Altmann »

Klaus,
Du hast es im Prinzip verstanden. Kleiner Hinweis: alle in Main deklarierten private-Variablen sind auch Public, da alle private deklarierten Variablen in allen danach aufgerufenen Funktionen/Prozeduren ebenfalls bekannt sind.

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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Tom »

Kleiner Hinweis: alle in Main deklarierten private-Variablen sind auch Public, da alle private deklarierten Variablen in allen danach aufgerufenen Funktionen/Prozeduren ebenfalls bekannt sind.
Das stimmt nur eingeschränkt. PUBLICs sind auch in allen Threads sichtbar, PRIVATEs jedoch nicht, selbst wenn sie in der MAIN-Funktion/Prozedur definiert wurden. Wenn man ohne Threads arbeitet, stimmt weitgehend, was Martin anmerkt.
Herzlich,
Tom
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Herbert »

Manfred hat geschrieben:hm, das war jetzt etwas gewagt Herbert.

die CH Datei muß schon im Code eingebunden werden, nur ins Verzeichnis kopieren bringt da nicht viel. :wink:
Ja klar :wink: , dass ein Include notwendig ist, nehme ich an, ist bekannt.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9343
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 358 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Tom »

Die generelle Gegenfrage lautet: Wenn man schon mit PRIVATEs und PUBLICs arbeitet - wozu dann noch der Aufwand (MEMVAR, Includes), um etwas Nörgelei des Compilers abzuschalten, die nach meinem Dafürhalten höchstens semihilfreich ist? Eine nicht deklarierte Variable wird automatisch PRIVATE. Sie ist in allen aufgerufenen Funktionen sichtbar (außer in Threads, dort nur PUBLICs). Wenn in diesen Funktionen LOCALs oder Parameter mit gleichen Namen definiert werden, werden dort diese herangezogen, nicht die PRIVATEs (LOCALs werden vom Compiler aufgelöst, PRIVATEs zur Laufzeit über eine Symboltabelle). Ich sehe eigentlich nicht, inwiefern man sich mit der Deklarationskontrolle wirklich einen Gefallen tut - ich nutze diesen Compilerschalter jedenfalls nicht. Aber ich habe auch globale und private Variablen auf eine Mindestmaß reduziert und arbeite gewissenhaft mit LOCALs.

Ansonsten stimme ich diesen Punkten zu:

Auf Felder sollte mit Aliasen zugegriffen werden (db->name), damit der Code leichter zu warten ist.
Variablen, die nur innerhalb einer Funktion verwendet werden, sollten immer LOCALs sein. Ausnahme: Sie werden in Makros verwendet. Für Makros kann man sie jedoch verwenden.

Aber PRIVATEs und PUBLICs sind auch nicht wirklich schlimm. Wer sie für Schalterstellungen/globale Einstellungen verwendet, sollte sich ggf. mit Get-Set-Funktionen und ähnlichen Mechanismen auseinandersetzen. Wer sie verwendet, um zur Laufzeit Codeblöcke zu bauen, sollte sich in der Doku den Abschnitt zu "detached Locals" anschauen und ihn zu verstehen versuchen. Martins Erklärung hierzu, die er gerne wiederholt, ist nämlich nicht richtig. :wink:
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von brandelh »

Ich nutze diesen Schalter um TIPPFEHER in Variablen zu finden.
Das geht aber nur wenn man wirklich nur LOCAL Variablen und zur Not dann M->Variablen nutzt.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: MEMVAR - PBULIC

Beitrag von Jan »

Genau so ist das bei mir auch. Tippfehler und undeklarierte Variablen finden. Das hilft, Laufzeitfehler wegen unbekannten Variablen zu verhindern. Und den Code sauberer zu halten. Da auch deklarierte, aber ungenutzte Variablen angemeckert werden.

Jan
brandelh hat geschrieben:Ich nutze diesen Schalter um TIPPFEHER in Variablen zu finden.
Das geht aber nur wenn man wirklich nur LOCAL Variablen und zur Not dann M->Variablen nutzt.
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Antworten