Diskuze: C se chová divně, kde je chyba?

C++ C a C++ C se chová divně, kde je chyba?

Avatar
tomekmichalhu:

dobrý den, můžete mi někdo říct kde je v tomhle kódu chyba?

#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void main(int argc, char *argv[]) {

        //init
        int h, w, hw, ww, dead, alive;
        char s;
        dead = 32;
        alive = 64;
        h = 10;
        w = 10;
        int life[w][h];
        int lifen[w][h];

        //kill all cells
        for(hw = 0;hw<h;hw++){
                for(ww = 0;ww<w;ww++){
                        life[ww][hw] = dead;
                }
        }

        //create life
        life[2][3] = alive;
        life[3][2] = alive;
        life[3][4] = alive;

        //draw first cells
        system("cls");
        for(hw = 0;hw<h;hw++){
                printf("\nI");
                for(ww = 0;ww<w;ww++){
                        printf("%c",life[ww][hw]);
                }
                printf("I");
        }

        //infinite loop
        while(1){

        Sleep(1000);

        //compute
        for(hw = 0;hw<h;hw++){
                for(ww = 0;ww<w;ww++){
                        lifen[ww][hw] = life[ww][hw];
                }
        }

        for(hw = 0;hw<h;hw++){
                printf("\n"); //debug
                for(ww = 0;ww<w;ww++){

                        s=0;

                        if(ww < w-1 ){
                                if(life[ww+1][hw] == alive){
                                        s = s+1;
                                }
                        }
                        if(ww > 0){
                                if(life[ww-1][hw] == alive){
                                        s = s+1;
                                }
                        }
                        if(hw < h-1){
                                if(life[ww][hw+1] == alive){
                                        s = s+1;
                                }
                        }
                        if(hw > 0){
                                if(life[ww][hw-1] == alive){
                                        s = s+1;
                                }
                        }

                        printf("%i", s); //debug

                        if(life[ww][hw] = alive){
                                if(s<2 || s>3)lifen[ww][hw] = dead;
                        }else{
                                if(s == 3)lifen[ww][hw] = alive;
                        }

                }
        }

        for(hw = 0;hw<h;hw++){
                for(ww = 0;ww<w;ww++){
                        life[ww][hw] = lifen[ww][hw];
                }
        }

        //draw
        //system("cls");
        for(hw = 0;hw<h;hw++){
                printf("\nI");
                for(ww = 0;ww<w;ww++){
                        printf("%c",life[ww][hw]);
                }
                printf("I");
        }
        }

}

má to být jednoduchý dvoustatový celulární automat ale když se snažím spočítat "živé" buňky které se dotýkají aktuální buňky (řádky 56-79), vyhazuje to kraviny a v místech kde žádná buňka není a nikdy nebyla to s klidem napíše že má 2 sousedy.

 
Odpovědět 29.9.2015 16:47
Avatar
Pjanus
Člen
Avatar
Odpovídá na tomekmichalhu
Pjanus:

Z nějakého důvodu to způsobuje to uspání vlákna ale upřímně netuším proč...

 
Nahoru Odpovědět 29.9.2015 17:39
Avatar
Pjanus
Člen
Avatar
Odpovídá na tomekmichalhu
Pjanus:

Oprava chyba je někde v této části

for (hw = 0; hw < h; hw++){
        for (ww = 0; ww < w; ww++){
                life[ww][hw] = lifen[ww][hw];
        }
}
 
Nahoru Odpovědět 29.9.2015 17:44
Avatar
Odpovídá na Pjanus
tomekmichalhu:

Ne, dal jsem to pryč a akorát to začalo spamovat ty příšernosti 100x rychlejc
edit: ne, tím to taky není.

Editováno 29.9.2015 17:49
 
Nahoru Odpovědět 29.9.2015 17:46
Avatar
Pjanus
Člen
Avatar
Odpovídá na tomekmichalhu
Pjanus:

Ne promiň už jsem na to přišel celou dobu jsem byl vedle

if (life[ww][hw] = alive)
{
        if (s < 2 || s>3)
                lifen[ww][hw] = dead;
        else
                lifen[ww][hw] = alive;
}
else
{
        if (s == 3)
                lifen[ww][hw] = alive;
        else
                lifen[ww][hw] = dead;
}

tady si v předchozí verzi nenastavoval žádný stav pokud to nesplňovalo tu podmínku

if (s < 2 || s>3)
if (s == 3)

a proto pokud nebyla splněna nebyla nastavená žádná hodnota respektive tam zůstavala po průběhu

 
Nahoru Odpovědět 29.9.2015 17:49
Avatar
Pjanus
Člen
Avatar
Odpovídá na tomekmichalhu
Pjanus:

A pořád jsem naprostý vůl tentokrát naposledy :-)

if (life[ww][hw] = alive)

tady ses upsal a já si toho nevšiml v podmínce tam přiřazuješ hodnotu takže to vlastně ani není podmínka, vlastně ani nevim kdy je splněna... Ale tam je ten problém a to co jsem říkal posledně je taky chyba takže to si taky oprav ;-)

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 29.9.2015 17:57
Avatar
Odpovídá na Pjanus
tomekmichalhu:

no teď to píše jiný kraviny, ale pořád jsou to kraviny

 
Nahoru Odpovědět 29.9.2015 17:58
Avatar
Odpovídá na Pjanus
tomekmichalhu:

super, už to valí :D :D :D dík :D

 
Nahoru Odpovědět 29.9.2015 17:58
Avatar
Pjanus
Člen
Avatar
Odpovídá na tomekmichalhu
Pjanus:

Mě to takhle už běží správně, zkus si upravit tuhle část kódu možná si na něco zapomněl nebo já jsem provedl změnu o které jsem se zapomněl zmínit

for (hw = 0; hw < h; hw++){
                        printf("\n"); //debug
                        for (ww = 0; ww < w; ww++){



                                s = 0;

                                if (ww < w - 1){
                                        if (life[ww + 1][hw] == alive){
                                                s = s + 1;
                                        }
                                }
                                if (ww > 0){
                                        if (life[ww - 1][hw] == alive){
                                                s = s + 1;
                                        }
                                }
                                if (hw < h - 1){
                                        if (life[ww][hw + 1] == alive){
                                                s = s + 1;
                                        }
                                }
                                if (hw > 0){
                                        if (life[ww][hw - 1] == alive){
                                                s = s + 1;
                                        }
                                }
                                printf("%i", s); //debug

                                if (life[ww][hw] == alive)
                                {
                                        if (s < 2 || s>3)
                                                lifen[ww][hw] = dead;
                                        else
                                                lifen[ww][hw] = alive;
                                }
                                else
                                {
                                        if (s == 3)
                                                lifen[ww][hw] = alive;
                                        else
                                                lifen[ww][hw] = dead;
                                }
                        }
                }
 
Nahoru Odpovědět 29.9.2015 18:02
Avatar
Pjanus
Člen
Avatar
Odpovídá na Pjanus
Pjanus:

A poslední dodatek zkoušel jsem to a v tomhle případě je podmínka splněna pokud přiřazujeme jinou hodnotu než 0, jen tak pro úplnost.

 
Nahoru Odpovědět 29.9.2015 18:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.