Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Ausführen von C-Programm funktioniert nicht

Nobody666 / 16 Antworten / Baumansicht Nickles

Hallo,


habe hier einen kleinen Ausschnitt von einem C-Programm. Will als Parameter eine Datei übergeben in Form -dxxx  xxx steht hierbei für den Dateinamen, sollte aber so sein, dass geprüft wird ob ein - steht, danach ob ein d steht und ich dann den Dateinamen habe, den ich später im Programm einlesen muß. Compilieren zeigt keinen Fehler, beim Ausführen mit den Parametern -dabcd zum Beispiel, bricht er mit der Fehlermeldung exe hat Fehler verursacht und wird abgebrochen ab. Wer kann helfen????????


 int main (int argc, char *argv[] ) {
   
   //Parameteruebergabe bei Programmaufruf
 for (i=1; i<argc;i++)
  {
  if ((argv[i] [0]) == '-')
   {
   switch ((argv[i]) [1])
    {
        case 'd': 
    if(sscanf(argv[i]+2,"%c",&Byte_name) !=1)
     FileSpecified=0;    
    else           
     FileSpecified=1;
     for (int j=2;int halt=1;j++)
      {
      sscanf(argv[i]+j,"%c",&Byte_name);
      Byte_name1=Byte_name;
      if(Byte_name1 !='-')
       {
        Datei_name[j-2]=Byte_name1;
       }
       else
       {
        halt=1;
        Datei_name[j-3]='\0';
        break;
       }
      }
      strcpy(File_name,Datei_name);
      strcat(File_name,".lb0");;
      break;
          
      }
     }
    }


 


will danach die Datei einlesen mit:


 if ( (werte = fopen(File_name,"rb"))==NULL)
 {
  printf("Fehler beim Lesen der Datei %s",File_name);
  exit(0);
 }
 else
  { 
  ...........                                      kann aber leider noch nicht überpruefen, ob dass dann auch funktioniert, da ich ja nicht soweit komme.


 


mfg


Nobody

bei Antwort benachrichtigen
Nobody666 Nachtrag zu: „Ausführen von C-Programm funktioniert nicht“
Optionen

Servus,
hier noch die Variablen:
char Byte_name=' ';
char Byte_name1;
char Datei_name[12];
int FileSpecified=0;
int halt;
char File_name[12];

bei Antwort benachrichtigen
mr.escape Nobody666 „Ausführen von C-Programm funktioniert nicht“
Optionen

-Variablen i und werte einfügen.
-"FileSpecified=0;" vor die for schleife einfügen.
-Diesen case block nehmen:
case 'd':
if(argv[i][2]){
sscanf(&argv[i][2], "%[^\0]", File_name);
strcat(File_name,".lb0");
FileSpecified=1;
}
break;
-vor dem letzten if block das einfügen:
if (!FileSpecified){
printf("Fehler, kein Dateiname angegeben.");
exit(0);
}
-und vor allem File_name deutlich vergrössern (12 zeichen, d.h. 11+die '\\0' sind viel zu wenig!!!)!!
Der laufzeitfehler kommt wahrscheinlich von der extrem seltsamen for schleife:
for (int j=2;int halt=1;j++)
sollte wohl so lauten:
for (int j=2, halt=0; !halt && argv[i][j]; j++)

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 mr.escape „-Variablen i und werte einfügen. - FileSpecified 0 vor die for schleife...“
Optionen

Super, danke mr.escape
Noch eine Frage. Will nun die Datei vergleichen, und dann entsprechend eine Variable setzen, im Beispiel: rufe die exe mit -d1409ab auf, dann soll Anzahl=1 sein, wenn ich mit -d123ca aufrufe Anzahl=2. Bringt mir immer Fehlermeldung, dass ich so nicht vergleichen kann. Kannst du mir da bitte weiterhelfen???
Danke
mfg Nobody

bei Antwort benachrichtigen
mr.escape Nobody666 „Super, danke mr.escape Noch eine Frage. Will nun die Datei vergleichen, und dann...“
Optionen

Wie jetzt?
Bei
proggy.exe -d1409ab
soll anzahl=1 sein und bei
proggy.exe -d123ca
anzahl=2? oder eher bei
proggy.exe -d1409ab -d123ca
???
Im zweiten fall muss die zeile
FileSpecified=1;
zu
FileSpecified++;
werden (FileSpecified ist dann die anzahl). Der dateiname ist aber nur der vom letzten file.
Sollen alle dateinamen gespeichert werden, muss aus:
char File_name[12];
z.b. folgendes werden:
char File_name[MAXFILES][256];
wobei MAXFILES die maximal anzahl dateinamen ist (z.b. #define MAXFILES 32).
Aus:
sscanf(&argv[i][2], "%[^\\0]", File_name);
strcat(File_name,".lb0");
wird dann:
sscanf(&argv[i][2], "%[^\\0]", File_name[FileSpecified]);
strcat(File_name[FileSpecified],".lb0");
Die dateinamen finden sich dann unter File_name[0] bis File_name[FileSpecified-1]. FileSpecified darf aber maximal MAXFILES werden, d.h. nach dem switch block kommt:
if(FileSpecified>=MAXFILES) break;//kann auch in die for anweisung rein

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 mr.escape „Wie jetzt? Bei proggy.exe -d1409ab soll anzahl 1 sein und bei proggy.exe -d123ca...“
Optionen

Servus,
nein, so kompliziert brauche ich es gar nicht. Es wird immer nur ein Dateiname gleichzeitig gespeichert.Der Variablenname Anzahl ist unglücklich gewählt. Im Programmverlauf muß ich nur öfters an verschiedenen Stellen unterscheiden, welche Datei gelesen worden ist. Habe öfters stehen: if (Anzahl==1) {...} oder dann if (Anzahl==2) {...}. Wie mache ich das am geschicktesten?

bei Antwort benachrichtigen
mr.escape Nobody666 „Servus, nein, so kompliziert brauche ich es gar nicht. Es wird immer nur ein...“
Optionen

Sorry, verstehe dein problem nicht im geringsten!

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 Nachtrag zu: „Ausführen von C-Programm funktioniert nicht“
Optionen

Hi,
also, will folgendes machen, was aber so leider nicht funktioniert:

if(strcmp(File_name,"1419101.dat")==0) {
Anzahl=1;}

if(strcmp(File_name,"1409101.dat")==0) {
Anzahl=2; }

wenn ich bei Programmaufruf den Parameter -d1419101 mitgebe, dann will ich die Variable Anzahl gleich 1 setzen, falls Aufruf -d1409101 dann soll Anzahl gleich 2 werden

bei Antwort benachrichtigen
mr.escape Nobody666 „Hi, also, will folgendes machen, was aber so leider nicht funktioniert: if...“
Optionen

Evtl. noch strcmp durch _stricmp (oder equivalent) ersetzen, das ist dann unabhängig von der klein-GROSS-schreibung.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 Nachtrag zu: „Ausführen von C-Programm funktioniert nicht“
Optionen

Sorry, funktioniert!
Danke!!!!
was bedeutet eigentlich "%[^\0]" genau, beim Compilieren bringt er mir eine Warnung:
no closing `]' for `%[' format
und:
embedded `\0' in format

mfg

Nobody

bei Antwort benachrichtigen
mr.escape Nobody666 „Sorry, funktioniert! Danke!!!! was bedeutet eigentlich 0 genau, beim Compilieren...“
Optionen

Die korrekte form ist "prozent, eckige klammer auf, accent circonflex, backslash, null, eckige klammer zu". Das problem entsteht hier beim posting, wenn man diese sonderzeichen nicht richtig angibt. Ausserdem ist die vorschau diesbezüglich ungenau.
Die bedeutung ist die aufforderung an scanf, alles bis zum ersten null-charackter einzulesen, also das, was bei c-strings üblich ist. Wenn ich es mir recht überlege ist es eigentlich überflüssig und sollte durch z.b.
strcpy(argv[i]+2, File_name);
ersetzt werden. Hatte mal eine variante, die nicht auf den null-charakter enden musste und dort war es sinnvoll. Strcpy() ist hier aber besser.

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
mr.escape Nachtrag zu: „Die korrekte form ist prozent, eckige klammer auf, accent circonflex, backslash,...“
Optionen

Muss natürlich:
strcpy(File_name, argv[i]+2);

heissen!

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 Nachtrag zu: „Ausführen von C-Programm funktioniert nicht“
Optionen

Servus, nun kommt doch ein neues Problem. Programm läuft unter gcc kompiliert richtig und ohne Probleme. Bin jedoch gezwungen den QC2 zu benutzen, unter diesem schreibt er mir immer die Meldung T05:Fehler beim Lesen der Datei .lb0. Mag anscheinend irgendwas nicht. Bitte um Hilfe!!

bei Antwort benachrichtigen
Nobody666 Nachtrag zu: „Servus, nun kommt doch ein neues Problem. Programm läuft unter gcc kompiliert...“
Optionen

sorry,
Programmausschnitt vergessen:
int main (int argc, char *argv[] ) {
for (i=1; i if ((argv[i] [0]) == '-') {
switch ((argv[i]) [1]) {
case 'd':
if(argv[i][2]) {
sscanf(&argv[i][2], "%[^\0]", File_name);
strcat(File_name,".lb0");
FileSpecified=1;
}
break;
}
}
}



if(strcmp(File_name,"1419101.lb0")==0) {
Anzahl=1;}

if(strcmp(File_name,"1409101.lb0")==0) {
Anzahl=2; }

NextFirstSerialNumber=SerialNumber+1; //naechste Serialnumber
NextSecondSerialNumber=SerialNumber+2; //uebernaechste Serialnumber

if ((fp=fopen("serial.dat","w"))==NULL)
exit(0);
if(!StartingNumberSpecified)
{
fprintf(fp,"T05:Es wurde keine Seriennummer gelesen!\n"); //Sicherstellung, dass SerialNumber gelesen wurde
exit(0);
}
//einlesen der lb0 Datei zur Pruefsummenberechnung
if ( (werte = fopen(File_name,"rb"))==NULL) //Pointer auf Datei wird in werte gespeichert
{
fprintf(fp,"T05:Fehler beim Lesen der Datei %s",File_name);
exit(0);
}
else
{ ......

bei Antwort benachrichtigen
mr.escape Nobody666 „sorry, Programmausschnitt vergessen: int main int argc, char argv for i 1 i if...“
Optionen

Liegt vielleicht am scanf, benutze einfach strcpy, wie ich es oben beschrieben habe (allerding anders herum!).
sscanf(&argv[i][2], "%[^\0]", File_name);
ersetzen durch
strcpy(File_name, argv[i]+2);

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 Nachtrag zu: „Ausführen von C-Programm funktioniert nicht“
Optionen

Hallo,
also hat anscheinend an dem sscanf gelegen, jetzt funktioniert es!! Das mit dem Unterstrich bei _strcmp funktioniert nicht, macht aber nichts.
DANKEEEEEEEE!!!!!! an mr. escape

bei Antwort benachrichtigen
mr.escape Nobody666 „Hallo, also hat anscheinend an dem sscanf gelegen, jetzt funktioniert es!! Das...“
Optionen

Es muss heissen _stricmp

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen