[dynamische] Arrays



  • Hallo Leute, folgendes Problem:
    Ich bekomme zur Laufzeit einen Wert, der beschreibt, wie groß mein Array ist.
    Das Array muss ich in zei Funktionen nutzten, es muss also Global sein.
    Ich mus es also irgendwie schaffen eine globale Arrays von Strings zur Laufzeit festzulegen. Eine Idee war mit Pointern, aber da bekomm ich irgendwie Zugriffsverletzungen. Ich will bitte keinen std::vector benutzten. Am liebesten wäre mir etwas wie setlength() 🙂

    Hier mal mein Code:

    using namespace std;
    
    int felder[40000],K,reihen,zeilen;
    string SR[10];
    
    int Suche(int X, int Y) {
    	felder[K]++;
    	SR[X][Y]='#';
    
    	if (X<zeilen-1) {
    		if (SR[X+1][Y]=='*') {
    			Suche(X+1,Y);
    		}
    	}
    
    	if (X>0) {
    		if (SR[X-1][Y]=='*') {
    			Suche(X-1,Y);
    		}
    	}
    
    	if (Y>0) {
    		if (SR[X][Y-1]=='*') {
    			Suche(X,Y-1);
    		}
    	}
    	if (Y<reihen-1) {
    		if (SR[X][Y+1]=='*') {
    			Suche(X,Y+1);
    		}
    	}
    	return 0;
    }
    
    int main() {
    	ofstream fout ("satpix.out");
    	ifstream fin ("satpix.in");
    	int I,J,L,temp;
    
    	fin >> zeilen;
    	fin >> reihen;
    
    	for (I=0; I<40000; I++) {
    		felder[I]=0;
    	}
    
    	for (I=0; I<reihen; I++) {
    		fin >>    SR[I];
    	}
    
    	K=0;
    	for (I=0; I<reihen; I++) {
    		for (J=0; J<zeilen; J++) {
    			if (SR[I][J]=='*') {
    				temp=Suche(I,J);
    				K++;
    				for (L=0; L<reihen; L++) {
    					fout << SR[L] <<endl;
    				}
    			}
    		}
    	}
    
    	for (I=0; I<=K; I++) {
    		fout << felder[I] <<endl;
    	}
    
    	fout <<zeilen<<reihen<<endl;
    
    	return 0;
    }
    //(edit von volkard: durch den formatter von Code::Blocks geschickt)
    

    Es geht um dieses Array:
    SR[10]. Das soll eigentlich immer so groß sein, wie die Zeilenanzahl!

    Danke
    Grüße Sylvus



  • Sylvus schrieb:

    Das Array muss ich in zei Funktionen nutzten, es muss also Global sein.

    Das ist ein Fehlschluss. Du kannst Parameter einsetzen, um Informationen mit Funktionen auszutauschen. Meist ist das der bessere Weg als globale Variablen.

    Sylvus schrieb:

    Ich will bitte keinen std::vector benutzten.

    Kannst du mir sagen, weshalb? Du kannst natürlich manuell was schreiben, aber das wird darauf hinauslaufen, dass du die Funktionalität von std::vector nachbaust. Es ist auch unwahrscheinlich, dass du bessere Performance erreichst.

    Könntest du deinen Code vielleicht etwas vernünftiger einrücken? :xmas1:



  • Wenn es denn _unbedingt_ und _wirklich_ nicht mit einer vorhandenen Klasse, wie std::vector geht, dann kannst du ja dein Array dynamisch anfordern.

    #include <iostream>
    
    int main ()
    {
     int size = 0;
     std::cout << "Bitte Groesse eingeben\n";
     std::cin >> size;
    
     int* field = new int[size];
    
     //.. mach, was immer du machen willst
    
     delete[] field; // wieder brav freigeben
    }
    

    Allerdings bezweifle ich, wenn ich mir deinen Code so anschaue, dass du wirklich entscheiden kannst, ob du nicht doch besser einen std::vector nimmst (weil du da, wie ich sehe Nexus bereits gesagt hat, nachbaust).

    Warum willst du denn nicht die optimierte und weit getestete Funktionalität der Standardbibliothek benutzen? (wenn es rein für das Verständnis ist, dann ist das obige the way to do this, allerdings sollte man das ganze auch noch schön wrappen und ein wenig generischer gestalten und dann kommt man auf so etwas, wie std::vector).


  • Mod

    Den Code kann man sich nicht anschauen. Wenn schon scrollen erforderlich ist, sollte das Problem interessant genug sein.

    Sylvus schrieb:

    Ich will bitte keinen std::vector benutzten.

    Dieses Board ist für Programmierprobleme da, nicht mentale.



  • camper schrieb:

    Den Code kann man sich nicht anschauen. Wenn schon scrollen erforderlich ist, sollte das Problem interessant genug sein.

    Da ist was Wahres dran. Ich habe ihn nicht durchgelesen.

    camper schrieb:

    Sylvus schrieb:

    Ich will bitte keinen std::vector benutzten.

    Dieses Board ist für Programmierprobleme da, nicht mentale.

    Da ist nicht so viel Wahres dran. :xmas2: :xmas1:



  • Zu erst zu der Lesbarkeit:
    Ja ich weiß, das ist grausam, tut mir Leid!
    Habs irgendwie mit Dev C++ noch nicht hinbekommen, das automatisch zu machen und manuell ist es mir zu zeitaufwändig.

    Ich hatte vond em std::vector gelesen, war aber einfach von der komplexität überfordert, darum wollte ich das vermeiden.

    Ich weiß, dass das Programm nicht interessant ist, es ist lediglich zum üben gedacht. Ich zwinge ja auch keinen sich das ganze durchzulesen. Wollte lediglich zeigen, was ich damit will.

    Ich werd mir jetzt mal die Lösung mit dem Pointer genauer anschauen, auch wenn ich da so wie es aussieht ein paar Probleme bekomme.

    Danke an die, die mir versucht haben weiter zu helfen.

    //Anmerkung
    gerade wenn man üben will, kann man ja wohl auf Funkionen verzichten und selbst was versuchen. Ich weiß nicht, warum Leute so gereizt reagieren. Ein Forum ist für meine mentalen Probleme da 🙂

    Danke

    //edit
    hab den Code jetzt etwas überarbeitet, ich will ja was von euch, also kann ich auch versuchen selbst etwas Zeit zu opfern 😉



  • Sylvus schrieb:

    Zu erst zu der Lesbarkeit:
    Ja ich weiß, das ist grausam, tut mir Leid!
    Habs irgendwie mit Dev C++ noch nicht hinbekommen, das automatisch zu machen und manuell ist es mir zu zeitaufwändig.

    Dazu empfehle ich, sich eine kostenlose Zweit-IDE zu installieren, zum Beispiel Visual Studio Express oder Code::Blocks.



  • Sylvus schrieb:

    //Anmerkung
    gerade wenn man üben will, kann man ja wohl auf Funkionen verzichten und selbst was versuchen. Ich weiß nicht, warum Leute so gereizt reagieren. Ein Forum ist für meine mentalen Probleme da 🙂

    Danke

    Das liegt wohl daran, dass du nicht begründet hast, warum du keinen std::vector benutzen willst. 😉
    Wenn du gesagt hättest, dass du einfach das auf einer niederen Ebene verstehen willst, wie man so etwas löst, dann wäre alles in Ordnung. Aber wenn du einfach sagst, dass du ihn nicht benutzen willst, oder er zu "komplex" ist, dann ist das eine falsche Annahme und sollte berichtig werden. std::vector ist sehr intuitiv zu benutzen und auch sehr anfänger freundlich (viel mehr, als das, was man machen muss, wenn man ihn nicht benutzt). Die "Schwierigkeit" leigt eigentlich höchstens darin, dass da noch so komische eckige Klammern vorkommen, welche sich, wie du später lernen willst etwas mit templates zu tun hat. Aber im Moment gibst du in diesen eckigen Klammern lediglich den Typen der Variable an, welche du speichern möchtest. Kleines Beispiel:

    #inlcude <iostream>
    #include <vector> // includen des vectors, damit wir ihn auch benutzen können
    
    int main ()
    {
     int size = 0;
     std::cout << "Bitte Groesse eingeben\n";
     std::cin >> size;
    
     std::vector<int> v (size); // <int> bedeutet hier, dass du int's speichern möchtest
                                // und bei size gibst du die Grösse an
    
    //benutze hier v genau gleich, wie ein Array
    //du hast aber noch mehr Möglichkeiten, siehe dazu Link
    
    //beachte hier, dass du selbst nichts aufräumen musst. Das macht vector selbst
    }
    

    Mehr darüber erfährst du hier:
    http://www.cplusplus.com/reference/stl/vector/

    Und wenn du ein wenig googles findest du bestimmt auch noch eine Menge Beispiele. Aber du solltest bereits sehen, dass es einfacher (und auch sicherer) ist mit dem vector zu arbeiten, als direkt mit dynamischen Arrays. (oder siehst du das anderst?)



  • 1. hab mir ne zweite Umgebung runtergeladen, scheint auch gut zu funktionieren.
    2. zu dem Vector hatte ich als erstes:
    http://www.cppreference.com/wiki/stl/vector/vector_constructors
    gefunden und das hat mich eher abgeschreckt.

    3. dein Beispiel sieht gut aus, aber dazu ne Frage:
    Ich will das Array ja global benutzten, so wie es aussieht, hast du es jetzt nur in der Funktion deklariert, oder?

    Grüße Sylvus
    P.S. ja ich mach das erst seit 2-3 Tagen^^

    Edit:
    Hab jetzt folgendes probiert:

    std::vector<string> SR;
    
    int main() {
        fin >> reihen;
        std::vector<string> SR (reihen);
    ...}
    
    int Suche(int X, int Y) {
        felder[K]++;
        SR[X][Y]='#';
    }
    

    das compiliert er zwar, aber bei der Ausführung gibt es Fehler...



  • Ja, weil du lokal eine andere Variable definierst, welche den globalen überdeckt und somit ist der globale immer noch leer.

    Das kannst du aber mit Boundchecks rausfinden. Siehe dazu:
    http://www.cplusplus.com/reference/stl/vector/size/

    Sprich du darfst nicht ausserhalb des gültigen Bereiches (0 bis n-1) zugreifen.

    Um das zu umgehen mache das wie folgt:

    std::vector<string> SR;
    
    int main() {
        fin >> reihen;
        SR.resize (reihen); //resizen
    ...}
    
    int Suche(int X, int Y) {
        felder[K]++;
        SR[X][Y]='#';
    }
    


  • Super! Ist ja doch nicht so schwer 🙂

    Jetzt hab ich noch eine letzte Frage, hoffe ich kann die hier noch so posten:
    Also ich will die größte Fläche (aus Sternen) mit dem Programm finden.
    Bekomme dadurch jetzt folgendes Ergebnis:

    .*.##.####.#.###.#..######.##########.......................
    *.*.#########.####.##..#.#####..###.#####...................
    .**..#..###.###..###.###.##.##.###..####....................
    **.#.##.######.*..#####.###....##.**.#......................
    **.###.##..####..#.##.#.#####.##..*.*.*.....................
    *.####...*.#..##########.#.....#...***......................
    ..####.**..##.#...#.###..#..*.##...***..*...................
    .#.#..*....###...##......##..######.*...*..*****............
    ####.**.**....***.#.#.####..*.######.****.*.****............
    #####.........*...###.#.##.**.#.##...*.***.*.*.*.**.*.**...*
    #####....*.*.***..#.###......#.###.##..*.....*.********..**.
    ###.....**..****.###.#.#####.##.##..##...**.**..***.*****.*.
    #..*.***.**.****...#...###..#.#######..**.*..**.**.....*.*..
    .*.*...*...**..*.####.#####.####...####.*..*..*..*....******
    ...**..**.**.**..###.##..##.#.####.##..#.*.**....*****.***.*
    **...*.******...*.##############.#######.*****...**..*****..
    *..***.*.*.****.**..#....#..#############**..*..*...*****.*.
    .****.**.**..*.*...###..####..####.#.##.#**..**...*..******.
    **.*****.**.***..########.##.##..######..**.**..*.*.*.**....
    ..*.*.****.**.*.####.###############..#.***..***.*....*.*..*
    .*****..*..**..###.###...####.##.#####.*.*.*****.***.*..*.**
    .*.***..*.****.#.###..*.##..#...*.#...***.**.***..***.*.*..*
    *..**..***.****.*..#.**..###.#...*.******..****.**..*..***..
    *.***..***.****.*.###....#####.*..*.*****.*....*.**.****.**.
    ****.*.*.*...*****.##.#.*.####..#.*.*.***.****.***...*****.*
    ..*.*********.*...##..##.#.#######.**.*.*********.*..*.**...
    *.**.*...*.**.***.#.#.######.##.#.******..***.****..**.*.***
    ****.*.********.*.###....#..#.###.*..*.***.**.*.*.*******.*.
    *.*..****.**..***.#.........###.#..*..*......****.*******.**
    .***.*****.*.*.***....*.#######.##..*..*..*.*..***.*********
    ******..*********.*.*.....#....#####..*.#**..*****...*....**
    ******...**.*.*.*.*..####.#.####.####.*.#**.*******..**.***.
    .******.*....*****.**.###.#.###..#####.##...*.***..**..****.
    *..*....**...*...**...#.##.#######.#.##.#..***.*********.*.*
    *...***....**..*.*.###.##.#.###.##.##.###..****..**..**..**.
    **...*****.****.***..##########...##....#**..*..***....**...
    *.*.**..********.*.**..#...########.*..*.**.***.**......**.*
    *.*.**.*.....*****.**.###.#.....####..#.#*.*.*****.**...**.*
    .*******.*..*******..*.#..#####....####.#**.**.***..*.***.**
    .*....**..*.******.***.####.##..####..###*.***....*****..*.*
    

    da gibts jetzt aber rechts unten Punkte, die nicht erreicht werden, aber müssten, weiß jemand warum?

    Danke



  • Sylvus schrieb:

    1. hab mir ne zweite Umgebung runtergeladen, scheint auch gut zu funktionieren.

    Hihi. Das ist nett.
    Normalerweise kommen gleich schlimme Beschimfungen über Dev C++ und jeden, der es benutzt, und der Fragesteller verliert die Lust.
    Fein, daß Du erstmal dabei geblieben bist. Aber ich fürchte, wir müssen noch über dein C++-Lehrbuch herziehen und über Deine Schuhgröße meckern. Sei nicht erstaunt, wenn das bei den nächsten Fragen oder gar in diesem Thread kommt. Wir Programmierer sind halt nicht mehr wesentlich toleranter als der Compiler, mit dem wir den ganzen Tag reden; aber das ist niemals böse gemeint. :xmas1:



  • Ich hab aber gar kein C++ Lehrbuch 😉
    Bin eigentlich nicht so unerfahren mit dem ganzen, nur in C++. Kann halt andere Sprachen und versuch mir das grad alles zu übertragen.
    Ich kenn also Pointer, Arrays, Bäume, Stapel... aber nicht in cpp und irgendwie ist hier doch eniges etwas anders.

    Danke für die Hilfe,
    mein Programm funktioniert inzwischen.

    Grüße Sylvus



  • Welche Schuhgröße hast Du?



  • 48

    ach quatsch die richtige Antwort ist natürlich 42 😉 😉 😉



  • Sylvus schrieb:

    48
    ach quatsch die richtige Antwort ist natürlich 42 😉 😉 😉

    Gute Antwort.
    Darf ich den Thread schließen, weil alles wichtige beantwortet wurde?
    Ich möchte vermeiden, daß die Schuhgrößendiskussion uns gleich überrennt. Es gibt nämlich unendlich viel zur 42 zu sagen, fürchte ich, und Du hast elegant von der uninteressanten Schuhgröße auf ein extrem interessantes Thema verzweigt.



  • klar und danke!

    Bis bald


Anmelden zum Antworten