Frage zur Analyse eines Programms



  • Hi,

    Zu fogendem Programm muss ich nun eine Analyse schreiben, das heißt ich muss beschreiben, was im Stack und im Heap während der Laufzeit des Programms passiert. Das Hauptproblem ist dabei die Funktion "void Partition". Kann mir jemand erklären, was in der Vorschleife von "void Partition" passiert?

    Gegeben ist das folgende Programm

    #include<stdio.h> 
    #include<stdlib.h> 
    
    void CountEvensAndOdds ( int array[], int n, int *numEvens, int *numOdds); 
    void Partition (int array[], int n, int **evens, int *numEvens, 
                                           int **odds,int *numOdds);
    
    int main(void) 
    { 
       int arr[] = {7,4,13,8}; 
       int *evens, *odds; //Zeiger Felder mit den ungeraden und geraden Zahlen. 
       int numEvens = 0; 
       int numOdds = 0, i = 0; 
    
       Partition(arr, 4, &evens, &numEvens, &odds, &numOdds); 
    
       printf("Das Feld enthaelt %d gerade und %d ungerade Zahlen\n\n", numEvens, 
              numOdds); 
       printf("Ausgabe der geraden Zahlen: \n"); 
       for(i=0; i < numEvens; i++) 
          printf("%d\n", evens[i]); 
       printf("Ausgabe der ungeraden Zahlen: \n"); 
       for(i=0; i < numOdds; i++) 
          printf("%d\n", odds[i]); 
    
       // Felder fuer die geraden und ungeraden Zahlen liegen auf dem Heap und 
       // muessen freigegeben werden. 
       free(evens); 
       free(odds); 
    
       getch();
       return 0; 
    } 
    
    void Partition (int array[], int n, int **evens, int *numEvens, 
                                          int **odds, int *numOdds) 
    {
         int i = 0,
             a = 0,
             b = 0;
    
         CountEvensAndOdds(array, n, numEvens, numOdds);
    
         *evens = (int*) malloc (*numEvens * sizeof(int)); 
         *odds= (int*) malloc (*numOdds * sizeof(int)); 
    
         for(i = 0; i < n; i++) 
         { 
            if(array[i]%2 == 0) 
            { 
                (*evens)[a]=array[i];
                a += 1; 
    
            } 
            else 
            { 
                (*odds)[b]=array[i]; 
                b += 1; 
            }    
         } 
    } 
    
    void CountEvensAndOdds(int array[], int n, int *numEvens, int *numOdds)
    {
        int i; 
    
        for (i = 0; i < n; i++)
        {
            array[i];
            if(array[i]%2 == 0)
            {
                *numEvens += 1;
                printf("Die Zahl %d ist gerade\n", array[i]);
            }
            else
            {
                *numOdds += 1;
                printf("\Die Zahl %d ist ungerade\n", array[i]);
            }  
         } 
         printf("\n"); 
    }
    


  • hausaufgaben musst du schon noch selber machen.

    nun die for-schleife in der funktion macht eben was die aufgabe sagt. gerade und ungerade zahlen werden jeweils in die arrays geschrieben.

    MALLOC WIRD NICHT GECASTET!
    nein, wirds nicht!



  • Hi,

    Wer sagt das malloc nicht mehr gecastet werden darf?

    Das ist doch völliger Schwachsinn, wer's machen möchte soll's machen.



  • Es ist albern malloc() zu casten. Oder machst du auch etwa sowas?

    if ( !!!!!!a ){
        // ...
    }
    


  • bezüglich malloc schrieb:

    Hi,
    Wer sagt das malloc nicht mehr gecastet werden darf?
    Das ist doch völliger Schwachsinn, wer's machen möchte soll's machen.

    von dürfen hat keiner was gesagt, aber schau mal:

    char *p = (char)malloc(...);
    

    da hat einer zu schnell getippt und beim cast das '*' weggelassen...
    🙂



  • switch (skill)
    {
        case ahnungslos:
            if (foo == true)
                bar = bar + 1;
            break;
    
        case anfaenger:
            if (foo != false)
                bar++;
            break
    
        case pragmatiker:
            bar += !!foo;
            break;
    }
    

    ...gedanken...



  • c.rackwitz schrieb:

    ...gedanken...

    Da hat das !! ja auch einen Effekt 😉



  • ich seh aber so selten ein !!... entweder ists verboten wie das goto oder leute wissen nicht, dass es geht.



  • c.rackwitz schrieb:

    ich seh aber so selten ein !!... entweder ists verboten wie das goto oder leute wissen nicht, dass es geht.

    viele nehmen bestimmt lieber 'a&1' statt '!!a'.
    auch wenn '!!' was bringt, aber doof sieht's ja aus 😉



  • vista schrieb:

    c.rackwitz schrieb:

    ich seh aber so selten ein !!... entweder ists verboten wie das goto oder leute wissen nicht, dass es geht.

    viele nehmen bestimmt lieber 'a&1' statt '!!a'.
    auch wenn '!!' was bringt, aber doof sieht's ja aus 😉

    !!a und a&1 sind aber nicht äquivalent.



  • false != 1&((2&1 == !!2) != true)
    *wuerg*



  • TactX schrieb:

    !!a und a&1 sind aber nicht äquivalent.

    das nicht, aber es kommt das selbe raus, 1 oder 0
    🙂
    edit: ach ja, false ist ja 'ungleich 0'.
    dann ist '!!a' äquivalent zu 'a=(a!=0)'
    vielleicht sollte ich mal 10 sekunden nachdenken, bevor ich poste 😉



  • vista schrieb:

    bezüglich malloc schrieb:

    Hi,
    Wer sagt das malloc nicht mehr gecastet werden darf?
    Das ist doch völliger Schwachsinn, wer's machen möchte soll's machen.

    von dürfen hat keiner was gesagt, aber schau mal:

    char *p = (char)malloc(...);
    

    da hat einer zu schnell getippt und beim cast das '*' weggelassen...
    🙂

    Deswegen hat man auch darauf zu achten was man macht,
    Du sprichst ja auch nicht Deutsch und Englisch zusammen :p.



  • falsches argument.

    ohne den cast waere der fehler garnicht erst moeglich gewesen.



  • es ist ja gerade das gute an void*, dass man sie nicht casten muss.
    andernfalls hätten die überhaupt keine existenzberechtigung.
    🙂



  • [quote="vista"]

    TactX schrieb:

    !!a und a&1 sind aber nicht äquivalent.

    das nicht, aber es kommt das selbe raus, 1 oder 0
    :)[quote]Wenn du es aus der Sicht siehst, sind alle boole'schen Operatoren äquivalent (die geben alle 1 oder 0 aus) 😉



  • [quote="CStoll"][quote="vista"]

    TactX schrieb:

    !!a und a&1 sind aber nicht äquivalent.

    das nicht, aber es kommt das selbe raus, 1 oder 0
    🙂

    Wenn du es aus der Sicht siehst, sind alle boole'schen Operatoren äquivalent (die geben alle 1 oder 0 aus) 😉

    naja, ich bin irrtümlicherweise davon ausgegangen, dass false==0 und true==1 sind.
    aber das zweite davon stimmt ja nicht...
    🙂


Log in to reply