MEMVAR - PBULIC

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

Moderator: Moderatoren

MEMVAR - PBULIC

Beitragvon xbaseklaus » Mo, 09. Mai 2016 14:40

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

Re: MEMVAR - PBULIC

Beitragvon Manfred » Mo, 09. Mai 2016 14:47

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
 
Beiträge: 16563
Registriert: Di, 29. Nov 2005 17:58
Wohnort: Kreis Wesel

Re: MEMVAR - PBULIC

Beitragvon xbaseklaus » Mo, 09. Mai 2016 14:48

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)

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

Re: MEMVAR - PBULIC

Beitragvon Manfred » Mo, 09. Mai 2016 14:51

das dürfte aber nur sein, wenn Du die Var einsetzt, ohne vorher zu initialisieren.
Gruß Manfred
Mitglied der XUG Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
 
Beiträge: 16563
Registriert: Di, 29. Nov 2005 17:58
Wohnort: Kreis Wesel

Re: MEMVAR - PBULIC

Beitragvon Martin Altmann » Mo, 09. Mai 2016 14:52

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 13238
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: MEMVAR - PBULIC

Beitragvon xbaseklaus » Mo, 09. Mai 2016 15:06

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

Re: MEMVAR - PBULIC

Beitragvon brandelh » Mo, 09. Mai 2016 15:07

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13498
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: MEMVAR - PBULIC

Beitragvon georg » Mo, 09. Mai 2016 15:27

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1849
Registriert: Fr, 08. Feb 2008 22:29

Re: MEMVAR - PBULIC

Beitragvon xbaseklaus » Mo, 09. Mai 2016 16:23

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

Re: MEMVAR - PBULIC

Beitragvon Koverhage » Mo, 09. Mai 2016 18:08

Die Frage ist warum Du die Variablen als MEMVAR und als Public deklarierst ?
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1908
Registriert: Fr, 23. Dez 2005 9:00
Wohnort: Aalen

Re: MEMVAR - PBULIC

Beitragvon brandelh » Di, 10. Mai 2016 11:14

MEMVAR stellt sicher, dass keine Compiler Warnungen erscheinen und soll ein besserer Stil sein, tatsächlich ändern tut es aber nicht.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13498
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: MEMVAR - PBULIC

Beitragvon georg » Di, 10. Mai 2016 11:32

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1849
Registriert: Fr, 08. Feb 2008 22:29

Re: MEMVAR - PBULIC

Beitragvon Herbert » Di, 10. Mai 2016 12:00

xbaseklaus hat geschrieben:Reicht es wenn ich die CH Datei beim Compilieren im gleichen Verzeichnis habe !?

Ja
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1788
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich

Re: MEMVAR - PBULIC

Beitragvon Manfred » Di, 10. Mai 2016 12:06

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
 
Beiträge: 16563
Registriert: Di, 29. Nov 2005 17:58
Wohnort: Kreis Wesel

Re: MEMVAR - PBULIC

Beitragvon xbaseklaus » Di, 10. Mai 2016 12:39

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

Re: MEMVAR - PBULIC

Beitragvon georg » Di, 10. Mai 2016 12:57

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1849
Registriert: Fr, 08. Feb 2008 22:29

Re: MEMVAR - PBULIC

Beitragvon xbaseklaus » Di, 10. Mai 2016 15:39

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

Re: MEMVAR - PBULIC

Beitragvon Manfred » Di, 10. Mai 2016 15:53

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 Leverkusen
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
 
Beiträge: 16563
Registriert: Di, 29. Nov 2005 17:58
Wohnort: Kreis Wesel

Re: MEMVAR - PBULIC

Beitragvon Martin Altmann » Di, 10. Mai 2016 16:16

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: http://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: http://meldungen.altem.de/

Mitglied der XUG Osnabrück
stellv. Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
 
Beiträge: 13238
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin

Re: MEMVAR - PBULIC

Beitragvon Tom » Di, 10. Mai 2016 16:20

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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 6728
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin

Re: MEMVAR - PBULIC

Beitragvon Herbert » Di, 10. Mai 2016 16:34

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
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1788
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich

Re: MEMVAR - PBULIC

Beitragvon Tom » Di, 10. Mai 2016 16:56

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
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 6728
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin

Re: MEMVAR - PBULIC

Beitragvon brandelh » Mi, 11. Mai 2016 8:53

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
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13498
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: MEMVAR - PBULIC

Beitragvon Jan » Mi, 11. Mai 2016 9:19

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Jan
Foren-Administrator
Foren-Administrator
 
Beiträge: 11895
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle


Zurück zu Newbie

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast