INI Datei auslesen und als #define speichern



  • @Sepp

    Du verschleierst dafür andere Arten von Fehlern, wie doppelte frees.

    du hast ja recht - ich mache es auch eher so

    m_buffer = (int*)-1;

    aber gehört hier wohl einfach nicht rein

    @Carreck

    Von der Logik her muss ich also "nur" die Abfrage umschreiben.

    der zuletzt von dir gepostete Source ist totaler Müll

    mach einfach das stupide Ersetzen GENAU SO wie in meinem letzten Post beschrieben und suche dann den Fehler in der Verarbeitung - alles andere macht einfach keinen Sinn - dein nächster Post sollte deine 1. Version mit dem array_2d_t sein - ohne sonstige Änderungen, sei einfach mal Konsequent ohne basteln



  • llm schrieb:

    mach einfach das stupide Ersetzen wie in meinem letzten Post beschrieben und suche dann den Fehler in der Verarbeitung - alles andere macht einfach keinen Sinn

    Das habe ich bereits gemacht, dementsprechend sieht der Quellcode folgendermaßen aus:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <fstream>
    #include <cassert>
    
    #define X 10
    #define Y 10
    
    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_width);
    		assert(y >= 0 && y < m_height);
    		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.width(); i++)
    	{
    		for (int j = 0; j < arr.height(); j++)
    		{
    			printf(" %d", arr.at(i,j));
    		}
    		printf("\n");
    	}
    	printf("\n");
    }
    
    void neues_array(array_2d_t& a)
    {
    	array_2d_t temp(X, Y);
    	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(X, Y);
    	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 (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);
    
    			if (maske.at(i,j) > 3 || maske.at(i,j) < 2)
    				a.at(i,j) = 0;
    			else if (maske.at(i,j) == 3)
    				a.at(i,j) = 1;
    		}
    	}
    }
    
    int main(void)
    {
    	srand((unsigned int)time(NULL));
    	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;
    }
    

    Und dennoch:Es existiert immer noch der Assert-Fehler, weshalb ich die Abfrage umschreiben muss (so denk ich mir zumindest..)



  • Das habe ich bereits gemacht

    guter Junge - jetzt machen wirs noch kurz "konfigurierbar" und dann darfst
    du deinen Fehler suchen 🙂

    1. in void neues_array(array_2d_t& a){...}
    X ersetzen durch a.width()
    Y ersetzen durch a.height()

    2. in int main(){...}

    nach srand((unsigned int)time(NULL));

    int X = GetPrivateProfileInt("general","X", 10, ini);
    int Y = GetPrivateProfileInt("general","Y", 10, ini);

    einfuegen

    #define X und Y loeschen

    dann deinen Fehler suchen und die dynamische Spielfeldgroesse geniessen



  • 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 (laut assert 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 und j will ich nicht nachdenken, solange sie nicht x und y 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.



  • @Swordfish

    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.


Anmelden zum Antworten