Übergaben an Funktionen



  • Ich hätte mal eine grundlegende Frage.

    Bei allen anderen Compilern (getestet mit G++ und Bloodshed DevCpp) funktioniert eine Arrayinitialisierung mit bspw:

    char felder[iFelderAnzahl];
    

    Bei Visual Studio 2010 geht aber komischerweise nur:

    char *felder=new char[felder];
    
    spielfeld(char[]felder)
    {
       for(i=0;i<felder[i];i++){} //ein weiteres Problem war dass man bei strlen(felder) mehr felder ausgibt als bei felder[i] was ich komisch finde...bzw. nicht nachvollziehen kann
    }
    

    Anschließend habe ich einfach mal ein

    delete felder;
    

    gemacht um den Speicher freizugeben.

    Dann läuft es...aber warum nur??

    Ausserdem ist der Debugger defaultmäßig auch unschön für Anfänger, da ständig irgendwelche Assemblerfunktionen über viele Dateien mit durchdebugged werden (eax...mov...). Anscheinend muss man sehr viel umkonfigurieren um überhaupt halbwegs klarzukommen...oder sehr lange Einarbeitungszeit.



  • 1. Warum funktioniert das in Visual Studio nicht? Was wird für eine Fehlermeldung ausgegeben?
    2. Was du hier machst, ist Speicher dynamisch auf dem Heap zu allozieren, im Gegensatz zu deinem ursprünglichen Versuch.
    3. Ist dir bewusst, dass das Array uninitialisiert ist, das heißt, dass einfach irgendwas drinsteht? Was soll die Schleife da bewirken? Sobald der Inhalt der aktuellen Variable im Array kleiner als der Schleifenzähler ist, wird abgebrochen. Mit strlen() holst du die Anzahl der Bytes am Anfang, die nicht gleich 0 sind. Das dürfte also länger gehen (da sie ja zufällig initialisiert sind).



  • Eine Funktion ausserhalb von Main(baut spielfeld auf):

    char *spielfeld (char *c)
    {
    	for(int i=0;i<c[i];i++)
    	{
    		if((i%iAnzFelder)==(iAnzFelder-1)) // unterteile Felder zeilenweise 
    
    		{
    			cout << c[i] << iTrennzeichen <<endl;
    		}
    		else
    		{
    			if(i==(iFelder/2)) // zaehle bis Mitte um Mittenpin zu setzen
    			{
    				c[(iFelder/2)]=pin;
    			}
    			cout << c[i] << iTrennzeichen;
    		}
    	}
    	cout << endl;
    
    	return c;
    
    }
    

    So war der ursprüngl. Aufbau(befüllt spielfeld-methode mit Zeichen:

    //in der Mainmethode
    
            char *arr=new char[iFelder];
    
    	// baue array für zeichen im spielfeld
    
    	for(int i=0;i<iFelder;i++)
    
    	{
    		arr[i] = iFeldzeichen;
    	}
    
    	spielfeld(arr);
    

    Bei

    char arr[iFelder]
    

    meckert er mit Fehler bei Initialisierung.



  • in C++ muss die größe des Array's zur Compilierzeit feststehen. In deinem Fall könnte iFelderAnzahl darauf hinweisen, dass du sie zur Laufzeit erst füllst durch Eingabe oder sonst was.

    Drum z.B. so

    const int iFelderAnzahl = 6;
    
    char felder[iFelderAnzahl];
    

    oder aber durch dynamische Speicherverwaltung mit new und delete
    oder aber mit Containern aus der STL wie vector.
    oder aber gleich string aus der STL

    visualstudionichtmoeger schrieb:

    Bei allen anderen Compilern (getestet mit G++ und Bloodshed DevCpp) funktioniert eine Arrayinitialisierung

    Initialisierung heißt, einer Variablen einen Anfangswert zuweißen. Bei dir steht lediglich das drin, was halt grad zu der Zeit im Speicher da steht.

    // Bezogen auf mein Beispiel oben dann eher so:
    char felder[iFelderAnzahl] = {'H', 'a', 'l', 'l', 'o', '\0'};
    

    visualstudionichtmoeger schrieb:

    for(i=0;i<felder[i];i++){}
    

    😃 versteh ich nicht ... zumindest fällt mir gerade kein Anwendungsfall ein, warum man das wollen würde. Eventuell könnts klappen, dass er nur bis zum Nullterminierungszeichen geht, da zieh ich aber strlen doch lieber vor oder lieber gleich die string-Klasse verwenden.

    for(i=0;i<strlen(felder);i++)
    	{
    	}
    


  • int len = strlen(felder),
    
    for (int i = 0; i < len; ++i)
    {
    }
    


  • Wieso ist eigentlich defaultmäßig VStudio so ätzend vom Debugger her?

    Ich verstehe nicht warum sämtliche Dateien aufgerufen werden wo Assemblerfunktionen drinstehen(mov...eax etc.).

    Das muss man anscheinend umkonfigurieren,falls das überhaupt geht.

    Ich möchte es eher wie in Eclipse oder anderen Compilern, wo man schön die Variablen beobachten kann.

    Habe bisher nur programmiert ohne etwas zu ändern in VStudio.

    Wäre um Hilfe dankbar!



  • visualstudionichtmoeger schrieb:

    Wieso ist eigentlich defaultmäßig VStudio so ätzend vom Debugger her?

    Klingt nach Bedienfehler. Vielleicht F5 statt Strg+F5 zum Starten nehmen? Oder zum Debuggen auch die Debug-Version erstellen? Keine Ahnung, wie Du es schaffst, daß der Debugger bei Dir spinnt.


Anmelden zum Antworten