Zum Inhalt springen

Probleme mit Argumenten


Empfohlene Beiträge

Geschrieben

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 ?

Geschrieben

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.

Geschrieben

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 ?

Geschrieben

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 ?

Geschrieben

:P

wie soll man sonst 2 funktionen mit gleichen parametern aber unterschiedlichen rumpf machen ?

der würde doch meckern wegen mehrfach definition der funktionen...

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

Geschrieben

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 ? :P)

Geschrieben

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.

Geschrieben

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*

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

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

Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...