ia.exe hat fehler verursacht und wurde geschlossen. Warum?



  • Hi!
    Ich hab keine ahnung warum die einen fehler verursacht,hab win2k, compiler is DevCpp und hier mein code:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define FULL_INTELLIGENCE 25
    
    int main(int argc, char *argv[])
    {
      system("COLOR F0");
      int i;
      int intelligence;
      int procent;
      char strbuild;
      intelligence = 0;
      printf("Welcome!\n\n\n");
      printf("This is free_willi, the AI-Bot");
      sleep(600);
      system("CLS");
      printf("Please wait..\n");
      sleep(500);
      printf("Loading Artificial-Intelligence\n");
      printf("    "); 
      for (i=0;;i++) 
      {
        intelligence++;
        procent = intelligence*FULL_INTELLIGENCE;
        procent = procent/100;
        strbuild = "%d";
        if( procent < 10 )
        {
          strbuild = "0%d";
        }
        sprintf(strbuild, "%d", procent);
        printf("\b\b\b\b%s%|", strbuild); //Section 1 
        sleep(200); 
        printf("\b\b\b\b%s%/", strbuild); //Section 2 
        sleep(200); 
        printf("\b\b\b\b%s%-", strbuild); //Section 3 
        sleep(200); 
        printf("\b\b\b\b%s%\\", strbuild);//Section 4 
        sleep(200); 
        printf("\b\b\b\b%s%|", strbuild); //Section 5 
        sleep(200); 
        printf("\b\b\b\b%s%/", strbuild); //Section 5 
        sleep(200); 
        printf("\b\b\b\b%s%-", strbuild); //Section 6 
        sleep(200); 
        printf("\b\b\b\b%s%\\", strbuild);//Section 7 
        sleep(200);
        if( intelligence == FULL_INTELLIGENCE )
        {
          printf("\nLoading complete..");
          break;
        }
      }
      sleep(1000);
      printf("Angesichts dessen, dass ich einen freien willen habe:\n");
      printf("Ich habe mich dazu entschlossen, für dich nicht verfuegbar zu sein.\n");
      printf("Sorry, aber is so ;-)\n\n");
      printf("Press any key..");
      system("PAUSE>NUL");	
      return 0;
    }
    

    Der fehler tritt irgendwo am anfang der schleife bzw. in der schleife auf. Der compiler meldet keine fehler.

    Woran kann das liegen?



  • Hallo,

    so auf den ersten Blick: steht das hier

    char strbuild;
    

    wirklich so im Quelltext, und der Compiler gibt keinen Fehler hier

    strbuild = "%d";
    

    und in der folgenden for-Schleife aus? Das ist falsch, das mußt du anders schreiben, z.B.:

    char strbuild[255];
    

    und

    strcpy(strbuild, "%d"); /* statt strbuild = "%d"; */
    

    bzw.

    strcpy(strbuild, "0%d"); /* statt strbuild = "0%d"; */
    

    in der for-Schleife, aber so ganz verstehe ich die Logik deines Programms nicht, denn nach der Zuweisung zu strbuild wird dann sofort wieder der Wert überschrieben mit dem sprintf, also da mußt du auch etwas ändern.

    MfG



  • Hmm...
    Also, ich hab jetztgerade auch rausgefunden, es ist die zeile mit sprintf..

    Also, was ich eigendlich erreichen will, ist das strbuild den wert von procent hat, und wenn der wert aber nur 2stellig ist, dann soll eine 0 vorne dran..

    und muss ich denn das %d nicht schon im string haben, um es zu ersetzen, bzw, das muss doch an der stelle sein, wo die zahl erscheinen soll, oder nicht?

    Also, wenn cih den string habe text = "Hallo, es gibt %x elemente" und will %x durch den wert der int zahl "wert" ersetzen, wie mach ich das dann?



  • ah ja, jetzt habe ich verstanden, was du erreichen wolltest. Trotzdem liegt es nicht nur am sprintf, auch die anderen Änderungen sind wichtig. Um das Format zu kontrollieren, kannst du eine weitere Variable einfügen, z.B. strFormat:

    char strFormat[255] = {0,};
    

    und dann immer dort das gewünschte Format ablegen:

    strcpy(strFormat, "%d");
    

    das kann man dann in sprintf verwenden:

    sprintf(strbuild, strFormat, procent);
    

    brauchst du eine andere Formatierung, z.B. immer drei Stellen (mit führenden Nullen, wenn nötig), dann einfach vorher ein strcpy:

    strcpy(strFormat, "%.3d");
    

    und wieder der sprintf-Aufruf von oben.

    Genauso geht das mit einem Text:

    strcpy(strFormat, "Hallo, es gibt %d Elemente");
    

    und wieder

    sprintf(strbuild, strFormat, 25); /* "Hallo, es gibt 25 Elemente" */
    

    Noch etwas: das hier

    procent = procent/100;
    

    ist nur eine Integer-(Ganzzahl)Division, es wird sich also nicht bei jedem Durchlauf das Ergebnis ändern, aber vielleicht ist das so gewollt.

    MfG



  • Hmm..
    danke, ok, hab ich jetzt verstanden, ahbs jetzt trozdem anderst gemacht^^
    Aber dasmit der rechnung würde mcih ncoh interessieren, denn bei meiner prozentrechnung bringt er wie du gesagt hast nicht den aktuellen prozentwert.
    Hier nochmal mein quellcode:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define FULL_INTELLIGENCE 25
    
    int main(int argc, char *argv[])
    {
      system("COLOR F0");
      int i, intelligence = 0, procent;
      char* procentmark = "%";
      printf("Welcome!\n\nThis is free_willi, the AI-Bot\n\n\nPlease wait");
      for(i=0;i<3;i++)
      {
      sleep(300);
      printf(".");
      }
      sleep(2000);
      system("CLS");
      printf("This is free_willi, the AI-Bot\n\n\n");
      sleep(800);
      printf("Loading artificial-intelligence:\n");
      for (i=0;;i++) 
      {
        intelligence++;
        procent = intelligence/FULL_INTELLIGENCE;
        procent = procent*100;
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b| - %d%s done..", procent, procentmark); //Section 1
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b/ - %d%s done..", procent, procentmark); //Section 2
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b- - %d%s done..", procent, procentmark); //Section 3
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b\\ - %d%s done..", procent, procentmark);//Section 4 
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b| - %d%s done..", procent, procentmark); //Section 5 
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b/ - %d%s done..", procent, procentmark); //Section 5 
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b- - %d%s done..", procent, procentmark); //Section 6 
        sleep(200); 
        printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\bb\b\b\b\b\b\\ - %d%s done..", procent, procentmark);//Section 7 
        sleep(200);
        if( intelligence == FULL_INTELLIGENCE )
        {
          printf("\nLoading complete..\n\n\n");
          break;
        }
      }
      sleep(1000);
      printf("Angesichts dessen, dass ich einen freien willen habe:\n");
      printf("Ich habe mich dazu entschlossen, fuer dich nicht verfuegbar zu sein.\n");
      printf("Sorry, aber is so ;-)\n\n\n");
      printf("Press any key to quit..");
      system("PAUSE>NUL");	
      return 0;
    }
    


  • wenn du mit integerzahlen rechnest ignoriert der den rest

    also 10/7 ist 1 und 3/5 ist 0

    wenn du das nicht willst hilft ein cast oder explizietes angeben als flieskommazahl

    so

    procent = 100.0*intelligence/FULL_INTELLIGENCE;
    

    oder so

    procent = (double)100*intelligence/FULL_INTELLIGENCE;
    


  • Windalf hat dir ja schon die Lösung für das Prozent-Problem genannt, du solltest dann auch noch den Format-Kenner von "%d" auf "%f" ändern (und entsprechend die Stellen formatieren), und noch eine kleine Vereinfachung: du mußt nicht unbedingt das "procentmark" definieren, man kann das auch direkt unterbringen (%%):

    printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b| - %d%% done..", procent); //Section 1
    

    man kann auch noch die printf's in eine eigene Schleife packen, aber das nur als Anregung.

    MfG



  • Danke, so jetzt hab ich das erstmal alles verstanden 😉
    *buh* Da machst 1,5 jahre nix in C und hast alles verlernt^^


Anmelden zum Antworten