Conway's Game of Life



  • Das Problem vom TE ist glaube ich ein grundsätzlicheres.

    In C (und in den meisten anderen Programmiersprachen) gehen die Indizes von einem Array von 0 bis max-1, was dann genau max Elementen entspricht.


  • Mod

    Schlangenmensch schrieb:

    Das Problem vom TE ist glaube ich ein grundsätzlicheres.

    In C (und in den meisten anderen Programmiersprachen) gehen die Indizes von einem Array von 0 bis max-1, was dann genau max Elementen entspricht.

    Aber das weiß er doch offensichtlich, denn in seinem ersten Programm hat er es richtig gemacht!



  • vielleicht erklärt ihr es ihm einfach unverständlich. 🙄

    mein vorschlag wäre jetzt ja, das array einfach um jeweils zwei zeilen und spalten zu vergrößern, und die elemente dann ausdrücklich als "tot" festzulegen.

    nur die grenzen des array müssen dann irgendwie verändert werden. evtl. zeiger verwenden?



  • Vermutlich stelle ich mich auch blöder als es eigentlich sein muss 🙂

    Ich dachte halt wenn mein maximaler Bereich bis 12 geht, geht die Schleife 1 bis kleiner max nur von 1 bis 11.
    Weil die 12 wäre ja schon gleich dem Maximalwert.

    Gleiches gilt ja für den Array.

    Aber gut - ich probiere des einfach mal aus 💡



  • nein genau das ist nicht der fall. wenn du ein array von 12 * 12 erzeugst, hast du horizontal und vertikal die elemente [0] ... [11].

    wenn du jetzt nur von [1] bis [11] auswertest, überschreitest du den rand, weil das array nur bis 11 geht, du aber wegen [i + 1] bzw. [j + 1] auch in [12] guckst. das hat man versucht, dir zu erklären.

    das nächste problem ist eben, dass wenn du ein array erstellst, "irgendetwas" in den elementen drin steht, was du nur bedingt behoben hast. mit [i - i] für i == 0 greifst du dann auch [0] zu, was aber nicht initialisiert wurde.

    wenn du ein array von 14 * 14 erstellst und komplett mit 0 initialisierst, hast du mit [1] ... [12] deine 12 elemente, kannst entspannt von 1 bis 12 auswerten und verursachst keine speicherfehler.


  • Mod

    int array[3] ist ein Array mit 3 Werten. array[0] , array[1] , und array[2] .

    Eine Schleife

    for (int i = N; i < M; ++i)
    

    läuft durch max(M-N, 0) Werte, zum Beispiel

    for (int i = 8; i < 11; ++i)
    

    läuft durch 11-8=3 Werte: 8, 9, 10.
    So etwas passt daher auch besonders schön zu den Arraygrenzen, denn das Array array von oben durchläuft man vollständig, indem man seine Größe angibt:

    for (int i = 0; i < 3; ++i)
    

    Dies gibt einem genau array[0] , array[1] , und array[2] .

    Das hattest du in deinem ersten Beitrag ja auch alles schon richtig.

    Ich wiederhole noch einmal dringend meinen Tipp, das derzeitige Gefrickel zu unterlassen. Hättest du gleich nach der ersten Antwort angefangen, das Programm komplett richtig zu machen, indem du modulo benutzt, dann wärst du schon lange fertig. Stattdessen hast du nun schon einen Tag darauf verschwendet eine halbrichtige Version zu basteln, die aber bisher doch noch nicht funktioniert, und dich auch keinen Schritt weiter in die richtige Richtung bringt.



  • Whup - es passt! 👍 👍

    Danke für die ausdauernde Hilfe.
    Das mit dem Array war ziemlich blöd nachgedacht!
    Habe das mit einer besseren Initialisierung ans laufen gekriegt.

    Den Modulo-Operator schaue ich mir in dem Kontext auch noch an.
    Nullen und Einsen fand ich auf dem ersten Blick einfach am praktischsten (mit dem Kopf durch die Wand tut es ja manchmal auch 😃 )

    Eine letzte blöde Frage habe ich noch:
    Einen Array wie

    int var=3;
    int array[var];
    

    lässt sich initialisieren.

    Aber

    int var=3;
    int array[var]={0};
    

    nicht.

    Ich verstehe nicht ganz woran das liegt 😕



  • Freumel schrieb:

    Einen Array wie

    int var=3;
    int array[var];
    

    lässt sich initialisieren.

    Da wird nichts initialisiert.

    Freumel schrieb:

    Aber

    int var=3;
    int array[var]={0};
    

    nicht.

    Das geht bei Variable Length Arrays halt nicht. Brauchst du die überhaupt?

    Mehr unter https://stackoverflow.com/questions/17332360/initializing-variable-length-array



  • DirkB schrieb:

    Freumel schrieb:

    Aber

    int var=3;
    int array[var]={0};
    

    nicht.

    Das geht bei Variable Length Arrays halt nicht. Brauchst du die überhaupt?

    Hätte sich an einer Ecke angeboten um die Feldgröße variabel zu halten, aber brauchen tu ich's eigentlich nicht wirklich.
    Bin das Problem auch umgangen.



  • malloc und realloc kennst du? calloc initialisiert sogar automatisch.


Anmelden zum Antworten