Problem mit Programm C nach Windows Update



  • Hallo Community,

    ich habe ein Problem mit dem Program. Es hat unter Windows XP Prof und Co. wunderbar funktioniert. Jedoch streikt es seit 3 Wochen. Das Programm funbktioniert immer noch auf anderen Rechnern, Problemlos, wenn die keine Internetupdates erhalten. Ich denke, das ein Windowsupdate das Tool zum absturz bringt.

    Ich bitte um Hilfe:

    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define HOUR     3600L
    #define MINUTE   60L
    #define DAYHOURS 24L
    #define DAY      DAYHOURS*HOUR
    
    char * getFormatedValue(int value)
    {
    	char *str;
    	char buf[14];
    	int  dec=0;
    	int  sign=0;
    
    	switch (value)	
    	{
    		case 0 : str = "00";;break;
    		case 1 : str = "01";;break;
    		case 2 : str = "02";break;
    		case 3 : str = "03";break;
    		case 4 : str = "04";break;
    		case 5 : str = "05";break;
    		case 6 : str = "06";break;
    		case 7 : str = "07";break;
    		case 8 : str = "08";break;
    		case 9 : str = "09";break;
    		default: str = ecvt(value*1.0, 2, &dec, &sign); //_gcvt(value*1.0, 2 , buf);
    	}	
    
    	return str;
    }
    
    	//***************************************************************************************
    	//***********************  Hauptprogramm  ***********************************************
    	//***************************************************************************************
    
    void main (int argc, char *argv[])
    {	
    	//Variablen
    	FILE *file;     	//Dateihandler
            FILE *konfigfile;       //Dateihandler
    	time_t timer;   	//Zeithandler -> Zeit seit 01.01.1970
    	struct tm *ltm;         //Formatierter Zeithandler
    	int error = 0;  	//Error-Flag
    	int monat;              //Temp->Monat :wird vom System im Format 0-11 geliefert
    	int tag;        	//Temp->Tag
    	int jahr;       	//Temp->Jahr Differenz zu 1900: Jahr 2002 => 102 ---> 1900 + 102 = 2002
            struct konfigsatz  { char ksjh[2];
    		       	     char ksj[2];
    			     char ksm[2];
    			     char kst[2];   };
    	struct konfigsatz awt[7];
    	char kalwo[2];
    	char dummy[80];
    	char platte[1];	//erster Uebernahmeparameter: Name der Zielplatte
    	char dir[80];	//zweiter Uebernahmeparameter: Zieldirectory
    
    	//***************************************************************************************
    	//*********************** Aufbereitung der Uebernahmeparameter **************************
    	//***************************************************************************************
    
    	sscanf(argv[1],"%s",&platte);
    	sscanf(argv[2],"%s",&dir);
    	//printf("\nPlatte     : %s \n",platte);
    	//printf("Directory  : %s \n",dir);
    
    	//***************************************************************************************
    	//*********************** Auswertetage aus Konfigfile lesen *****************************
    	//***************************************************************************************
    
            konfigfile = fopen ("konfig.txt","r"); 
    
    	fgets(dummy,81,konfigfile);
    	fgets(dummy,81,konfigfile);
    	for (int i=0;i<=6;i++)
    	{    fgets(awt[i].ksjh,3,konfigfile);
    	     fgets(awt[i].ksj,3,konfigfile);
    	     fgets(dummy,2,konfigfile);
    	     fgets(awt[i].ksm,3,konfigfile);
    	     fgets(dummy,2,konfigfile);
    	     fgets(awt[i].kst,3,konfigfile);
    	     fgets(dummy,36,konfigfile);
    	     fgets(dummy,2,konfigfile);
    	}
    	fgets(kalwo,3,konfigfile);
    
    	fclose(konfigfile);
    
    	//***************************************************************************************
    	//*********************** opfp-call.bat generieren **************************************
    	//***************************************************************************************
    
    	file = fopen ("opfp-call.bat","w");
    
    	fputs("@echo off\n", file);
    	fputs("echo **************************************************************\n", file);
    	fputs("echo ***  automatisches Generieren der opfp-Aufrufs-Batchdatei  ***\n", file);
    	fputs("echo **************************************************************\n", file);
    	fprintf(file,"%s:\n",platte);
    	fprintf(file,"cd \\%s\n",dir);
    	fputs("call opfp-kern.bat ", file);
    
    	//Erste Schleife: erster Tag aus Konfigdatei und die 6 Folgetage im Format YYYY MM DD
    
    	for (int i=0;i<=6;i++)
    	    fprintf(file,"%2.2s%2.2s %2.2s %2.2s ",awt[i].ksjh,awt[i].ksj,awt[i].ksm,awt[i].kst);
    
    	//Zweite Schleife: erster Tag aus Konfigdatei und die 6 Folgetage im Format YYMMDD
    
    	for (int i=0;i<=6;i++)
    	    fprintf(file,"%2.2s%2.2s%2.2s ",awt[i].ksj,awt[i].ksm,awt[i].kst);
    
    	//Kalenderwoche schreiben
    
    	fprintf(file,"%2.2s ",kalwo);
    
    	//bestimmen des aktuellen Datums fuer den Protokolldateinamen
    
    	time(&timer);	
    
    	ltm = localtime(&timer);
    
    	if (ltm==NULL)
    	{
    		fputs("\n\nERROR: aktueller Tag konnte nicht ermittelt werden!", file);
    		error = 1;
    	}
    	else
    	{	
    		monat = ltm->tm_mon+1;
    		tag   = ltm->tm_mday;
    		jahr  = ltm->tm_year;
    
    		//Aktuellen Tag als Dateinamen im Format ">opfp-YYYYMMDD.log" ausgeben
    		fputs(">opfp-20",file);
    		fputs(getFormatedValue(jahr-100),file);
    		fputs(getFormatedValue(monat),file);
    		fputs(getFormatedValue(tag),file);
    		fputs(".log\n",file);
    
    	}	
    	fclose(file);
    	//***************************************************************************************
    	//*********************** opfp-call.bat generieren ENDE *********************************
    	//***************************************************************************************
    
    }
    


  • Dat Teil läuft sogar bei mir auf dem Eierwärmer, irgendwas machst du falsch...



  • hehe

    das läuft seit 6-8 jahren problemlos. nur auf rechnern die am netzwerk hängen und updates empfangen, läufts plötzlich nicht mehr... auf einem anderen rechner, der keine neuen updates hat, läuft es nicht 😞

    ich bin verwirrt.

    das der code nicht der schönste ist, ist klar, aber wo ist der bug *grml


  • Mod

    Nanu, wo ist mein Beitrag denn hin? Habe ich den versehentlich nicht abgeschickt? 😕

    Was ich sagen wollte: Was meinst du genau mit "funktioniert nicht"?

    Außerdem schmeißt der Code bei mir zahlreiche Compilerwarnungen, könnte irgendein undefiniertes verhalten sein.



  • sekunde gebe gleich mal nen scrrener



  • das der compiler herummeckert ist mir auch schon bewusst, jedoch lässt sich die exe z.b. auf win xp mit sp2 ohne probs laufen, mit sp3 auch, nur nicht mit updates der letzten monate...



  • muss passen hab hier 64bit win7,... muss auf screener bis morgen warten...

    normal müsste nur ein fehler kommen, das kein aktueller tag ermittelt werden konnte..



  • korrektur, es kommt die meldung, xyz.exe funktioniert nicht mehr...

    https://fotoalbum.web.de/gast/czura/help



  • habe eben noch die ereignisanzeige von windows mit hochgeladen, die zu dem fehler kommt. soweit ich mich entsinne ist sie bei windows 7 (was ich jetzt benutzte) und windows xp gleich.



  • Wie sieht denn die konfig.txt aus?



  • konfig.txt?



  • Na die, die das Programm zu lesen versucht. Wenn hierbei

    konfigfile = fopen ("konfig.txt","r");
    
        fgets(dummy,81,konfigfile);
        fgets(dummy,81,konfigfile);
        for (int i=0;i<=6;i++)
        {    fgets(awt[i].ksjh,3,konfigfile);
             fgets(awt[i].ksj,3,konfigfile);
             fgets(dummy,2,konfigfile);
             fgets(awt[i].ksm,3,konfigfile);
             fgets(dummy,2,konfigfile);
             fgets(awt[i].kst,3,konfigfile);
             fgets(dummy,36,konfigfile);
             fgets(dummy,2,konfigfile);
        }
        fgets(kalwo,3,konfigfile);
    
        fclose(konfigfile);
    

    keine konfig.txt vorhanden ist, kann das ja nur in die Hose gehen.



  • auch ohne diese datei startet das programm auf anderen rechnernm, bringt eben eine fehlermeldung. aber auf den neueren stürzt es im augenblick des aufrufes ab,....



  • Compiler-Warnungen kommen im Regelfall nicht ohne Grund.Die sollte man erst
    mal wegmachen - Das haben wir schon in den 80gern unter DOS/VSE auf der
    S/370 so gehandhabt.



  • if( !konfigfile ) perror("konfig.txt"),exit(EXIT_FAILURE);
    

    würde schon mal helfen.
    fgets liefert einen Returnwert, der ist für Fehlerbehandlung gedacht. Und genau dieser Fall ist bei dir eingetreten. Bist selbst Schuld, wenn du ihn nicht benutzt. Wie schon erwähnt; entweder ist die Datei gar nicht da oder es steht was anderes drin, als du erwartest oder deine argv-Parameter sind anders als du erwartest oder ...



  • KON ----HIER STEHT WAS DRIN-----------
    S10 ---HIER STEHT AUCH WAS DRIN---
    1980 09 27   ---1.Tag im Format jjjj mm tt---
    1980 09 28   ---2.Tag im Format jjjj mm tt---
    1980 09 29   ---3.Tag im Format jjjj mm tt---
    1980 09 30   ---4.Tag im Format jjjj mm tt---
    1980 10 01   ---5.Tag im Format jjjj mm tt---
    1980 10 02   ---6.Tag im Format jjjj mm tt---
    1980 10 03   ---7.Tag im Format jjjj mm tt---
    39 ---nn.Kalenderwoche im Format ww---
    


  • Wie man richtig (d.h. portabel, robust und fehlertolerant) aus einer Datei liest, siehst du z.B. unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-273406.html. Das Beispiel habe ich erst vor kurzem geliefert, scheinbar scheint der Anwendungsfall "wie lese ich meine Daten aus einer Datei" häufig vorzukommen, aber oft auch suboptimal gelöst.
    Auf dein Bsp. angewandt also in etwa:

    char zeile[100]; /* Zeilenlänge max. 99 */
    int i=0;
    
    FILE *fp = fopen("konfig.txt","rt");
    if( !fp )
      perror("konfig.txt"),exit(1);
    
    *kalwo=0;
    while( fgets(zeile, sizeof zeile, fp) )
    {
      if( i==7 && !*kalwo )
        if( 1!=sscanf(zeile,"%2[0-9]",kalwo) )
          *kalwo=0;
      if( i<sizeof awt/sizeof*awt )
        if( 4==sscanf(zeile,"%2[0-9]%2[0-9] %2[0-9] %2[0-9]",awt[i].ksjh,awt[i].ksj,awt[i].ksm,awt[i].kst) )
          ++i;
    }
    
    printf("\n%d Zahlen wurden gelesen",i);
    fclose(fp);
    

    Ich stelle grade fest, dass deine Dimensionierung der o.g. Felder zu gering ist. Statt [2] muss es natürlich mind. [3] heißen, da du mit Stringoperationen darauf hantierst. Eigentlich hätte es schon immer knallen müssen.


Anmelden zum Antworten