#ifdef

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

Moderator: Moderatoren

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

#ifdef

Beitrag von Manfred »

manoman,

sicherlich stelle ich mich wieder blöd an. Ich habe in einer Klassenmethode eine Funktion eingebunden, die ich nicht überall benötige. Jetzt wollen aber die anderen Programm, die auf die Klasse zugreifen auch diese Funktion. Ich habe jetzt aber nicht Lust jedesmal in alle anderen Programme diese Funktion als obj mit einzubinden. Also kam ich irgendwie auf #ifdef.

Tja, da ich noch nie damit gearbeitet habe, dachte ich mir es wäre ja wohl recht einfach, aber irgendwie ist es das wohl nicht:

wenn ich am Anfang von dem Programm, welches die Funktion benötigt schreibe:

Code: Alles auswählen

#define muss

procedure main()
                return
und dann in die Methode schreibe:

Code: Alles auswählen

#ifdef muss
funktion()
#endif
dann sollte es doch so sein, dass dieses Programm die Funktion einkompiliert bekommt und die anderen doch nicht, oder?

Nun, die anderen bekommen es nicht einkompiliert, aber das eine bekommt es auch nicht einkompiliert.

Was mache ich hier wieder falsch?
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Manfred,
Du machst einen Denkfehler!
Deine #ifdef-Konstruktion wird durchlaufen, wenn muss dafiniert ist - soweit in Ordnung.
Doch was machst Du dort? Du rufst dann die Funktion auf! Dadurch wird sie nicht eingelinkt, sondern aufgerufen und das führt dann zu einem Fehler, da sie nicht 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.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Nö Martin,

es wird kein Fehler generiert, der Punkt wird einfach übersprungen.
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: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Manfred,
das kann nur dann der Fall sein, wenn Du muss in einem prg definierst, aber in einem anderen abfragst!!
Wenn Du das so willst, dann musst Du muss als Parameter beim compilieren mit angeben, so dass es in allen OBJ-Dateien bekannt ist.
Dies tust Du in Deiner Project-Datei im Abschnitt [PROJECT] bei dem Schalter COMPILE_FLAGS, indem Du dort ein /dMUSS mit angibst.

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

siehst Du, das habe ich nicht verstanden.

Jetzt dürfte es klar sein, ich probiere es mal.
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
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:

Beitrag von brandelh »

Hallo Manfred,

ein #define gilt nur innerhalb der einen PRG Datei und auch nur nach der Definitionszeile.
Er wird zur Compilierzeit aufgelöst und ist somit oder auch nicht in der OBJ Datei. Wenn du das machen willst, mußt du Quellcode sharen und nicht die fertigen OBJ Dateien (nur falls du zu den Anhängern der Vorcompilierung gehörst ;) )

Dann gibt es 2 Möglichkeiten:

1. Parameter von XPP
2. Eigene Include-Datei vor allen anderen in jeder PRG aufrufen, die den Define setzt

Nun die Beispiele:

1. Parameter von XPP:

Code: Alles auswählen

xpp .... /dMeinCompilerSchalter      oder mit pbuild in der XPJ Datei
COMPILE_FLAGS = .... /dMeinCompilerSchalter
das ist aus meiner Sicht der beste Weg, wenn du schnell und einfach alle PRG einer Anwendung auf solche Schalter trimmen willst (verschiedene Programmversionen verwalte ich so).


2. Mit eigener Include Datei ...

Code: Alles auswählen

In MyOwnDef.CH (Beispielhaft)
    #define MeinCompilerSchalter ...

In jeder (nötigen) PRG dann vor allen anderen includes ...
    #include "MyOwnDef.CH"
...
der Vorteil hiervon kann sein, dass man je PRG entscheiden kann ob man es braucht, aber der Nachteil ist, dass man es auch schnell mal vergessen kann ...

Egal wie nun kann man im Programm je nach Definition unterscheiden:

Code: Alles auswählen

#ifdef MeinCompilerSchalter
   ? "Dieses Programm hat spezielle Eigenschaften"
#endif

oder wenn man Werte hinterlegt hat ...

#if  MeinCompilerSchalter = "MEIN"
     ? "Guten Morgen du bist der Größte"
...
Der Vorteil dieser Schalter ist , dass der Code wirklich NICHT in die OBJ / EXE kommt, statt nur übersprungen zu werden.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Ich habe es gerade in das Project File eingebunden, aber das nimmt nur 2 auf. Wie mache ich das denn, wenn ich mehrere haben möchte
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

vergeßt es mal alles wieder, bin zu blöd zum lesen. Ich habe es an die falsche Stelle geschrieben, so wie es aussieht
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Klappt aber trotzdem nicht.

Ich habe jetzt bei COMPILE_FLAGS, bei dem schon stand /q /w /wi /wu /ga

ein /dSTAMMDATEN hinter geschrieben.

Es wird weiterhin ignoriert
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
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:

Beitrag von brandelh »

Hallo Manfred,

1. Versuche PBUILD /A auszuführen oder alle OBJ zu löschen.
2. Ist dieSchreibweise gleich ? die DEFINEWERTE sind von der Groß/Kleinschreibung äbhängig.
3. Sende doch mal die Zeilen aus deiner XPJ und dann die aus der PRG ...
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
bedenke bitte, dass Du nach Änderung an der XPJ-Datei Dein pbuild mit dem Parameter /A aufrufen musst, damit auch alles neu gebaut wird!!
Ausserdem hatte auch ich meine Probleme mit mehr als zwei /d-Schaltern! In dem Fall musst Du einen setzen, in allen prgs eine eigene .ch-Datei einbinden und in dieser .ch-Datei abhängig von dem /d-Schalter alle nötigen #define-Zeilen eintragen!

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: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

ich lösche grundsätzlich vorher immer alle OBJ Dateien und compiliere dann neu.

Project

COMPILE = xpp
COMPILE_FLAGS = /q /w /wi /wu /ga /dSTAMMDATEN
DEBUG_SAVE = yes
GUI = yes
LINKER = alink

Code: Alles auswählen

             IF ! ::browseDb(oWG,"bez",.F.,"",.T.)
                IF oMessage:anzeigen("Soll eine neue Warengruppe erfaßt oder eine vorhandene geändert werden?",.T.,"N")
                   #ifdef STAMMDATEN
                      wgvt()
                   #endif
                   WSELECT(nFenster)
                   RETURN(.F.)
                ENDIF
             ENDIF
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
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:

Beitrag von brandelh »

Hallo Manfred,

und du hast auch irgendwo ein

Code: Alles auswählen

#ifdef STAMMDATEN 
   function wgvt() 
      ...
   return xyz
#endif 
definiert ?

Was ist eigentlich DEBUG_SAVE = yes ?
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16511
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
nun - ich habe bei mir in der xpj-Datei folgende Zeile:
COMPILE_FLAGS = /q /n /m /iSource /rxppui2.lib /dHEDEPER
(und somit im Prinzip das ganze nicht viel anders, als Du) und es klappt!
Bist Du Dir denn sicher, das die Zeile oMessage:anzeigen("Soll eine... bei Deinen Tests auch true liefert?

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
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:

Beitrag von brandelh »

Wird eventuell die vorhergehende Zeile nie .t. ?

Versuch doch mal gleich zu Anfang ein

Code: Alles auswählen

#ifdef STAMMDATEN
  msgbox("Stammdaten")
#endif ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hallo Hubert
Hallo Manfred,

und du hast auch irgendwo ein

Code: Alles auswählen

#ifdef STAMMDATEN 
   function wgvt() 
      ...
   return xyz
#endif 
definiert ?
? versteh nicht...
Was ist eigentlich DEBUG_SAVE = yes ?
Jou, watt weiß ich, stand immer schon drin, wurde irgendwann mal vom Builder erzeugt.....
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

brandelh hat geschrieben:Wird eventuell die vorhergehende Zeile nie .t. ?

Versuch doch mal gleich zu Anfang ein

Code: Alles auswählen

#ifdef STAMMDATEN
  msgbox("Stammdaten")
#endif ...
Doch doch, das klappt ja alles soweit, nur die #ifdef wird direkt übersprungen. Danach läuft alles so weiter, wie gewollt.
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
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:

Beitrag von brandelh »

Manfred hat geschrieben:Hallo Hubert
Hallo Manfred,
und du hast auch irgendwo ein

Code: Alles auswählen

#ifdef STAMMDATEN 
   function wgvt() 
      ...
   return xyz
#endif 
definiert ?
? versteh nicht...
damit du eine Funktion aufrufen kannst (egal wie), mußt du diese im Programm hinterlegen (definieren). Es muss also eine Funktion wgvt() in deinem Programm geben.
Und ich vermute, dass du diese nicht unnötig drin haben willst, sondern nur wenn der Parameter gesetzt ist. Wenn sie aber fehlt und dein Parameter auf .t. geht, müsste ein Compilerfehler (Funktion nicht gefunden ...) erscheinen.
Gruß
Hubert
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:

Beitrag von brandelh »

Hallo Manfred,

bitte mach das mit der MSGBOX und teste ... und danach schalte DEBUG=OFF und teste nochmal.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hubert,

entweder bin ich jetzt total neben der Spur......

oben habe ich doch

Code: Alles auswählen

#ifdef
wgvt()
#endif

stehen. Das meinst Du doch, oder?
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
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hubert,

habe alles ausprobiert, wie gewünscht. Es klappt nicht.
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
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:

Beitrag von brandelh »

Manfred hat geschrieben:Hubert,
entweder bin ich jetzt total neben der Spur......
oben habe ich doch

Code: Alles auswählen

#ifdef
wgvt()
#endif
stehen. Das meinst Du doch, oder?
NEIN, das ist der Aufruf der Funktion wgvt(), ich meinte die Definition dieser Funktion, wo ist die ?

Mit dem einfachen Aufruf von MsgBox() - wie oben beschrieben - ganz am Anfang deines Programmes kannst du sicher - ohne Debugger - testen, ob es funktioniert oder nicht. Eventuell ist auch die Einbindung des Debuggers an dem Fehler schuld, ich nutze bis 1.90.331 direkt und bei mir funktioniert es wie es sein sollte.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Die Funktion ist ein PRG, wie ich anfangs schon erwähnte. Ich will das nur nicht überall mit einbinden, wo ich sie nicht brauche. Deshalb habe ich diesen Versuch gestartet.
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
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:

Beitrag von brandelh »

Hallo Manfred,

speichere dies als PRG:

Code: Alles auswählen


* #define STAMMDATEN  // einmal mit einmal ohne testen

proc main()
    cls
    ? "Anfang"
    #ifdef STAMMDATEN
      ? "Stammdaten"
    #endif
    ? "Ende"
    wait
retrun
compiliere einmal mit
xpp ... /dSTAMMDATEN und teste
xpp ohne /d aber mit entferntem *

dann versuche es in VX, es muß einen Grund geben ...
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21189
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hubert,

jetzt habe ich verstanden, was Du vorhin von mir wolltest.

Also, ganz an den Anfang des Programmes gesetzt, erscheint die Messagebox wirklich. Ich hatte sie an den Anfang der Methode gesetzt, in der der Fehler auftaucht und da erscheint sie nicht. Also gilt der Compiler Schalter wohl nicht programmweit.
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!!
Antworten