IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
tomekmichalhu:29.9.2015 16:47

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:29.9.2015 17:39

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:29.9.2015 17:44

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:29.9.2015 17:46

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:29.9.2015 17:49

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:29.9.2015 17:57

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í
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
29.9.2015 17:57
Avatar
Odpovídá na Pjanus
tomekmichalhu:29.9.2015 17:58

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:29.9.2015 17:58

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:29.9.2015 18:02

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:29.9.2015 18:16

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.