probleme nach wechsel von linux zu windows



  • hey 🙂
    ich muss ein programmm schreiben welches einen wald mit zufälliger baumdichte bepflanzt, anschliessend wird der linke rand angezuendet und das feuer soll sich ausbreiten. T =baum , *= brennender baum , != rauchender baum , .= toter baum. das programm läuft eigentlich ,nur pflanzt es immer überalll bäume. dazu ist zu sagen,dass es auf linux lief und auf windows erst angefangen hat faxen zu machen. was mache ich falsch ?

    #include<stdio.h>
    #include<time.h>
    #include<unistd.h>
    #include<stdlib.h>
    #define d 4
    
    void puffer();
    double zufall(long xn,long *exn);
    int randanzuenden(char a[d][d]);
    int zeitschritt(char b[d][d]);
    void waldbrand();
    
    int main(void)
    
    {
    
    float h,g,k;
    int p,i,j,f;
    long e,xn;
    char w[d][d];
    
    waldbrand();
    
    return 0 ;} 
    
    /*waldbrandfunktion */
    void waldbrand()
    {
    float p,g;
    int i,j,f; 
    long e,xn;
    char w[d][d];
    
    	do
    	{
    	p=-1;
    	printf("bitte geben Sie die Bewaldungsdichte p in Prozent an\n");
    	scanf("%f", &p);
    	puffer();
    	}
    	while(p<0 || p>100);
    	p=p/100;
    
    /* Feld erzeugen und bepflanzen */
    
    	xn=time(NULL);
    	for(i=0; i<d; i++)
    	{
    		for(j=0; j<d; j++)
    		{
    		g=zufall(xn,&e);
    			if(g<=p)
    			{
    			w[i][j]='T';
    			}
    			else
    			{
    			w[i][j]=' ';
    			}
    		xn=e;
    		printf("%c\t",w[i][j]);
    		}
    	printf("\n\n\n"); 
    	}
    
    printf("-------------------------------\n");
    
    	sleep(1);
    	randanzuenden(w);
    	for(i=0; i<d; i++)
    	{
    		for(j=0; j<d; j++)
    		{
    	printf("%c\t",w[i][j]);
    
    		}
    	printf("\n\n\n");
    	}
    printf("-------------------------------\n");
    		do
    		{sleep(1);
    			f = zeitschritt(w);
    		for(i=0; i<d; i++)
    	{
    		for(j=0; j<d; j++)
    		{
    		printf("%c\t",w[i][j]);
    			}printf("\n\n\n");}
    		printf("-------------------------------\n");}
    		while(f!= 0);
    
    }
    
    /* PUFFERFUNKTION */
    void puffer()
    {
    char z;
    do {
    z = getchar();
    }
    while( z != 10 );
    }
    
    /* ZUFALLSFUNKTION */
    double zufall(long xn,long *exn)
    {
    	double z;
    	*exn=xn*7141+54773;
    	*exn=*exn%253177;
    
    	z=*exn/253177.0;
    	return z;
    }
    
    /* RANDANZUENDEN */
    int randanzuenden(char a[d][d])
    {
    int i,j;
    
    int aenderung = 0;
    	for(i=0; i<d; i++)
    	{
    		for(j=0; j<d; j++)
    		{
    			if(a[i][0]=='T')
    			{
    			a[i][0]='x';aenderung=1;
    			}
    		if(a[i][j]=='x'){a[i][j]='*';}	
    
    		}
    	}
    return aenderung;
    }
    
    /* ZEITFUNKTION */
    int zeitschritt(char b[d][d])
    {
    int i,j;
    int aenderung = 0;	
    		for(i=0; i< d; i++)
    		{
    		for(j=0; j < d; j++)
    		{	
    
    			if(b[i][j]=='*')
    			{
    
    				if((i<d-1) && (b[i+1][j]=='T'))
    				{b[i+1][j]='x';
    				aenderung=1;}
    
    				if((i>0) && (b[i-1][j]=='T'))
    				{b[i-1][j]='*';aenderung=1;}
    
    				if((j<d-1) && (b[i][j+1]=='T'))
    				{b[i][j+1]='x';aenderung=1;}
    
    				if((j>0) && (b[i][j-1]=='T'))
    				{b[i][j-1]='*';aenderung=1;}
    			} 
    			if(b[i][j]=='!'){b[i][j]='.';}
    			if(b[i][j]=='*'){b[i][j]='!';aenderung=1;}
    
    			if(b[i][j]=='x'){b[i][j]='*';}
    
    		}
    
    		}
    
    return aenderung;
    }
    


  • Zeile 102 ist Müll, Eingabepufferlöschung läuft immer mit EOF+'\n' und das ist dann immer plattformunabhängig.
    Zeile 17-20 ist Nonsens.



  • Was für ein Linux-System, bitte auch angeben, wieviel Bit.



  • Ich krieg das nicht compiliert wegen sleep(), aber egal. GCC spuckt übrigens ne Menge "unused variable"-Warnungen aus:

    main.c||In function 'main':|
    main.c|20|warning: unused variable 'w' [-Wunused-variable]|
    main.c|19|warning: unused variable 'xn' [-Wunused-variable]|
    main.c|19|warning: unused variable 'e' [-Wunused-variable]|
    main.c|18|warning: unused variable 'f' [-Wunused-variable]|
    main.c|18|warning: unused variable 'j' [-Wunused-variable]|
    main.c|18|warning: unused variable 'i' [-Wunused-variable]|
    main.c|18|warning: unused variable 'p' [-Wunused-variable]|
    main.c|17|warning: unused variable 'k' [-Wunused-variable]|
    main.c|17|warning: unused variable 'g' [-Wunused-variable]|
    main.c|17|warning: unused variable 'h' [-Wunused-variable]|
    

    Nebenbei, einbuchstabige Variablen erhöhen nicht die Lesbarkeit.

    T =baum , *= brennender baum , != rauchender baum , .= toter baum

    typedef!

    Zum eigentlichen Problem, deine Zufallsfunktion liefert (hier unter XP SP3 mit mingw) immer negative Zahlen, logisch dass da die Bäume wuchern wenn man in den Quellcode schaut... Warum weiß ich nicht, aber warum benutzt du nicht das eingebaute srand() und rand()?



  • DirkB schrieb:

    Was für ein Linux-System, bitte auch angeben, wieviel Bit.

    Die Spur ist gut!!

    Bei mir sinds 32Bit, aber schon die erste Rechnung gibt nen Overflow (sagt perl):

    print log(1434810776*7141+54773)/log(2); #43,xyz Bit



  • förster schrieb:

    DirkB schrieb:

    Was für ein Linux-System, bitte auch angeben, wieviel Bit.

    Die Spur ist gut!!

    Bei mir sinds 32Bit, aber schon die erste Rechnung gibt nen Overflow (sagt perl):

    print log(1434810776*7141+54773)/log(2); #43,xyz Bit

    Darum wäre uint_least64_t als Typ besser (oder auch uint64_t ), wenn es auf die 64 Bit ankommt.



  • Auf 64-Bit Linux ist long 64-Bit groß.
    Bei Windows (egal welche Gröüe) sind es 32-Bit.



  • vielen dank erstmal für die schnellen Antworten. Ja die variable ind 17-20 . Die sleep funktion läuft wenn man in den <windows.h> statt <unistd.h> als header datei einbindet und dann _sleep() nimmt. Zu dem eigentlichen Problem , ja es wird an den Bits liegen , ich weiß leider nicht, wie viel das bei linux waren aber ich gehe stark von 64 aus und wenn ihr sagt, dass das bei windows immer 32 sind ist das gut möglich . Ich habe jetzt meine systemzeit einfach mal durch 10000 geteilt und dann ging es , allerdings pflanzt er dann immer den selben wald , was ja klar ist , da sich die vorderen stellen der systemzeiit nicht ändern , hat jemand vlt. eine idee wie ich nur an die hinteren stellen rankomme ohne so ne große zahl zu kriegen ?



  • förster schrieb:

    Warum weiß ich nicht, aber warum benutzt du nicht das eingebaute srand() und rand()?



  • förster schrieb:

    förster schrieb:

    Warum weiß ich nicht, aber warum benutzt du nicht das eingebaute srand() und rand()?

    darf ich nicht laut aufgabenstellung, bin ja noch am lernen 🙂



  • Ach so. Dann siehe https://www.c-plusplus.net/forum/p2457320#2457320

    hat jemand vlt. eine idee wie ich nur an die hinteren stellen rankomme ohne so ne große zahl zu kriegen ?

    modulo (%-Zeichen).



  • Achja, uint64_t und Co. brauchen stdint.h als Header.



  • förster schrieb:

    Ach so. Dann siehe https://www.c-plusplus.net/forum/p2457320#2457320

    modulo (%-Zeichen).

    der link ist glaube ich nicht der den du mir schreiben wolltest.
    ich mach ja modulo bloss ist die zahl vorher schon zu gross.



  • Du hast nach den hinteren Stellen der Systemzeit gefragt.

    Und darauf bezog sich die Antwort.


Anmelden zum Antworten