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 (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