TDM Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 hi, ich habe folgendes Problem: #define ARGC argc #ISARGC (ARGC-1) #if ISARGC > 0 #define VL_MODE argv[1] #endif #include "STDFLIFO.h" ... int _tmain (int argc, char* argv[]) { printf ("%i", VL_MODE); ... in der STDFLIFO.h stehen folgende Zeilen: #define VL_MODE_DEFAULT 0 #ifndef VL_MODE #define VL_MODE VL_MODE_DEFAULT #endif normalerweise müsste der doch auch auf das argv zugreifen können auch wenns noch nicht definiert wurde, weil es eigentlich nur nen text ersatz ist oder ? gibts nen define für argv und argc ? auf jeden fall kommt immer - egal ob ich mit parametern starte oder auch nicht die ausgabe das VL_MODE 0 ist hat einer ne idee woran das liegen könnte ? Zitieren
Guybrush Threepwood Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 Ich hab eine Das liegt daran das das aller übelster Stil ist, wie kommt man auf so einen (tschuldigung) sch****? Naja ich will damit sagen du solltest das anders lösen, vor allem ohne solche komischen define Konstrukte. Das Problem an deinem Code ist das alles was du mit #define definierst vor dem Kompilieren durch den Präprozessor im Quellcode ersetzt wird. Danach wird dann das Programm erstellt und dann rufst du es erst mit Parametern auf. D.h. die Abfrage #if ISARGC > 0 geschieht vor dem Kompilieren und somit hast du immer 0 in VL_MODE. Zitieren
TDM Geschrieben 6. Oktober 2005 Autor Geschrieben 6. Oktober 2005 ja, dass defines vor dem Compileren ausgeführt werden, weis ich ja... das ist ja der grund warum ich das genommen hatte *g* ich hab in der STDFLIFO mehrere funktionen die gleiche namen haben -> jeweils nach define werden nur speziell benötigte ausgewählt irgentwie müssen die argumente aber doch übergeben werden... ich mein wo kommen die argv's her ? so wie ich die IDE kenn werden die doch sicher von defines abgeleitet oder nicht ? Zitieren
Guybrush Threepwood Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 Nein. Weder deine IDE noch irgendwelche defines haben etwas mit den Argumenten zu tun die du dem Programm beim Starten übergibst. Wie sollten sie auch? Zitieren
TDM Geschrieben 6. Oktober 2005 Autor Geschrieben 6. Oktober 2005 naja gut ok :/ aber die main wird ja auch aufgerufen... folglich müssen ja da parameter übergeben werden... so... nun wo kommen die parameter her ? (vom programm... weis ich... aber wie werden die an die main übergeben ?) vielleicht ne andere idee wie ich ich die parameter in defines speichern kann ? Zitieren
Guybrush Threepwood Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 vielleicht ne andere idee wie ich ich die parameter in defines speichern kann ? ich gebs auf Zitieren
TDM Geschrieben 6. Oktober 2005 Autor Geschrieben 6. Oktober 2005 wie soll man sonst 2 funktionen mit gleichen parametern aber unterschiedlichen rumpf machen ? der würde doch meckern wegen mehrfach definition der funktionen... Zitieren
Klotzkopp Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 ich hab in der STDFLIFO mehrere funktionen die gleiche namen haben -> jeweils nach define werden nur speziell benötigte ausgewählt Dann musst du dich zur Compilezeit für eine entscheiden. Zur Laufzeit hast du keinen Einfluss mehr darauf. wie soll man sonst 2 funktionen mit gleichen parametern aber unterschiedlichen rumpf machen ?Mit gleichem Namen? Gar nicht. Du könntest so etwas machen: #define VL_MODE 0 #define FUNCTION FUNCTION_NULL #include "STDFLIFO.h" #define VL_MODE 1 #define FUNCTION FUNCTION_EINS #undef INCLUDE_GUARD_VON_STDFLIFO_H #include "STDFLIFO.h"[/code] Das ist allerdings ziemlich blutig und klappt nur, wenn du für jede Funktion, Variable und Typ in der Headerdatei neue Namen definierst. Mein Rat: Lass es. Der Ersteller dieser Datei hat sich vermutlich etwas dabei gedacht, als er VL_MODE als Compilezeitkonstante festgelegt hat. Zitieren
TDM Geschrieben 6. Oktober 2005 Autor Geschrieben 6. Oktober 2005 naja... ich hatte es so gemacht: #define VL_MODE VL_MODE_DEFAULT #if VL_MODE == 0 funktion1() {...} funktion2() {...} ... #elif VL_MODE == 1 funktion1() {...} funktion2() {...} ... #endif wenn ich das über variablen gemacht hätte, wär erstens aufgrund des fehlenden körpers gekommen und zweitens wär das trotzdem mehrmals definition gewesen *g* Edit: Klotzkopf... das war ja das problem... wenn ich es mit parametern mach, hab ich das problem mit der compile-/laufzeit nicht btw: ich bin ersteller dieser stdflifo ^^ (erklärt alles oder ? ) Zitieren
Klotzkopp Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 Solange du an deinen #define-Direktiven festhältst, wirst du immer dieses Problem haben. Du kannst durch Laufzeitbedingungn (Parameter) nichts mehr beeinflussen, was bereits durch Compilezeitbedingungen (defines) entschieden wurde. Wenn dein Programm kompiliert ist, enthält es nur eine Version dieser Funktionen. Daran kannst du nachträglich nichts ändern. Du musst dir etwas anderes einfallen lassen. So geht's nicht. Zitieren
TDM Geschrieben 6. Oktober 2005 Autor Geschrieben 6. Oktober 2005 achso... das wusst ich nicht :X naja... würde es theorethisch gehen, dass ich argv[1] als parameter (in einer Variable) übergeb ? weil dann könnt ich nen "if-konstrukt" nach dem parameter einbauen *g* Zitieren
Klotzkopp Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 naja... würde es theorethisch gehen, dass ich argv[1] als parameter (in einer Variable) übergeb ? weil dann könnt ich nen "if-konstrukt" nach dem parameter einbauen *g*Solange du wirklich if meinst, und nicht #if. Zitieren
nic_power Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 Hallo, Wenn es nur um den Aufruf einer Funktion in Abhängigkeit von einem Parameter (beispielsweise Kommandozeile) geht, würde ich ein Array von Funktionspointern verwenden: ACHTUNG Folgender Code enthält keinerlei Fehlerkontrollmechanismen und wurde nicht getestet! ACHTUNG Aufruf (nach dem Übersetzen): ./programmname 0 test ./programmname 1 test #include <stdio.h> int func01(char *str) { printf("function 01: Argument %s\n", str); } int func02(char *str) { printf("function 02: Argument %s\n", str); } int (*func[2])(char *) = { func01, func02 }; int main(int argc, char **argv) { func[atoi(argv[1])](argv[2]); } [/php] Nic Zitieren
Bubble Geschrieben 6. Oktober 2005 Geschrieben 6. Oktober 2005 Das liegt daran das das aller übelster Stil ist. Dem kann ich mich nur anschließen. Wenn möglich sollte man es ohne Präprozessor Anweisungen lösen. Erleichtert auch eine spätere Wartung des Programms. Zitieren
TDM Geschrieben 7. Oktober 2005 Autor Geschrieben 7. Oktober 2005 naja nic... ich habs auch ohne funktionspointer geschafft #define VL_MODE 0 #define iif(C,T,F) (C)?(T):(F) #include <iostream> using namespace std; void func(Mode) { cout << "Mode: " << Mode; } int main(int argc, char **argv) { int Mode = iif(argv-1,atoi(argv[1]),VL_MODE); func(Mode); return 0; } Muss dann halt nur noch ne funktion einbauen die abprüft ob argv[1] wirklich eine zahl ist aber sonst geht das eigentlich soweit aber trotzdem danke - kann ich gleich noch ne übung zu funktions pointern machen Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.