Zufällig eine Konstante aussuchen



  • Original erstellt von guard:
    ...
    Ich wünsch dir nen guten Rutsch ...

    Danke - Dir auch. Und wenn noch Fragen sind, frag einfach oder mail. np. 🙂



  • 5. die ganzen Klammern bei return und sizeof sind zu einem großen Teil unnötig und können gefährlich werden.

    Das verstehe ich nicht. Wie kann das zu gefahren führen?



  • Original erstellt von <close>:
    Wie kann das zu gefahren führen?

    Vertippe dich bei einem 'return (12);' und schreibe 'retrun (12);'. Das Programm kompiliert nach C89 fehlerfrei. Beim Binden bekommst Du im günstigsten Fall einen Fehler; es kann allerdings passieren, dass Du eine Funktion hast, die retrun heißt aber in einer anderen Übersetztungseinheit definiert ist. Dein Programm liefert nun absolut falsche Ergebnisse und Du suchst den Fehler tagelang ... Bei 'retrun 12;' wäre das nicht passiert. Bei sizeof das gleiche.

    Außerdem ist es nicht sehr sinnvoll einen Ausdruck zusätzlich zu Klammern. Zum einen der Lesbarkeit wegen (((((1))) + (((2))) + (((3)))) oder 1 + 2 + 3) zum anderen gibt es in C immer noch so etwas wie eine maximale Klammerungstiefe :).



  • Original erstellt von mady:
    *1. Du castest einen void-Zeiger. Das kann(!) zu Problemen führen.
    2. fopen(..., "rt") ist undefiniertes Verhalten.
    3. sizeof(char) ist IMMER 1.
    4. Dein Programm verursacht IMO 'Memory Leaks'. Als mit malloc() besorgter Speicher wird nicht immer freigegben.
    5. die ganzen Klammern bei return und sizeof sind zu einem großen Teil unnötig und können gefährlich werden.
    6. Bezeichner sollten nicht mit einen _ starten.
    7. fseek() in Textdateien kann in's Auge gehen....
    8. Bufferüberläufe bei Eingaben sind möglich ...
    **

    So ... I'm back 😉

    Zu 1.: O.K. hast recht, obwohl manche Compiler eine Warnung auspucken, wenn man nicht castet
    Zu 2.: Geb ich dir auch recht. Wer weiß was da wieder in mir vorging
    Zu 3.: Kannst du mir das beweisen ? 🙄
    Zu 4.: Hab ich behoben
    Zu 5.: Sorry aber so hab ich mir das angeeignet 😉
    Zu 6.: Wieder was dazugelernt
    Zu 7.: Was Besseres fiehl mir da nicht ein ausser fgetpos & fsetpos und die mag ich nicht 😉
    Zu 8.: Bufferüberläufe habe ich jetzt weitestgehend vermieden

    Und genau zu dem 8ten Punkt hab ich eine Funzion readUString, die soweit einließt, bis ein man Enter drückt. Allerdings werden die Eingaben ohne Leerzeichen eingelesen. Ich geb erst mal die Funzion durch:

    int readUString( char** dest )
    {
       int ch = 0, slen = 0;
    
       *dest = malloc( 3 * sizeof( char ) );
       if( *dest == NULL )
       {
          perror( "QG" );
          if( *dest )
             free( *dest );
    
          return( -1 );
       }
    
       while( ( ch = fgetc( stdin ) ) != EOF )
       {
          if( ch == '\n' )
          {
             *dest = realloc( *dest, ( slen + 1 ) * sizeof( char ) );
    
             if( *dest != NULL )
             {
                ( *dest )[slen++] = '\0';
                return( slen );
             }
    
             else
             {
                if( *dest )
                   free( *dest );
    
                perror( "in readString" );
                return( -1 );
             }
          }
    
          if( isalnum( ch ) )
          {
             *dest = realloc( *dest, ( slen + 1 ) * sizeof( char ) );
    
             if( *dest != NULL )
             {
                ( *dest )[slen++] = ( char )ch;
             }
    
             else
             {
                if( *dest )
                   free( *dest );
    
                perror( "in readString" );   
                return( -1 );
             }
          }
       }
    
       return( -1 );
    }
    

    aufgerufen wird sie dann in einer anderen Funzion mit:

    /* ... */
    unsigned int lenUAnswer;
    char* UAnswer;
    /* ... */
    if( ( lenUAnswer = readUString( &( UAnswer ) ) ) == -1 )
    {
       fprintf( stderr, "%s: Fehler beim Einlesen der Antwort.\n", argv[0] );
       perror( "QG" );
       return( EXIT_FAILURE );
    }
    /* ... */
    

    btw: ich hab noch eine Funzion freeUString die den Speicher wieder freigibt 😉

    So ... nun zum Problem: es wird die Eingabe eingelesen -> gut, jedoch gespeichert ohne Leerzeichen -> schlecht. Bin bis jetzt noch auf keinen richtigen Pfad gekommen, wie man des anstellen könnte.

    Kann da jemand helfen ?

    thx mal wieder im voraus 🙂



  • Original erstellt von guard:
    **Zu 3.: Kannst du mir das beweisen ? 🙄
    **

    Koennen schon, wollen nicht.
    Es ist so - bin aber zu faul irgendwo einen Beweis zu suchen. Vertrau uns einfach 😉



  • Original erstellt von Shade Of Mine:
    [...]Vertrau uns einfach 😉

    ähem ... nagut. Schweren Herzens werd ich euch dann mal vertrauen. Gucke selbst aber auch noch mal in ein paar Dokus nach :p



  • Original erstellt von guard:
    [quote]Original erstellt von Shade Of Mine:
    [qb][...]Vertrau uns einfach 😉

    ähem ... nagut. Schweren Herzens werd ich euch dann mal vertrauen. Gucke selbst aber auch noch mal in ein paar Dokus nach :p[/QB][/QUOTE]Also - wenn's soooo schwer ist, dann lass Deinen Compiler den Sachverhalt beweisen:

    printf("-> %d", sizeof(char) * 100);
    


  • Original erstellt von mady:
    **Also - wenn's soooo schwer ist, dann lass Deinen Compiler den Sachverhalt beweisen:

    printf("-> %d", sizeof(char) * 100);
    

    **

    Also ich wollte euch hier echt nicht irgenwie anzweifeln, aber es gibt doch fast immer irgendwelche Ausnahmen. In diesem Fall aber anscheinend doch nicht 😃 ...

    Allerdings hab ich bisher immer noch keine Lösung für mein Problem mit dem Leerzeichen in der obigen Funktion 😞



  • Wieso rufst du sooft realloc auf? das ist doch lahm. arbeite zB immer mit 100er Bloecken oder so...

    isalnum() ist nur bei buchstaben und zahlen true - brauchst du vielleicht noch ein isspace()? oder was vielleicht besser waere -> isprint()?



  • Original erstellt von Shade Of Mine:
    **Wieso rufst du sooft realloc auf? das ist doch lahm. arbeite zB immer mit 100er Bloecken oder so...

    isalnum() ist nur bei buchstaben und zahlen true - brauchst du vielleicht noch ein isspace()? oder was vielleicht besser waere -> isprint()?**

    Also wenn du mir das so warm unter die Nase reibst ... haste ja auch irgendwie recht. Gut gut ... werd denn mal weiter dran herum werkeln 😉

    MfG


Anmelden zum Antworten