Bei debuggen geht es, bei release nicht!



  • Hi Leute, habe ein Programm geschrieben, das Zufallzahlen in eine Verkette Liste speichert!
    Wenn ich es ausführe (bzw. relaese oder debugge), ohne einen Haltepunkt zu setzen, und das Programm ohne alles in Einzelschritte durchzugehen, dann gibt es immer die gleiche Zahl aus.

    Wenn ich aber zwei Haltepunkte setze und dann das Programm Schritt für Schritt durchgehen, dann gibt es verschiedene Zahlen aus.
    Habe keine Ahnung warum?!

    Bitte um Hilfe!

    Zur Info: Ich nutze Visual C++ Express Edition 2008, habe es mit Pelles C IDE auch ausgeführt, geht aber auch nicht!

    Hier der Quellcode:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void liste_befuellen ( void );
    void liste_unsortiert_ausgeben ( void );
    
    struct liste {
    	int zahl;
    	struct liste* next;
    };
    
    struct liste* next = NULL;
    struct liste* start = NULL;
    
    int main ( void )
    {
    	struct liste* zeiger = start;
    	liste_befuellen();
    	liste_unsortiert_ausgeben();
    	system("PAUSE");
    	return 0;
    }
    
    void liste_befuellen ( void )
    {
    	int zahl = 0;
    	struct liste* zeiger;
    	for(int i=0; i<6; i++)
    	{
    		if(start == NULL)
    		{
    			if ((start =(struct liste *) malloc(sizeof(struct liste))) == NULL) {
    				fprintf(stderr, "Kein Speicherplatz vorhanden ");
    				return;
    			}
    			srand (time(NULL));
    			zahl = rand()%10;
    			start->zahl = zahl;
    			start->next = NULL;
    		}
    		else
    		{
    			zeiger = start;
    			while(zeiger->next != NULL)
    				zeiger=zeiger->next;
    			if ((zeiger->next =(struct liste *) malloc(sizeof(struct liste))) == NULL) {
    				fprintf(stderr, "Kein Speicherplatz vorhanden ");
    				return;
    			}
    			zeiger=zeiger->next;
    			srand (time(NULL));
    			zahl = rand()%10;
    			zeiger->zahl = zahl;
    			zeiger->next = NULL;
    		}
    	}
    }
    
    void liste_unsortiert_ausgeben ( void )
    {
    	struct liste* zeiger = start; 
    
    	while(zeiger != NULL)
    	{
    		printf("%d\n", zeiger->zahl);
    		zeiger = zeiger->next;
    	}
    }
    


  • habs schon, is klar wegen der zeit mit srand

    kann closed werden!



  • srand soll man nicht vor jeder Benutzung von rand aufrufen, sondern normalerweise nur einmal!

    btw. die Methode zum Befüllen ist ja furchtbar ineffizient. Die if-Abfrage ist unnötig, da du start vor Schleifenbeginn initialisieren kannst und bei jedem Durchlauf wieder die ganze Liste durchzugehen, bis zum letzten Element? 😮



  • Ja, aber wir haben es immer so gemacht, das wir als ersters geprüft haben, ob schon ein Element vorhanden undso!

    Hier noch Bubblesort dazu:

    void bubblesort ( void )
    {
    	struct liste* hilf = start, *hilf2;
    	int length = 6;
        for (int j=1; j<=length; j++) 
    	{
     	   for (hilf2 = start->next; hilf2!=NULL; hilf2=hilf2->next) 
    		{
     			if (hilf2->zahl > hilf->zahl) 
    			{
     				int tmp = hilf2->zahl;
     				hilf2->zahl = hilf->zahl;
     				hilf->zahl = tmp;
     			}
    			hilf = hilf->next;
     		}
    		hilf = start;
    		hilf2 = start->next;
        }
    }
    

    Verbesserungsvorschläge?! 🙂



  • Hab noch einen Bubblesort in einer alten Liste von mir gefunden.

    void BubbleSort()
    {
        Knoten *tmp = anker;
        for(int i = 0; i < ilength; i++)
        {
            for(int j = 0; j < i; j++)
            {
                if(tmp->data > tmp->next->data)
                {
                    int temp = tmp->next->data;
                    tmp->next->data = tmp->data;
                    tmp->data = temp;
                }
                tmp = tmp->next;
            }
            tmp = anker;
        }
    }
    


  • Danke
    Hast du auch einen InsertionSort?

    mfg


Anmelden zum Antworten