INI Datei auslesen und als #define speichern
-
Und wie schon geschrieben, die Bedingungen umdrehen:
if (i > 0 && j > 0 && temp.at((i-1),(j-1)) == 1)
etc.
Aber dieses Gemisch aus C und C++ ist schrecklich - entweder nur C (dies ist schließlich das C Subforum!) oder konsequent modernes C++.
-
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <fstream> #include <Windows.h> #include <cassert> struct array_2d_t { array_2d_t(int p_width, int p_height) : m_width(p_width), m_height(p_height), m_buffer(0) { //allokieren m_buffer = new int[p_width*p_height]; } ~array_2d_t() { //speicher aufrauemen delete[] m_buffer; m_buffer = 0; } int& at(int x, int y) { assert(x >= 0 && x <= m_height); assert(y >= 0 && y <= m_width); return m_buffer[x*m_width + y]; } int width() const { return m_width; } int height() const { return m_height; } int* m_buffer; // alternativ auch std::vector<std::vector<int>> aber man soll ja noch was lernen int m_height; int m_width; }; void random_array(array_2d_t& A) //Random Array mit X,Y erzeugen { for (int i = 0; i < A.height(); i++) { for (int j = 0; j < A.width(); j++) { A.at(i,j) = rand() % 2; //Füllen mit 0 / 1 } } } void array_anzeigen(array_2d_t& arr) //Random Array mit X,Y anzeigen { for (int i = 0; i < arr.height(); i++) { for (int j = 0; j < arr.width(); j++) { printf(" %d", arr.at(i,j)); } printf("\n"); } printf("\n"); } void neues_array(array_2d_t& a) { array_2d_t temp(a.width(), a.height()); for (int i = 0; i < a.height(); i++) { for (int j = 0; j < a.width(); j++) { temp.at(i,j) = a.at(i,j); } } array_2d_t maske(a.width(), a.height()); for (int i = 0; i < a.height(); i++) { for (int j = 0; j < a.width(); j++) { maske.at(i,j) = 0; } } for (int i = 0; i < a.height(); i++) { for (int j = 0; j < a.width(); j++) { if (i > 0 && j > 0 && temp.at((i - 1), (j - 1)) == 1) ++maske.at(i, j); if (j > 0 && temp.at(i, (j - 1) == 1)) ++maske.at(i, j); if (i > 0 && temp.at((i - 1), j) == 1) ++maske.at(i, j); if (i > 0 && j + 1 < a.width() && temp.at((i - 1), (j + 1)) == 1) ++maske.at(i, j); if (j + 1 < a.width() && temp.at(i, (j + 1)) == 1) ++maske.at(i, j); if (i + 1 < a.height() && temp.at((i + 1), j) == 1) ++maske.at(i, j); if (i + 1 < a.height() && j > 0 && temp.at((i + 1), (j - 1)) == 1) ++maske.at(i, j); if (i + 1 < a.height() && j + 1 < a.width() && temp.at((i + 1), (j + 1)) == 1) ++maske.at(i, j); if (maske.at(i, j) > 3 || maske.at(i, j) < 2) a.at(i, j) = 0; else if (maske.at(i, j) == 3 || maske.at(i,j) == 2) a.at(i, j) = 1; } } } int main(void) { srand((unsigned int)time(NULL)); int X = GetPrivateProfileInt("general", "X", 10, "./test.txt"); int Y = GetPrivateProfileInt("general", "Y", 10, "./test.txt"); array_2d_t A(X, Y); random_array(A); int runde = 1; while (getchar()) { neues_array(A); printf(" Runde %i\n", runde); array_anzeigen(A); ++runde; } return 0; }
So, geht...
-
Carreck schrieb:
/* ... */ int& at(int x, int y) { assert(x >= 0 && x <= m_height); assert(y >= 0 && y <= m_width); return m_buffer[x*m_width + y]; } /* ... */
Die Implementierung von llm ist in zweierlei Hinsicht irreführend:
Erstens werden zweidimensionale Koordinaten üblicherweise als (x/y) angegeben, wobei x die horizontale (column) und y die vertikale Entfernung (row) vom Ursprung angibt. Bei llm ist es (lautassert
s) umgekehrt.
Zweitens ist auch das Speicherlayout für C und C++ unüblich.Mein Vorschlag:
/* ... */ int& at(int x, int y) { assert(0 <= x && x < m_width); assert(0 <= y && y < m_height); return m_buffer[y*m_width + x]; } /* ... */
Über deine
i
undj
will ich nicht nachdenken, solange sie nichtx
undy
heißen ...
-
Carreck schrieb:
if (temp.at((i-1),(j-1)) == 1 && i > 0 && j > 0) ++maske.at(i,j); if (temp.at(i,(j-1)) == 1 && j > 0) ++maske.at(i,j); if (temp.at((i-1),j) == 1 && i > 0) ++maske.at(i,j); if (temp.at((i-1),(j+1)) == 1 && i > 0 && j + 1 < X) ++maske.at(i,j); if (temp.at(i,(j+1)) == 1 && j + 1 < X) ++maske.at(i,j); if (temp.at((i+1),j) == 1 && i + 1 < Y) ++maske.at(i,j); if (temp.at((i+1),(j-1)) == 1 && i + 1 < Y && j > 0) ++maske.at(i,j); if (temp.at((i+1),(j+1)) == 1 && i + 1 < Y && j + 1 < X) ++maske.at(i,j);
Und dennoch:Es existiert immer noch der Assert-Fehler, weshalb ich die Abfrage umschreiben muss (so denk ich mir zumindest..)
Das Problem liegt im zitierten Code. Beweg die Prüfungen von i und j vor den Aufruf von temp.at in der if-Bedingung. Ansonsten greifst du auch mit ungültigen Werten schon auf temp zu und das löst die asserts aus.
-
@Swordfish
In deinen asserts nur auf kleiner prüfen, nicht kleiner gleich (jeweils die zweite Überprüfung).
-
Danke DocShoe! Korrigiert.
-
zu meine halben Ehrenrettung - die height(), with() hat Carreck beim
kopieren meines Beispiels vertauscht oder versucht damit meinen Fehler mit x*with+y zu korrigieren
-
llm schrieb:
zu meine halben Ehrenrettung - die height(), with() hat Carreck beim
kopieren meines Beispiels vertauscht [..]Sorry, hat-
te die hoff-
nung, Carr-
eck beherr-
sche Copy
& Paste.
-
Die ganze Sache ist und bleibt Müll, ob nun C++ Zeugs im C Forum oder algorithmischer Schrott mit der total redundanten 'maske', für die eine simple temp. int-Variable ausreicht.
Das wird auch nicht besser, wenn hier irgendwelche Pseudo-Helfer den Code noch mehr verunstalten, es bleibt dabei: dein Code ist Schrott, deine Programmlogik ist Schrott, deine Arbeitsweise beim Herangehen an Probleme ist Schrott, lasse dich damit am besten nirgendwo sehen, d.h. erst recht nicht hier im C-Forum.
-
Wutz schrieb:
[...] Pseudo-Helfer [...]
Danke für die Blumen!
Wutz schrieb:
[...] lasse dich damit am besten nirgendwo sehen, d.h. erst recht nicht hier im C-Forum.
GEHTS NOCH, ARMLEUCHTER!?
-
Die ganze Sache ist und bleibt Müll, ob nun C++ Zeugs im C Forum oder algorithmischer Schrott mit der total redundanten 'maske', für die eine simple temp. int-Variable ausreicht.
Das wird auch nicht besser, wenn hier irgendwelche Pseudo-Helfer den Code noch mehr verunstalten, es bleibt dabei: dein Code ist Schrott, deine Programmlogik ist Schrott, deine Arbeitsweise beim Herangehen an Probleme ist Schrott, lasse dich damit am besten nirgendwo sehen, d.h. erst recht nicht hier im C-Forum.@alle, die geholfen haben: Danke!
@Wutz: [ironie on]Du bist also geboren und konntest sofort perfekt programmieren, Hut ab! [/ironie off]@Moderator: Thema beendet, für ein weiteres Problem mach ich 'n neuen Beitrag auf. Bitte schließen, danke.