pointerrückgabe führt zu fehler!



  • diese funktion soll eine textdatei lesen, die zahlen darin in einen 2d-map packen und diese dann zurückgeben.
    in diesem fall ist die map 16X16 felder groß. die ausgabe ist im moment auskommentiert, aber gab immer korrekte werte zurück. wenn ich aber auf den rückgabewert zurückgreife kommt scheiße raus.

    float *loadMap(char* file, int sizeX, int sizeY) {
    	float map[sizeX][sizeY];
    
    	std::ifstream Quelldatei(file, std::ios_base::in);
    	if (!Quelldatei) {
    		std::cerr << "Ausgabe-Datei kann nicht geöffnet werden\n";
    		return 0;
    	}
    	else {
    		std::string zeile = "";
    		string str = "";
    		float curH;
    		int _zeile = 0;
    		int _spalte = 0;
    		while(getline(Quelldatei, zeile)) {
    // 			std::cout<<std::endl<<"Zeile: "<<_zeile<<std::endl;
    			for(int i = 0; i < zeile.length(); i++) {
    				if(zeile[i] != ',')
    					str += zeile[i];
    				else {
    					curH = atof(str.c_str() );
    					str = "";
    					map[_zeile][_spalte] = curH;
    
    // 					std::cout<<map[_zeile][_spalte]<<"; ";
    					if(_spalte < sizeX-1)
    						_spalte++;
    				}
    			}
    			if(_zeile < sizeY-1)
    				_zeile++;
    		}
    		Quelldatei.close();
    		return map[0];
    	}
    }
    

    wenn ich damit auf die ersten elemente der jeweils 1.,2.,3. zeile zugreife kommt nur beim zugriff auf das 1. element ein guter bzw. richtiger wert heraus.

    float *map = loadMap("hMap3.txt", 16, 16);
    	std::cout<<map[0]<<" "<<map[16]<<" "<<map[32]<<std::endl;
    

    ich verstehe nicht was da nicht passt!!!



  • du kannst dich glücklich schätzen, dass du überhaupt einen gültigen wert bekommst.
    map ist eine lokale variable, deren leben mit dem verlassen der funktion endet. du müsstest das array von floats dynamisch allozieren. wenn dir das zu umständlich ist (und das ist es), steig auf std::vector um.
    by the way: auch dein dateistream (Quelldatei) wird am ende der funktion destruiert, d.h. du musst nicht manuell close aufrufen. das erledigt der destruktor für dich.


Log in to reply