Array enthält trotz {0} initilaisierung komische Werte



  • Das snip bezog sich auf eine überschnellte antwort, die ich überarbeitet habe und währenddessen stand da halt Snip^^



  • Okay, ich benutze jetzt

    try_x = Try[1]-'A';
    

    So funktioniert es.
    Wer das Spiel mal ausprobieren will, hier der Source
    (chaotisch, weil ich zZ noch keine Funktionen benutze):

    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    #include <conio.h>
    #include <windows.h>  
    
    using namespace std;
    
    void textcolor(int color)
    {
    	SetConsoleTextAttribute( ::GetStdHandle(STD_OUTPUT_HANDLE), color );
    }
    
    int main(int argc, char *argv[])
    {
    	char beep = 7;
    	bool getroffen=false;
    	char Try[3];
    	int try_x;
    	int try_y;
    	bool test = false;
    	const int tries = 10;
    	int tries_count=tries;
    	srand(time(NULL));
    	const int map_size=5;
    	const int target_count = 5;
    	int target_count_help = target_count;
    	char map[map_size][map_size] = {0};
    	char targets[map_size][map_size] = {0};
    	int x,y;
    	char y_scale='A';
    	int x_scale=1;
    
    	cout<<"Finden Sie einen der "<<target_count<<" Schaetze!"<<endl<<endl;
    	cout<<"  ";
    	for(x_scale=0;x_scale<map_size;x_scale++){
    		cout<<x_scale<<' ';    
    	}
    	cout<<endl;
    
    	for(y=0; y<map_size; y++){
    		cout<<y_scale<<' ';
    		y_scale++;
    		for(x=0;x<map_size;x++){
    			cout<<'#'<<' ';
    		}
    		cout<<endl;
    	}
    	for(y=0; y<map_size; y++){
    		for(x=0;x<map_size;x++){
    			targets[x][y]=0;
    		}
    	}
    	while(target_count_help){
    		x = rand()%map_size+1;
    		y = rand()%map_size+1;
    		if(!targets[x-1][y-1]){
    			targets[x-1][y-1]='x';
    			target_count_help--;
    		}
    	}                                          
    	if(test){                        
    		for(y=0; y<map_size; y++)         {
    			cout<<"  ";
    			for(x=0;x<map_size;x++){
    				cout<<targets[x][y]<<' ';
    			}
    			cout<<endl;
    		}                  
    	}              
    	cout<<"\r\nZiel eingeben:"<<endl;
    	while(tries_count>0 && !getroffen){
    		cin.getline(Try, 3);
    		try_x = Try[1]-'0';
    		try_y = Try[0]-'A';
    		//cout<<"X: "<<try_x<<"  "<<"Y: "<<try_y<<endl;
    		if(targets[try_x][try_y] == 'x'){
    			cout<<"\r\nGewonnen!"<<endl<<"Sie haben einen Schatz gefunden!\r\n"<<endl;
    			getroffen = true;    
    
    			for(y=0; y<map_size; y++){
    				cout<<"  ";
    				for(x=0;x<map_size;x++){
    
    					if(x != try_x || y != try_y){
    						cout<<targets[x][y]<<' ';
    					}else{
    						textcolor(12);
    						cout<<'#';
    						textcolor(15);
    					}
    				}
    				cout<<endl;
    			}                  
    			cout<<endl;                        
    		}        
    
    		else{
    			cout<<"keinen Schatz gefunden..."<<endl;
    		}
    		tries_count--;    
    		if(tries_count && !getroffen) cout<<"Noch "<<tries_count<<" Versuche."<<endl;
    	}
    	if(!getroffen) cout<<"Verloren!"<<beep<<endl<<endl;
    	system("PAUSE");
    	return EXIT_SUCCESS;
    }
    

    //Edit: Code _etwas_ lesbarer formatiert



  • Webster schrieb:

    (chaotisch, weil ich zZ noch keine Funktionen benutze)

    Ahja... aber die Formatierung soll in Ordnung sein?! *scnr

    EDIT: Jetzt hat er es schon um einiges besser formatiert. 😉



  • lagalopex schrieb:

    Webster schrieb:

    (chaotisch, weil ich zZ noch keine Funktionen benutze)

    Ahja... aber die Formatierung soll in Ordnung sein?! *scnr

    Ist sie nicht. Ich komm mit devcpp nicht ganz klar...



  • ich greif mir mal grade ne stelle wo mans besonders drastisch sieht:

    for(y=0; y<map_size; y++){
                    cout<<"  ";
                    for(x=0;x<map_size;x++){
    
                        if(x != try_x || y != try_y){
                            cout<<targets[x][y]<<' ';
                        }else{
                            textcolor(12);
                            cout<<'#';
                            textcolor(15);
                        }
                    }
                    cout<<endl;
                }
    

    die '{' gehört nicht hinter die schleife/bedingung! mag zwar
    geschmackssache sein, aber man kanns echt schwer lesen besonders bei
    bis zu 4 einrückebenen wo welche klammer hingehört.

    versuchs so

    for(y = 0; y < map_size; ++y)
    {
        cout << "  ";
        for(x = 0; x < map_size; ++x)
        {
            if(x != try_x || y != try_y)
            {
                cout << targets[x][y] << ' ';
            }
            else
            {
                textcolor(12);
                cout << '#';
                textcolor(15);
            }
        }
        cout << endl;
    }
    

    😉



  • einrücker schrieb:

    ich greif mir mal grade ne stelle wo mans besonders drastisch sieht:

    Sehe da kein Problem.
    Du musst die Klammer nicht sehen - die Einrueckung sagt dir schon wo ein Block beginnt und wo er endet...



  • Sehe das ähnlich wie Shade of Mine.
    Nebenbei bemerkt wird der Einrückungsstil, den Webster verwendet u.a. im Linuxkernel eingesetzt.
    Das lässt wohl darauf schließen dass eine ganze Reihe guter Programmierer diesen Stil als sinnvoll und gut zu lesen anerkannt haben, was zwar nicht bedeutet, man muss ihn unbedingt mögen, jedoch zumindest nahelegt, dass der Stil nicht unbedingt schlecht ist. Absolute Geschmackssache und deswegen wohl kaum eine Diskussion wert.

    Ich finde hingegen, dass einige Leerzeilen mehr dem Code gutun würde, v.a. zwischen mehreren Funktionen und Variablen.



  • Hmm. Also ich bin da anderer Meinung. Ich lese Blockweise schneller und übersehe weniger. Wie ist das denn bei euch? - Wenn ihr viel (unbekannten) Code habt, wo ihr was drin machen müsst, akzeptiert ihr den Stil einfach und kommt gut damit klar, oder wäre es euch doch lieber der andere?

    Lesen kann ichs auch, aber ich übersehe da eher etwas, als wenn ich die Blockweise nehme.

    Ich will jetzt keine Diskussion, was besser ist. Das ist bestimmt ansichtssache, aber nehmt ihr den Stil einfach, weil er halt Standard ist und weit verbreitet, oder weil ihrs wirklich besser und schneller lesen könnt?



  • keiner der beiden Stile ist standard - oder beide. Je nachdem wie mans nimmt: Codestil ist was Klammersetzung usw. angeht nicht standardisiert, auch nicht quasi-standardisiert. Auf der anderen Seite kommen beide Stile häufig vor, es ist Geschmackssache welchen man theoretisch besser findet, Gewöhnungssache mit welchem man praktisch besser zurechtkommt und Projektsache welchen man dann tatsächlich praktiziert.

    Wenn man viel unbekannten Code hat bleibt einem nichts anderes übrig als den vorliegenden Stil zu akzeptieren, und wenn man ihn bearbeiten muss sogar im gleichen Stil weiterzuschreiben.



  • irgendwie hab ich das gefühl dasss heir am thema vorbei geredet wird oder?

    aber zum thema
    soweit ich weis kann man ein array nicht auf deine weise initialisieren oder?

    sowas geht

    int [] a = { 0, 1, 2, 3, 4 };
    int [5] b = { 0, 1, 2, 3, 4 };
    
    int [5] falsch = { 0 }; //  geht nicht
    

    d.h. es geht schon nur ist nur der erste wert mit 0 belegt (oder halt die ersten 10 wenn du 10 zahlen reinschreibst



  • Wenn du ein schon intialisiertes Array brauchst, nim doch gleich std::vector.
    da kanste dann auch gleich beim konstruktor den Standardwert übergeben. Bsp.:

    std::vector<char> DeinArray(5,'A')
    

    So hast du einen Vector mit 5 Elementen, die bereits mit einem A initialisiert sind.



  • Skym0sh0 schrieb:

    d.h. es geht schon nur ist nur der erste wert mit 0 belegt (oder halt die ersten 10 wenn du 10 zahlen reinschreibst

    Nein eine Null reich um alles mit 0 zu initialisieren.

    ISO IEC 14882 §8.5.1,7 schrieb:

    If there are fewer initializers in the list than there are members in the aggregate, then each member not
    explicitly initialized shall be value-initialized (8.5)

    ISO IEC 14882 §8.5,5 schrieb:

    To value-initialize an object of type T means:
    — if T is a class type (clause 9) with a user-declared constructor (12.1), then the default constructor for T is
    called (and the initialization is ill-formed if T has no accessible default constructor);
    — if T is a non-union class type without a user-declared constructor, then every non-static data member
    and base-class component of T is value-initialized;
    - if T is an array type, then each element is value-initialized;
    — otherwise, the object is zero-initialized



  • Wenn ihr mal wieder so hässlichen Code habt ( '{' neben Funktionsname) könnt ihr doch einfach replacen:

    Find what:
    \) \{

    Replace with:
    )\n{

    Use: Regular Expressions

    👍



  • Skym0sh0 schrieb:

    sowas geht

    int [] a = { 0, 1, 2, 3, 4 };
    int [5] b = { 0, 1, 2, 3, 4 };
    
    int [5] falsch = { 0 }; //  geht nicht
    

    Die Dimensionsklammern kommen aber nach dem Bezeichner. 😉
    Es reicht übrigens auch Folgendes, um das ganze Array mit 0 zu initialisieren:

    int richtig[5] = {};
    

Anmelden zum Antworten