Speicherprobleme im Unterprogramm



  • Hallo Zusammen,

    leider bin ich in C noch nicht so bewandert, daher schonmal Entschuldigung falls die Frage etwas dumm ist.
    Ich versuche gerade ein Programm zu schreiben, welches mir eine Tabelle mit Zufallswerten ausgibt. Dabei soll man die untere und obere Grenze der Zufallszahlen, sowie die Spalten und Zeilenanzahl der Tabelle vorher eingeben. Das mit der Tabelle funktioniert auch soweit, jedoch wird die ganze Tabelle nur mit einer Zufallszahl gefüllt. Ich denke das liegt daran, dass der Speicher nicht geleert wird. Leider funktioniert das mit dem Speicher leeren nicht wie gedacht mit fflush.
    Gibt es eine Lösung wie ich den Speicher leeren kann oder ist mein Ansatz komplett daneben?

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void Tabelle(int anzZeilen, int anzSpalten, int ug, int og);
    int Zufall(int og, int ug);
    
    int main(){
    
        int ug = 0, og = 0;
        int spalten = 0, zeilen = 0;
        printf("ug und og eingeben: "); scanf("%d %d", &ug, &og);
        printf("spalten und zeilen eingeben: "); scanf("%d %d", &spalten, &zeilen);   
        Tabelle(zeilen,spalten,ug,og);
    }
    
    void Tabelle(int anzZeilen, int anzSpalten, int ug, int og){
        
        int i=0, j=0;
        int zz=0;
        
        printf("--------");
        for(i=0;i<=anzSpalten;i++){
            printf("--Spalte %d-",i);
        }
        
        for (j=0;j<=anzZeilen;j++){
            printf("\nZeile %d",j);
            for(i=0;i<=anzSpalten;i++){
                Zufall(ug,og);
            }
        }
    }
    
    int Zufall(int ug, int og){
        int zzahl = 0;
        srand(time(NULL));
        zzahl = rand()%(og-ug) + ug;
        printf("   %d   ", zzahl);
        fflush(stdin);
    }
    


  • Ein Fehler den du schonmal sicher da drin hast ist wie du srand aufrufst.
    time(NULL) liefert die Zeit in Sekunden zurück.
    Und mit srand initialisierst du den Generator der von rand verwendet wird. Und der ist deterministisch. D.h. wenn du srand(42) aufrufst, dann wirst du direkt danach von rand immer den selben Wert bekommen.

    Und da Computer schnell sind, läuft das ganze Anfüllen der Tabelle halt in weit unter einer Sekunde, d.h. die Chance dass du bei time(NULL) immer den selben Wert zurückbekommst ist sehr hoch. Und daher ist auch die Chance dass du vom direkt darauf folgenden rand Aufruf immer den selben Wert bekommst sehr hoch.

    Fix: Ruf srand(time(NULL)); ein mal beim Programmstart auf, und nicht in deiner Zufall Funktion.



  • @ShrimpMan sagte in Speicherprobleme im Unterprogramm:

    srand(time(NULL));

    srand sollte nur einmal im ganzen Programm ausgeführt werden - also am Anfang der main

    Bei dir wird es bei jedem Aufruf von Zufall() ausgeführt.
    time(NULL) liefert nur einen Sekundenwert.
    Dein Programm braucht aber deutlich weniger Zeit, so dass immer wieder derselbe Startwert für den Zufallsgenerator gesetzt wird.



  • @ShrimpMan sagte in Speicherprobleme im Unterprogramm:

    zzahl = rand()%(og-ug) + ug;

    og wird nie erreicht. Wenn du einen Würfel simulieren willst, wirst du bei Zufall(1,6) keine 6 bekommen.
    Das printf gehört nicht in Zufall sondern in die Schleife von Tabelle.

    Das Verhalten von fflush() ist für stdin nicht definiert und an der Aufruf an der Stelle sowieso sinnlos.



  • @DirkB ja im Nachhinein gute Frage was ich mir bei stdin an der Stelle gedacht habe🤔 , das mit der Zeit habe ich jetzt oben ins Programm geschrieben und die Print-funktion oben integriert. Jetzt funktioniert bis auf die Formatierung alles gut - Vielen Dank für die Hilfe



  • @ShrimpMan sagte in Speicherprobleme im Unterprogramm:

    Jetzt funktioniert bis auf die Formatierung alles gut

    Mach mal beim printf ein %3d (wenn du maximal dreistellige Zahlen hast)


Anmelden zum Antworten