Permalänk
Medlem

Game of Life i C

Hej!
Jag sitter här med en smärre hjärnblödning över en uppgift kallad Game of Life (https://sv.wikipedia.org/wiki/Game_of_Life).
Jag skriver programmet i C.
Koden ser ut enligt följande i sin helhet (jag tror dock jag vet vart de största problemen är just nu och klipper ut dem nedan):

#include <stdio.h> #include <stdlib.h> #include <time.h> /* Constants, representation of states */ #define ALIVE 'X' #define DEAD '.' #define FIELDSIZE 5 /* Declaration of data structure */ typedef struct{ char current; char next; } cell; /* Declaration of functions */ void initField(const int rows, const int cols, cell field[rows][cols]); void loadGlider(const int rows, const int cols, cell field[rows][cols]); void loadSemaphore(const int rows, const int cols, cell field[rows][cols]); void loadRandom(const int rows, const int cols, cell field[rows][cols]); void loadCustom(const int rows, const int cols, cell field[rows][cols]); void printField(const int rows, const int cols, cell field[rows][cols]); void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); /* Function: main * Description: Start and run games, interact with the user. * Input: About what initial structure and whether to step or exit. * Output: Information to the user, and the game field in each step. */ int main(void) { cell world[FIELDSIZE][FIELDSIZE]; int countNeighbor [FIELDSIZE+1][FIELDSIZE+1] = {{0}}; initField(FIELDSIZE,FIELDSIZE, world); printField (FIELDSIZE, FIELDSIZE, world); countNeighborhood(FIELDSIZE, FIELDSIZE, countNeighbor, world); printf("\n"); /*Skriver ut antalet grannar till en cell endast för felsökning*/ for (int i = 0; i < FIELDSIZE; i++){ for (int j = 0; j < FIELDSIZE; j++){ printf("%d ", countNeighbor[i][j]); } printf("\n"); } return 0; } /* Function: initField * Description: Initialize all the cells to dead, then asks the user about * which structure to load, and finally load the structure. * Input: The field array and its size. * Output: The field array is updated. */ void initField(const int rows, const int cols, cell field[rows][cols]) { for (int r = 0 ; r < rows ; r++) { for (int c = 0 ; c < cols ; c++) { field[r][c].current = DEAD; } } printf("Select field spec to load ([G]lider, [S]emaphore, [R]andom "); printf("or [C]ustom): "); int ch = getchar(); switch (ch) { case 'g': case 'G': loadGlider(rows, cols, field); break; case 's': case 'S': loadSemaphore(rows, cols, field); break; case 'r': case 'R': loadRandom(rows, cols, field); break; case 'c': case 'C': default: loadCustom(rows, cols, field); break; } /* Ignore following newline */ if (ch != '\n') { getchar(); } } /* Function: loadGlider * Description: Inserts a glider into the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadGlider(const int rows, const int cols, cell field[rows][cols]) { field[0][1].current = ALIVE; field[1][2].current = ALIVE; field[2][0].current = ALIVE; field[2][1].current = ALIVE; field[2][2].current = ALIVE; } /* Function: loadSemaphore * Description: Inserts a semaphore into the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadSemaphore(const int rows, const int cols, cell field[rows][cols]) { field[8][1].current = ALIVE; field[8][2].current = ALIVE; field[8][3].current = ALIVE; } /* Function: loadRandom * Description: Inserts a random structure into the field. * Input: The field array and its size. * Output: The field array is updated. There is a 50 % chance that a cell * is alive. */ void loadRandom(const int rows, const int cols, cell field[rows][cols]) { /*srand(time(NULL)); bortkommenterad för att få samma resultat varje gång*/ for (int r = 0; r < FIELDSIZE; r++){ for (int c = 0; c < FIELDSIZE; c++){ int temp = rand( ) % 2; if (temp == 0){ field[r][c].current = DEAD; } else{ field[r][c].current = ALIVE; } } } } /* Function: loadCustom * Description: Lets the user specify a structure that then is inserted into * the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadCustom(const int rows, const int cols, cell field[rows][cols]) { printf("Give custom format string: "); do { int r, c; scanf("%d,%d", &r, &c); field[r][c].current = ALIVE; } while (getchar() != '\n'); } /* Function: PrintWorld * Description: Prints the field to the screen. * Input: The field array and its size. * Output: N/A */ void printField(const int rows, const int cols, cell field[rows][cols]){ /*char choice;*/ /*do{*/ for (int rows = 0; rows < FIELDSIZE; rows++){ for (int cols = 0; cols < FIELDSIZE; cols++){ printf("%c ", field[rows][cols].current); } printf("\n"); } /*printf("Select one of the following options: \n"); printf(" (enter) Step\n"); printf(" (any) Exit\n"); scanf("%c", &choice); } while (choice == '\n'); */ } /* Function: countNeighborhood * Description: Counts the number of live cells one cell is surrounded by. * Input: The field array and its size. * Output: The neighborCount array. */ void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int i = 0; i <= FIELDSIZE; i++){ for (int j = 0; j <= FIELDSIZE; j++){ int locCoordj = j; int locCoordi = i; /*Which coordinates to search represented by * srci and srcj (Search Coordinate) * if neighbors are found the function adds 1 to an array value */ for (int srci = locCoordi-1; srci <= (locCoordi+1); srci++){ for(int srcj = locCoordj-1; srcj <= (locCoordj+1); srcj++){ if (field[srcj][srci].current == ALIVE && srci > 0 && srci < FIELDSIZE && srcj >= 0 && srcj < FIELDSIZE ){ array[j][i] += 1; } } } /*If the Cell is alive the search function counts it as a * neighbor, this function compensates for that.*/ if (field[locCoordj][locCoordi].current == ALIVE){ array[j][i] -= 1; } } } }

Funktionerna initField, loadGlider, loadSemaphore och loadCustom är fullständiga och får ej ändras (enligt uppgiften).

Just nu när jag kör koden så är det denna funktion som strular, den räknar inte rätt längs kanterna.

/* Function: countNeighborhood * Description: Counts the number of live cells one cell is surrounded by. * Input: The field array and its size. * Output: The neighborCount array. */ void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int i = 0; i <= FIELDSIZE; i++){ for (int j = 0; j <= FIELDSIZE; j++){ int locCoordj = j; int locCoordi = i; /*Which coordinates to search represented by * srci and srcj (Search Coordinate) * if neighbors are found the function adds 1 to an array value */ for (int srci = locCoordi-1; srci <= (locCoordi+1); srci++){ for(int srcj = locCoordj-1; srcj <= (locCoordj+1); srcj++){ if (field[srcj][srci].current == ALIVE && srci > 0 && srci < FIELDSIZE && srcj >= 0 && srcj < FIELDSIZE ){ array[j][i] += 1; } } } /*If the Cell is alive the search function counts it as a * neighbor, this function compensates for that.*/ if (field[locCoordj][locCoordi].current == ALIVE){ array[j][i] -= 1; } } } }

Jag tror det beror på att mina villkor i for- loopen som är fucked up (se nedan) men jag kan ha fel.

for (int srcj = locCoordj-1; srcj <= (locCoordj+1); srcj++){ if (field[srcj][srci].current == ALIVE && srci > 0 && srci < FIELDSIZE && srcj >= 0 && srcj < FIELDSIZE)

All hjälp uppskattas.

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Medlem
Skrivet av Litenskit:

Jag tror det beror på att mina villkor i for- loopen som är fucked up (se nedan) men jag kan ha fel.

for (int srcj = locCoordj-1; srcj <= (locCoordj+1); srcj++){ if (field[srcj][srci].current == ALIVE && srci > 0 && srci < FIELDSIZE && srcj >= 0 && srcj < FIELDSIZE)

All hjälp uppskattas.

srci måste vara över 0 enligt din kod. srcj får vara lika med eller större vilket ser mer rätt ut.
Kan vara så att det bara saknas ett >= istället för ett >.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Hedersmedlem

Jag skulle debugga med en IDE eller gdb till exempel för att stega igenom och se hur beräkningarna går till. Alternativt ha lite debugutskrifter. Jag ser inget självklart fel vid första glans i just den biten som du pekar ut.

Permalänk
Datavetare

Tips: gör mindre i varje enskild funktion. Blir betydligt enklare att se om en funktion är korrekt ju färre saker den gör.

Skulle skriva om countNeighbor() kanske så här

void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int r = 0; r <= rows; r++){ for (int c = 0; c <= cols; c++) { array[r][c] = countNeighbors(rows, cols, field, r, c); } } }

Att skriva countNeighbors() är ett enklare problem då man bara behöver tänka på att lösa problem för en cell. (Skulle nog också göra en datatyp för världen, men ville inte ändra ditt program mer än nödvändigt nu).

Att räkna antal levande celler runt en specifik cell kan man t.ex. göra genom att göra så här. d.v.s. gå igenom alla celler i raden ovanför, samma rad och raden under men hoppa över cellen man står på själv. Notera att r och c nu både kan vara negativ (specifikt -1) samt utanför brädet, så gör en ny funktion som fixar det i form av getState.

int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col) { int cnt = 0; for (int r = row - 1; r <= row + 1; r++) { for (int c = col - 1; c <= col + 1; c++) { if ((row != r || col != c) && getState (rows, cols, field, r, c) == ALIVE) { cnt++; } } } return cnt; }

Dold text

Tänk hur man kan se till att koordinaterna som skickas in till getState() alltid hamnar inom brädet i detta specifika fall (man är aldrig mer än något enstaka heltal utanför brädet, enda negativa talet att hantera är -1)

int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row < 0) { row += rows; } if (col < 0) { col += cols; } return field[row % rows][col % cols].current; }

Dold text

Och ditt största problem just nu är denna rad:

int countNeighbor [FIELDSIZE+1][FIELDSIZE+1] = {{0}};

Är det verkligen dessa dimensioner du skickar in till din countNeighbors()? DÄR ligger buggen du letar efter, så det jag skriver ovan har du i praktiken redan löst men bryt ner det mer!

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

Tips: gör mindre i varje enskild funktion. Blir betydligt enklare att se om en funktion är korrekt ju färre saker den gör.

Skulle skriva om countNeighbor() kanske så här

void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int r = 0; r <= rows; r++){ for (int c = 0; c <= cols; c++) { array[r][c] = countNeighbors(rows, cols, field, r, c); } } }

Ja den var klart enklare att följa vad som görs.

Citat:

Att skriva countNeighbors() är ett enklare problem då man bara behöver tänka på att lösa problem för en cell. (Skulle nog också göra en datatyp för världen, men ville inte ändra ditt program mer än nödvändigt nu).

Att räkna antal levande celler runt en specifik cell kan man t.ex. göra genom att göra så här. d.v.s. gå igenom alla celler i raden ovanför, samma rad och raden under men hoppa över cellen man står på själv. Notera att r och c nu både kan vara negativ (specifikt -1) samt utanför brädet, så gör en ny funktion som fixar det i form av getState.

int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col) { int cnt = 0; for (int r = row - 1; r <= row + 1; r++) { for (int c = col - 1; c <= col + 1; c++) { if ((row != r || col != c) && getState (rows, cols, field, r, c) == ALIVE) { cnt++; } } } return cnt; }

Dold text

Jag förstår inte riktigt villkoren i if-satsen men det kanske hänger ihop med att jag inte förstår getState funktionen.
så länge row inte är likamed r(?) eller col är lika med c(?) och om cellen på plats funktionen getState returnerar ALIVE för cellen[r][c].
Vad innebär det att (row != r || col != c)?

Citat:

Tänk hur man kan se till att koordinaterna som skickas in till getState() alltid hamnar inom brädet i detta specifika fall (man är aldrig mer än något enstaka heltal utanför brädet, enda negativa talet att hantera är -1)

int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row < 0) { row += rows; } if (col < 0) { col += cols; } return field[row % rows][col % cols].current; }

Dold text

Jag kan inte påstå att jag riktigt förstår vad denna funktion gör? Den returnerar om cellen lever eller är död men vad är det den gör i ifsatserna?

Citat:

Och ditt största problem just nu är denna rad:

int countNeighbor [FIELDSIZE+1][FIELDSIZE+1] = {{0}};

Är det verkligen dessa dimensioner du skickar in till din countNeighbors()? DÄR ligger buggen du letar efter, så det jag skriver ovan har du i praktiken redan löst men bryt ner det mer!

Detta är bara en dåligt namngiven array som jag vill ska representera hur många grannar en cell har, om säg cellen world[5][3].current har 5 grannar vill jag att arrayen countNeighbors[5][3] ska lagra värdet 5.

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Datavetare

@Litenskit: problemet med

int countNeighbor [FIELDSIZE+1][FIELDSIZE+1] = {{0}};

är att dimensionen inte är samma som för world. countNeighborhood() tar dimensionerna som argument, dessa är FIELDSIZE och FIELDSIZE, inte FIELDSIZE+1!!!

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare
Skrivet av Litenskit:

Jag förstår inte riktigt villkoren i if-satsen men det kanske hänger ihop med att jag inte förstår getState funktionen.
så länge row inte är likamed r(?) eller col är lika med c(?) och om cellen på plats funktionen getState returnerar ALIVE för cellen[r][c].
Vad innebär det att (row != r || col != c)?

(row != r || col != r) är sant för alla celler utom den man för tillfället räknar levande grannar för.

I korthet tar funktionen en cell, sedan kollar man hur många av de åtta omgivande cellerna som har status ALIVE.

Skrivet av Litenskit:

Jag kan inte påstå att jag riktigt förstår vad denna funktion gör? Den returnerar om cellen lever eller är död men vad är det den gör i ifsatserna?

Syftet med funktionen är att tala om huruvida en cell är levande eller ej, det med koordinater som kan befinna sig utanför [0..FIELDSIZE-1]. Om man får in -1 som kolumn-koordinat ska det tolkas som cellen till vänster om en cell i första kolumnen, d.v.s. det är sista kolumnen.

-1 + FIELDSIZE = FIELDSIZE - 1 // D.v.s. index i field för sista kolumnen

Omvänt, står jag i sista kolumnen och vill kolla status på kolumnen till höger om den så ska det ju bli första kolumnen. Detta hanteras av

col % FIELDSIZE; // om col == FIELDSIZE så blir detta uttryck 0 vilket är index för första kolumnen i field

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

(row != r || col != r) är sant för alla celler utom den man för tillfället räknar levande grannar för.

I korthet tar funktionen en cell, sedan kollar man hur många av de åtta omgivande cellerna som har status ALIVE.

Okay då är jag med.

Citat:

Syftet med funktionen är att tala om huruvida en cell är levande eller ej, det med koordinater som kan befinna sig utanför [0..FIELDSIZE-1]. Om man får in -1 som kolumn-koordinat ska det tolkas som cellen till vänster om en cell i första kolumnen, d.v.s. det är sista kolumnen.

-1 + FIELDSIZE = FIELDSIZE - 1 // D.v.s. index i field för sista kolumnen

Omvänt, står jag i sista kolumnen och vill kolla status på kolumnen till höger om den så ska det ju bli första kolumnen. Detta hanteras av

col % FIELDSIZE; // om col == FIELDSIZE så blir detta uttryck 0 vilket är index för första kolumnen i field

En cell längst till vänster ska inte ha någon granne till vänster om sig enligt uppgiften. En cell mitt på brädet har 8 grannar, en cell längs kanten har 5 grannar och en cell i ett hörn har 3 grannar.

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Datavetare
Skrivet av Litenskit:

Okay då är jag med.

En cell längst till vänster ska inte ha någon granne till vänster om sig enligt uppgiften. En cell mitt på brädet har 8 grannar, en cell längs kanten har 5 grannar och en cell i ett hörn har 3 grannar.

Ah, då är jag med. I de flesta "game-of-life" uppgifter jag sett så behandlar man värden som den är "rund", d.v.s. det som åker ut till vänster kommer in till höger osv.

I så fall ska logiken för getState() ändras så att alla koordinater utanför världen ger status DEAD.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

@Yoshman:
Här är min kod i sin helhet just nu.

#include <stdio.h> #include <stdlib.h> #include <time.h> /* Constants, representation of states */ #define ALIVE 'X' #define DEAD '.' #define FIELDSIZE 5 /* Declaration of data structure */ typedef struct{ char current; char next; } cell; /* Declaration of functions */ void initField(const int rows, const int cols, cell field[rows][cols]); void loadGlider(const int rows, const int cols, cell field[rows][cols]); void loadSemaphore(const int rows, const int cols, cell field[rows][cols]); void loadRandom(const int rows, const int cols, cell field[rows][cols]); void loadCustom(const int rows, const int cols, cell field[rows][cols]); void printField(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); int getState(int rows, int cols, cell field[rows][cols], int row, int col); void liveOrDie(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); void updateWorld(const int rows, const int cols, cell field [rows][cols]); /* Function: main * Description: Start and run games, interact with the user. * Input: About what initial structure and whether to step or exit. * Output: Information to the user, and the game field in each step. */ int main(void) { cell world[FIELDSIZE][FIELDSIZE]; int neighborhood [FIELDSIZE][FIELDSIZE] = {{0}}; initField(FIELDSIZE,FIELDSIZE, world); printField (FIELDSIZE, FIELDSIZE, neighborhood, world); countNeighborhood(FIELDSIZE, FIELDSIZE, neighborhood, world); printf("\n"); /*Skriver ut antalet grannar till en cell endast för felsökning*/ for (int i = 0; i < FIELDSIZE; i++){ for (int j = 0; j < FIELDSIZE; j++){ printf("%d ", neighborhood[i][j]); } printf("\n"); } return 0; } /* Function: initField * Description: Initialize all the cells to dead, then asks the user about * which structure to load, and finally load the structure. * Input: The field array and its size. * Output: The field array is updated. */ void initField(const int rows, const int cols, cell field[rows][cols]) { for (int r = 0 ; r < rows ; r++) { for (int c = 0 ; c < cols ; c++) { field[r][c].current = DEAD; } } printf("Select field spec to load ([G]lider, [S]emaphore, [R]andom "); printf("or [C]ustom): "); int ch = getchar(); switch (ch) { case 'g': case 'G': loadGlider(rows, cols, field); break; case 's': case 'S': loadSemaphore(rows, cols, field); break; case 'r': case 'R': loadRandom(rows, cols, field); break; case 'c': case 'C': default: loadCustom(rows, cols, field); break; } /* Ignore following newline */ if (ch != '\n') { getchar(); } } /* Function: loadGlider * Description: Inserts a glider into the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadGlider(const int rows, const int cols, cell field[rows][cols]) { field[0][1].current = ALIVE; field[1][2].current = ALIVE; field[2][0].current = ALIVE; field[2][1].current = ALIVE; field[2][2].current = ALIVE; } /* Function: loadSemaphore * Description: Inserts a semaphore into the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadSemaphore(const int rows, const int cols, cell field[rows][cols]) { field[8][1].current = ALIVE; field[8][2].current = ALIVE; field[8][3].current = ALIVE; } /* Function: loadRandom * Description: Inserts a random structure into the field. * Input: The field array and its size. * Output: The field array is updated. There is a 50 % chance that a cell * is alive. */ void loadRandom(const int rows, const int cols, cell field[rows][cols]) { /*srand(time(NULL)); bortkommenterad för att få samma resultat varje gång*/ for (int r = 0; r < FIELDSIZE; r++){ for (int c = 0; c < FIELDSIZE; c++){ int temp = rand( ) % 2; if (temp == 0){ field[r][c].current = DEAD; } else{ field[r][c].current = ALIVE; } } } } /* Function: loadCustom * Description: Lets the user specify a structure that then is inserted into * the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadCustom(const int rows, const int cols, cell field[rows][cols]) { printf("Give custom format string: "); do { int r, c; scanf("%d,%d", &r, &c); field[r][c].current = ALIVE; } while (getchar() != '\n'); } /* Function: PrintWorld * Description: Prints the field to the screen. * Input: The field array and its size. * Output: N/A */ void printField(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*char choice; do{*/ for (int rows = 0; rows < FIELDSIZE; rows++){ for (int cols = 0; cols < FIELDSIZE; cols++){ printf("%c ", field[rows][cols].current); } printf("\n"); } /*liveOrDie (rows, cols, array, field); updateWorld (rows, cols, field);*/ /*printf("Select one of the following options: \n"); printf(" (enter) Step\n"); printf(" (any) Exit\n"); scanf("%c", &choice); } while (choice == '\n'); */ } /* Function: countNeighborhood * Description: Counts the number of live cells one cell is surrounded by. * Input: The field array and its size. * Output: The neighborCount array. */ void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int r = 0; r <= rows; r++){ for (int c = 0; c <= cols; c++) { array[r][c] = countNeighbors(rows, cols, field, r, c); } } } int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col) { int cnt = 0; for (int r = row - 1; r <= row + 1; r++) { for (int c = col - 1; c <= col + 1; c++) { if ((row != r || col != c) && getState (rows, cols, field, r, c) == ALIVE) { cnt++; } } } return cnt; } int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row < 0) { row += rows; } if (col < 0) { col += cols; } return field[row % rows][col % cols].current; } void liveOrDie(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ if (field[r][c].current == ALIVE && array[r][c] == 2){ field[r][c].next = ALIVE; } else if (array[r][c] == 3){ field[r][c].next = ALIVE; } else{ field[r][c].next = DEAD; } } } } void updateWorld(const int rows, const int cols, cell field [rows][cols]){ for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ field[r][c].current = field[r][c].next; } } }

Dold text

Det jag har ändrat är att main ser ut enligt följande:

int main(void) { cell world[FIELDSIZE][FIELDSIZE]; int neighborhood [FIELDSIZE][FIELDSIZE] = {{0}}; initField(FIELDSIZE,FIELDSIZE, world); printField (FIELDSIZE, FIELDSIZE, neighborhood, world); countNeighborhood(FIELDSIZE, FIELDSIZE, neighborhood, world); printf("\n"); /*Skriver ut antalet grannar till en cell endast för felsökning*/ for (int i = 0; i < FIELDSIZE; i++){ for (int j = 0; j < FIELDSIZE; j++){ printf("%d ", neighborhood[i][j]); } printf("\n"); } return 0; }

Funktionen printfield är omskriven till detta (dock är förändringarna bortkommenterade för att det inte riktigt funkar ännu(dvs funktionerna liveOrDie samt updateWorld är ditskrivna.):

void printField(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*char choice; do{*/ for (int rows = 0; rows < FIELDSIZE; rows++){ for (int cols = 0; cols < FIELDSIZE; cols++){ printf("%c ", field[rows][cols].current); } printf("\n"); } /*liveOrDie (rows, cols, array, field); updateWorld (rows, cols, field);*/ /*printf("Select one of the following options: \n"); printf(" (enter) Step\n"); printf(" (any) Exit\n"); scanf("%c", &choice); } while (choice == '\n'); */ }

Funktionerna som du skrev om ser ut enligt följande (rätt exakt som du skrev):

void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int r = 0; r <= rows; r++){ for (int c = 0; c <= cols; c++) { array[r][c] = countNeighbors(rows, cols, field, r, c); } } } int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col) { int cnt = 0; for (int r = row - 1; r <= row + 1; r++) { for (int c = col - 1; c <= col + 1; c++) { if ((row != r || col != c) && getState (rows, cols, field, r, c) == ALIVE) { cnt++; } } } return cnt; } int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row < 0) { row += rows; } if (col < 0) { col += cols; } return field[row % rows][col % cols].current; }

Dold text

Vidare har jag även lagt till funktionerna liveOrDie samt updateWorld dessa två funktioner har jag testat med hjälp av en kamrats fungerande kod.

void liveOrDie(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ if (field[r][c].current == ALIVE && array[r][c] == 2){ field[r][c].next = ALIVE; } else if (array[r][c] == 3){ field[r][c].next = ALIVE; } else{ field[r][c].next = DEAD; } } } } void updateWorld(const int rows, const int cols, cell field [rows][cols]){ for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ field[r][c].current = field[r][c].next; } } }

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Medlem
Skrivet av Yoshman:

Ah, då är jag med. I de flesta "game-of-life" uppgifter jag sett så behandlar man värden som den är "rund", d.v.s. det som åker ut till vänster kommer in till höger osv.

I så fall ska logiken för getState() ändras så att alla koordinater utanför världen ger status DEAD.

Nu har jag skrivit om getState till detta. Det fungerar nu för alla platser utom höger kolumn och nedersta raden.

int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row >= 0 && col >= 0) { return field[row][col].current; } else { return DEAD; } }

Jag provade skriva om getState till detta:

int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row >= 0 && row < FIELDSIZE && col >= 0 && cols < FIELDSIZE) { return field[row][col].current; } else { return DEAD; } }

Men då returnernade den att alla var döda, så jag måste se över villkoret.

EDIT: Första kodsnutten fungerar för tre sidor, inte 2 som jag skrev innan. Den fungerar inte för höger kant. Några tips?

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk

@Litenskit:

Ersätt "getState" och "countNeighbors" med detta?

int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col) { int cnt = 0; // Counts the amount of living cells in a three-by-three-matrix // around a specific cell // NOTE: including itself! for (int r = row - 1; r <= row + 1; r++) { if (r == -1) r = 0; if (r == rows) break; for (int c = col - 1; c <= col + 1; c++) { if (c == -1) c = 0; if (c == cols) break; if (field[r][c].current == ALIVE) { cnt++; } } } return cnt; }

ou3 programmeringsteknik med c och matlab?

Visa signatur

CPU: Intel Core i5 2500K @ 3.4Ghz || Motherboard: Asus P8Z68 DELUXE || GPU: MSI GTX 970 || Memory: Corsair Vengeance 16GB @ 1600Mhz || SSD(C): 250GB Crucial BX100 SSD(D): 120GB Kingston HyperX 3K HDD(F): 1TB WD Black || PSU: Corsair AX 850W 80+ Gold || Chassi: Corsair Obsidian 650D || OS: Windows 10 x64 Pro

Permalänk
Datavetare
Skrivet av Litenskit:

Nu har jag skrivit om getState till detta. Det fungerar nu för alla platser utom höger kolumn och nedersta raden.

int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row >= 0 && col >= 0) { return field[row][col].current; } else { return DEAD; } }

Jag provade skriva om getState till detta:

int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row >= 0 && row < FIELDSIZE && col >= 0 && cols < FIELDSIZE) { return field[row][col].current; } else { return DEAD; } }

Men då returnernade den att alla var döda, så jag måste se över villkoret.

EDIT: Första kodsnutten fungerar för tre sidor, inte 2 som jag skrev innan. Den fungerar inte för höger kant. Några tips?

Du har ett litet misstag i denna snutt:

if (row >= 0 && row < FIELDSIZE && col >= 0 && cols < FIELDSIZE) {

"cols < FIELDSIZE" är som allt står nu alltid falskt.

Sedan får du fundera på om du vill skicka runt rows och cols, i så fall ska programmet aldrig referera till FIELDSIZE.

Alternativt säger du att dimensionen sätts vid kompileringstillfället och i det läget behövs inte argumentet cols och rows då dessa beskriver just dimensionen.

Edit: såg nu att det är off-by-on fel i countNeighbors() (två stycken faktiskt). Hur många rader och kolumner är det egentligen? Så vilka randvillkor är det som gäller?

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Skrivet av Yoshman:

Sedan får du fundera på om du vill skicka runt rows och cols, i så fall ska programmet aldrig referera till FIELDSIZE.

Alternativt säger du att dimensionen sätts vid kompileringstillfället och i det läget behövs inte argumentet cols och rows då dessa beskriver just dimensionen.

Jag håller med Yoshman (för en gång skull ). Sluta skicka runt rows och cols. Variable length arrays har sin användning, men här ställer det bara till problem. Bestäm, en gång för all, att din värld är FIELDSIZE * FIELDSIZE celler. Då slipper du skicka runt rows och cols och du får ett effektivare program på köpet.

Permalänk
Medlem
Skrivet av Yoshman:

Du har ett litet misstag i denna snutt:

if (row >= 0 && row < FIELDSIZE && col >= 0 && cols < FIELDSIZE) {

"cols < FIELDSIZE" är som allt står nu alltid falskt.

Ahh, så litet men ack så störande. Nu funkar den delen av programmet.

Citat:

Sedan får du fundera på om du vill skicka runt rows och cols, i så fall ska programmet aldrig referera till FIELDSIZE.

Alternativt säger du att dimensionen sätts vid kompileringstillfället och i det läget behövs inte argumentet cols och rows då dessa beskriver just dimensionen.

Edit: såg nu att det är off-by-on fel i countNeighbors() (två stycken faktiskt). Hur många rader och kolumner är det egentligen? Så vilka randvillkor är det som gäller?

Uppgiften som lämnas in ska vara 20*20 stor. Har kört med variabler för att 20*20 kändes ohanterbart när jag skulle felsöka så med variabler så gick det enkelt att ändra.

Nästan allt fungerar nu förutom att jag har ett logiskt fel någonstans, jag tror att det beror på detta:

void liveOrDie(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ countNeighborhood(FIELDSIZE, FIELDSIZE, array, field); for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ if (field[r][c].current == ALIVE && array[r][c] == 2){ field[r][c].next = ALIVE; } else if (array[r][c] == 3){ field[r][c].next = ALIVE; } else{ field[r][c].next = DEAD; } } }

Det verkar som att det fetade villkoret inte kan uppfyllas på rad två.
Om jag kör tex glider funktionen så blir det fel på 3 generationen när fetade villkoret ska uppfyllas för cellen 3 från vänster på rad 2
När jag testade programmet med universitets testprogram så lägger den in 4 gliders med hjälp av custom funktionen (custom string: 11,12;12,13;13,11;13,12;13,13;11,7;12,6;13,6;13,7;13,8;6,6;6,7;6,8;7,6;8,7;6,11;6,12;6,13;7,13;8,12) och den kör 19 generationer tills den ska skriva ut på rad 2 med nyss nämnda villkor så blir det fail.

EDIT: Kan det kanske bero på denna kod?

void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int r = 0; r <= rows; r++){ for (int c = 0; c <= cols; c++) { array[r][c] = countNeighbors(rows, cols, field, r, c); } } }

eller mer specifikt

array[r][c] = countNeighbors(rows, cols, field, r, c);

ger ibland warning i kompileringen.
enligt detta:

*sökväg*/main.c:218:27: warning: implicit declaration of function 'countNeighbors' [-Wimplicit-function-declaration] array[r][c] = countNeighbors(rows, cols, field, r, c); ^ C:/TDM-GCC-64/bin/g++.exe -o ./Debug/inlamning3test @inlamning3test.txt -L. mingw32-make.exe[1]: Leaving directory '*sökväg*/inlamning3test' ====0 errors, 1 warnings====

har ingen aning om vad det betyder dock.

Koden i sin helhet om det behövs:

#include <stdio.h> #include <stdlib.h> #include <time.h> /* Constants, representation of states */ #define ALIVE 'X' #define DEAD '.' #define FIELDSIZE 20 /* Declaration of data structure */ typedef struct{ char current; char next; } cell; /* Declaration of functions */ void initField(const int rows, const int cols, cell field[rows][cols]); void loadGlider(const int rows, const int cols, cell field[rows][cols]); void loadSemaphore(const int rows, const int cols, cell field[rows][cols]); void loadRandom(const int rows, const int cols, cell field[rows][cols]); void loadCustom(const int rows, const int cols, cell field[rows][cols]); void printField(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); int getState(int rows, int cols, cell field[rows][cols], int row, int col); void liveOrDie(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]); void updateWorld(const int rows, const int cols, cell field [rows][cols]); /* Function: main * Description: Start and run games, interact with the user. * Input: About what initial structure and whether to step or exit. * Output: Information to the user, and the game field in each step. */ int main(void) { cell world[FIELDSIZE][FIELDSIZE]; int neighborhood [FIELDSIZE][FIELDSIZE] = {{0}}; initField(FIELDSIZE,FIELDSIZE, world); printField (FIELDSIZE, FIELDSIZE, neighborhood, world); printf("\n"); /*Skriver ut antalet grannar till en cell endast för felsökning*/ /*for (int i = 0; i < FIELDSIZE; i++){ for (int j = 0; j < FIELDSIZE; j++){ printf("%d ", neighborhood[i][j]); } printf("\n"); }*/ return 0; } /* Function: initField * Description: Initialize all the cells to dead, then asks the user about * which structure to load, and finally load the structure. * Input: The field array and its size. * Output: The field array is updated. */ void initField(const int rows, const int cols, cell field[rows][cols]) { for (int r = 0 ; r < rows ; r++) { for (int c = 0 ; c < cols ; c++) { field[r][c].current = DEAD; } } printf("Select field spec to load ([G]lider, [S]emaphore, [R]andom "); printf("or [C]ustom): "); int ch = getchar(); switch (ch) { case 'g': case 'G': loadGlider(rows, cols, field); break; case 's': case 'S': loadSemaphore(rows, cols, field); break; case 'r': case 'R': loadRandom(rows, cols, field); break; case 'c': case 'C': default: loadCustom(rows, cols, field); break; } /* Ignore following newline */ if (ch != '\n') { getchar(); } } /* Function: loadGlider * Description: Inserts a glider into the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadGlider(const int rows, const int cols, cell field[rows][cols]) { field[0][1].current = ALIVE; field[1][2].current = ALIVE; field[2][0].current = ALIVE; field[2][1].current = ALIVE; field[2][2].current = ALIVE; } /* Function: loadSemaphore * Description: Inserts a semaphore into the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadSemaphore(const int rows, const int cols, cell field[rows][cols]) { field[8][1].current = ALIVE; field[8][2].current = ALIVE; field[8][3].current = ALIVE; } /* Function: loadRandom * Description: Inserts a random structure into the field. * Input: The field array and its size. * Output: The field array is updated. There is a 50 % chance that a cell * is alive. */ void loadRandom(const int rows, const int cols, cell field[rows][cols]) { /*srand(time(NULL)); bortkommenterad för att få samma resultat varje gång*/ for (int r = 0; r < FIELDSIZE; r++){ for (int c = 0; c < FIELDSIZE; c++){ int temp = rand( ) % 2; if (temp == 0){ field[r][c].current = DEAD; } else{ field[r][c].current = ALIVE; } } } } /* Function: loadCustom * Description: Lets the user specify a structure that then is inserted into * the field. * Input: The field array and its size. * Output: The field array is updated. */ void loadCustom(const int rows, const int cols, cell field[rows][cols]) { printf("Give custom format string: "); do { int r, c; scanf("%d,%d", &r, &c); field[r][c].current = ALIVE; } while (getchar() != '\n'); } /* Function: PrintField * Description: Prints the field to the screen. * Input: The field array and its size. * Output: N/A */ void printField(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ char choice; do{ for (int rows = 0; rows < FIELDSIZE; rows++){ for (int cols = 0; cols < FIELDSIZE; cols++){ printf("%c ", field[rows][cols].current); } printf("\n"); } liveOrDie (rows, cols, array, field); printf("Select one of the following options: \n"); printf(" (enter) Step\n"); printf(" (any) Exit\n"); scanf("%c", &choice); } while (choice == '\n'); } /* Function: countNeighborhood * Description: Counts the number of live cells one cell is surrounded by. * Input: The field array and its size. * Output: The neighborCount array. */ void countNeighborhood(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ /*Search for neighbors begins at locCoordj and locCoordj (Local Coordinate) * represents rows and columns where the cell is located.*/ for (int r = 0; r <= rows; r++){ for (int c = 0; c <= cols; c++) { array[r][c] = countNeighbors(rows, cols, field, r, c); } } } int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col) { int cnt = 0; for (int r = row - 1; r <= row + 1; r++) { for (int c = col - 1; c <= col + 1; c++) { if ((row != r || col != c) && getState (rows, cols, field, r, c) == ALIVE) { cnt++; } } } return cnt; } int getState(int rows, int cols, cell field[rows][cols], int row, int col) { if (row >= 0 && row < FIELDSIZE && col >= 0 && col < FIELDSIZE){ return field[row][col].current; } else { return DEAD; } } void liveOrDie(const int rows, const int cols, int array[rows][cols], cell field[rows][cols]){ countNeighborhood(FIELDSIZE, FIELDSIZE, array, field); for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ if (field[r][c].current == ALIVE && array[r][c] == 2){ field[r][c].next = ALIVE; } else if (array[r][c] == 3){ field[r][c].next = ALIVE; } else{ field[r][c].next = DEAD; } } } /*Skriver ut antalet grannar till en cell endast för felsökning*/ for (int i = 0; i < FIELDSIZE; i++){ for (int j = 0; j < FIELDSIZE; j++){ printf("%d ", array[i][j]); } printf("\n"); } updateWorld (rows, cols, field); } void updateWorld(const int rows, const int cols, cell field [rows][cols]){ for (int r = 0; r < rows; r++){ for (int c = 0; c < cols; c++){ field[r][c].current = field[r][c].next; } } }

Dold text
Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Datavetare

@Litenskit:

Skrev ovan
"Edit: såg nu att det är off-by-on fel i countNeighbors() (två stycken faktiskt). Hur många rader och kolumner är det egentligen? Så vilka randvillkor är det som gäller?"

Det gäller fortfarande. Du gör flera minnesöverskrivningar i countNeighbors() just nu då båda for-looparna läser/skriver ett index för långt.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Yoshman:

@Litenskit:

Skrev ovan
"Edit: såg nu att det är off-by-on fel i countNeighbors() (två stycken faktiskt). Hur många rader och kolumner är det egentligen? Så vilka randvillkor är det som gäller?"

Det gäller fortfarande. Du gör flera minnesöverskrivningar i countNeighbors() just nu då båda for-looparna läser/skriver ett index för långt.

Tack som fan, nu funkar programmet! Nu behöver jag bara bli av med kompileringswarningen jag skrev om innan, har du någon lösning på det?

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Skrivet av Litenskit:

Tack som fan, nu funkar programmet! Nu behöver jag bara bli av med kompileringswarningen jag skrev om innan, har du någon lösning på det?

Den talar om för dig att du inte har deklarerat funktionen innan användning. Det betyder att kompilatorn inte kan kolla att parametrarna stämmer och att den gissar att du vill int som returtyp.

Permalänk
Datavetare
Skrivet av Litenskit:

Tack som fan, nu funkar programmet! Nu behöver jag bara bli av med kompileringswarningen jag skrev om innan, har du någon lösning på det?

Ja, kompilatorvarningen kommer av att du använder countNeighbors() innan du deklarerat eller definierat funktionen.

Enklaste lösningen är att flytta definitionen av countNeighbors() precis ovanför där du använder den. Alternativt deklarerar du funktionen i toppen av programmet, d.v.s. lägger till

int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col);

längst upp där de andra funktionsdeklarationerna ligger.

Fundera på om du inte ska rensa upp i användandet av cols/rows och FIELDSIZE, använd en av dessa konsekvent genom programmet.

Edit: du gör också lite dubbeljobb nu. T.ex. så behövs inte längre matrisen neighborhood eftersom liveOrDie() lika gärna kan anropa countNeighbors() för att reda ut hur många levande grannar en viss cell har (och då behövs inte anropet till countNeighborhood()).

Du tappar vissa debug-möjligheter på att ta bort detta dock.

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem
Skrivet av Ingetledigtnamn:

Den talar om för dig att du inte har deklarerat funktionen innan användning. Det betyder att kompilatorn inte kan kolla att parametrarna stämmer och att den gissar att du vill int som returtyp.

Skrivet av Yoshman:

Ja, kompilatorvarningen kommer av att du använder countNeighbors() innan du deklarerat eller definierat funktionen.

Enklaste lösningen är att flytta definitionen av countNeighbors() precis ovanför där du använder den. Alternativt deklarerar du funktionen i toppen av programmet, d.v.s. lägger till

int countNeighbors(int rows, int cols, cell field[rows][cols], int row, int col);

längst upp där de andra funktionsdeklarationerna ligger.

Fundera på om du inte ska rensa upp i användandet av cols/rows och FIELDSIZE, använd en av dessa konsekvent genom programmet.

Edit: du gör också lite dubbeljobb nu. T.ex. så behövs inte längre matrisen neighborhood eftersom liveOrDie() lika gärna kan anropa countNeighbors() för att reda ut hur många levande grannar en viss cell har (och då behövs inte anropet till countNeighborhood()).

Du tappar vissa debug-möjligheter på att ta bort detta dock.

Ahh så simpelt när ni säger det, trodde helt säkert att jag hade gjort det som med alla funktioner men tydligen så är man trött.
Hur klarar ni proffs att hålla er skärpta en arbetsdag?

Detta är som sagt en "skoluppgift", vad tycker ni ska jag censurera bort(alternativt be mod göra det) lösningarna från tråden så inte någon nästa år hittar hit och får hela lösningen "gratis"? De använder uppgifterna från tidigare år dock inte exakt likadana.

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Medlem
Skrivet av Litenskit:

Ahh så simpelt när ni säger det, trodde helt säkert att jag hade gjort det som med alla funktioner men tydligen så är man trött.
Hur klarar ni proffs att hålla er skärpta en arbetsdag?

Detta är som sagt en "skoluppgift", vad tycker ni ska jag censurera bort(alternativt be mod göra det) lösningarna från tråden så inte någon nästa år hittar hit och får hela lösningen "gratis"? De använder uppgifterna från tidigare år dock inte exakt likadana.

Gillar Jem att du postar uppgifterna här?
Det är bara att skicka ett PM ifall du vill ha hjälp så kan kodpatrullen komma förbi datorsalen och hjälpa till

Visa signatur

2600k @ STOCK <|> GTX 970 Omega!<|> Nån samsung 500gb ssd <|> 16 GB Kingston Hyper X <|> BenQ XL2420t
"Det finns inget skrot, bara gamla delar som kan användas på nya sätt" - Mulle Meck

Permalänk
Medlem

Likabehandling?

Skrivet av Litenskit:

Ahh så simpelt när ni säger det, trodde helt säkert att jag hade gjort det som med alla funktioner men tydligen så är man trött.
Hur klarar ni proffs att hålla er skärpta en arbetsdag?

Detta är som sagt en "skoluppgift", vad tycker ni ska jag censurera bort(alternativt be mod göra det) lösningarna från tråden så inte någon nästa år hittar hit och får hela lösningen "gratis"? De använder uppgifterna från tidigare år dock inte exakt likadana.

För mig funkar det så att jag blir pigg av sådana här uppgifter, ju svårare problem desto mer energi har jag i kroppen och knoppen att försöka lösa det. Det blir en utmaning. Jag gillar problemlösning. Om du inte klarar av att hålla energin uppe när du sitter framför datorn så ska du nog syssla med något annat, enligt mitt sätt att se på det.
Ett alternativ är ju energidrycker och/eller droger. Men inget jag rekommenderar.

Det är väl glasklart att du inte ska be moderatorerna ta bort något inlägg? Varför skulle inte alla andra ha rätt till samma hjälp som du har fått? Har du fått lösningen serverad har alla andra precis lika stor rätt till det, eller hur?

Mvh,
/J

Permalänk
Medlem
Skrivet av elklazor:

Gillar Jem att du postar uppgifterna här?
Det är bara att skicka ett PM ifall du vill ha hjälp så kan kodpatrullen komma förbi datorsalen och hjälpa till

Jag var på handledning med mina problem och fick svaret "jag vet inte" och sedan gick personen så ja.. Jem?

Skrivet av JugsteR:

För mig funkar det så att jag blir pigg av sådana här uppgifter, ju svårare problem desto mer energi har jag i kroppen och knoppen att försöka lösa det. Det blir en utmaning. Jag gillar problemlösning. Om du inte klarar av att hålla energin uppe när du sitter framför datorn så ska du nog syssla med något annat, enligt mitt sätt att se på det.
Ett alternativ är ju energidrycker och/eller droger. Men inget jag rekommenderar.

Det är väl glasklart att du inte ska be moderatorerna ta bort något inlägg? Varför skulle inte alla andra ha rätt till samma hjälp som du har fått? Har du fått lösningen serverad har alla andra precis lika stor rätt till det, eller hur?

Mvh,
/J

Nä programmerare har jag inte för avsikt att bli, så var inte orolig. Hade inte för avsikt att ta bort något inlägg, men kanske något stycke ur den kompletta koden jag har publicerat några gånger... Allt har jag trots allt inte fått serverat lite har jag gjort själv... Det var bara en fråga så lugn...

Visa signatur

Lurkar - läser mycket skriver lite. Vill du få min uppmärksamhet är det citat eller pm som gäller.
Jag anser att AIO-kylare har en plats i världen men det är INTE i fullstora ATX-system.

Permalänk
Skrivet av Yoshman:

@Litenskit:

Skrev ovan
"Edit: såg nu att det är off-by-on fel i countNeighbors() (två stycken faktiskt). Hur många rader och kolumner är det egentligen? Så vilka randvillkor är det som gäller?"

Det gäller fortfarande. Du gör flera minnesöverskrivningar i countNeighbors() just nu då båda for-looparna läser/skriver ett index för långt.

Hur skulle man skriva om dem två for-looparna som du kommenterar här för att förhålla sig inom dem villkor som finns?
Vilka off-by-one fel är det du menar och då vill att han ändrar till?

Tacksam för all möjlig hjälp man kan få!

Permalänk

Problemet löst, så ingen lägger ner tid i onödan på att svara