Pointer oder nicht? (hoffentlich gehts nun...)
-
Hi Maedels,
sorry für die vorigen 3 Beitraege. Hatte ständig Serverfehler. Daher die Posts ohne Inhalt. Merkwuerdig....bitte loeschen!!!
Mein Problem liegt darin, dass es ewig dauert die Inhalte meiner nicht gerade kleinen Matrizen (ca. 400*40)zu sortieren. Beim Dreieckstausch geht halt enorm viel Zeit drauf. Nun meine eigentliche Frage.
Kopiere ich in meinem Code die gesamten Inhalte der Matrizen oder nur die Pointer???
Ich weiß es leider immer noch nicht!! Werde es wohl nie kapieren. Jedoch denke ich, dass ich NICHT mit Pointern arbeite und ich somit eine gute Chance hätte den Algorithmus um einiges zu beschleunigen.
Ich habe mal das Anlegen der Matrize zugepackt, dazu noch das eher unwichtige Befüllen der Matrize und am Ende das eigentliche Sortieren.
Wovon aber nur der Dreieckstausch wirklich wichtig ist, da ich dort an die Komponenten rangehe.
Wäre cool wenn jemand helfen koennte!!!
Vielen dank schonmal!!!
GünniHABE CODE GELOESCHT UND WEITER UNTEN NEU REINGESTELLT, DA ER UNLESBAR WAR!
-
Uh, sorry, aber das ist ja absolut unlesbar, kannst Du das vielleicht mal in eine etwas angenehmere Form bringen?
Ich habe so ehrlich gesagt absolut keine Lust mir das durchzulesen und ich könnte mir vorstellen, dass es anderen ebenso geht.
-
hast vollkommen recht....hab ich aus meiner mail kopiert welche ich an nen kumpel geschickt hab und vorschau war mir zu kriminell wegen der vorigen serverfehler
daran liegts wohlich kopiers nochmal ausm compiler
-
eigentlich ist auch nur dies hier wirklich von interesse...und eigentlich nur der dreieckstausch in der 2ten FOR-Schleife.
tausche ich hier die ganzen daten oder nur die pointer?CString **m_Matrix; for (i=0;i<m_AnzahlAuftraege;i++) { m_Matrix[i] = new CString[m_spalten]; } do // Sortierung nach gewähltem Suchkriterium ALT!!!!!!!!!!!!!!! { if ((m_Matrix[a][m_kritkomp]) >( m_Matrix[a+1][m_kritkomp])) { // Dreieckstausch nach gewähltem Suchkriterium for (int i=0;i<40;i++) { m_HilfsMatrix[0][i] = m_Matrix[a][i] ; m_Matrix[a][i] = m_Matrix[a+1][i] ; m_Matrix[a+1][i] = m_HilfsMatrix[0][i]; } a=0; } else { if (a< (m_AnzahlAuftraege-2)) { a++; } } // Dieses solange bis das Ende der Matrix erreicht ist!!!
-
Du machst aber kein Sortieren aber was anderes in deinem Beispiel
-
... und du kopierst Inhalten des Zeichenketten
-
ja dies ist nur ein ausschnitt...
meine farge ist eigentlich recht einfach und auf grundlagen bezogen
hier kurz ein besseres beispiel:
CString *r = new CString[10]; CString *s = new CString[10]; r[1]="Inge"; s[1]="Franz"; r[1] = s[1];
gehe ich recht in der annahme, dass ich in den einzelnen komponenten pointer auf die CStrings anstatt der CStrings selbst tausche?
das ist meine eigentliche und einzige frage
-
Guenter Mies schrieb:
ja dies ist nur ein ausschnitt...
meine farge ist eigentlich recht einfach und auf grundlagen bezogen
hier kurz ein besseres beispiel:
CString *r = new CString[10]; CString *s = new CString[10]; r[1]="Inge"; s[1]="Franz"; r[1] = s[1];
gehe ich recht in der annahme, dass ich in den einzelnen komponenten pointer auf die CStrings anstatt der CStrings selbst tausche?
das ist meine eigentliche und einzige frageType von r[i] ist CString, dann mit
r[i]=s[i]
kopierst du keine pointer sogar CStrings selbst.
-
und das ist mein problemm
ich moechte nur die pointer kopieren, da das viel schneller geht
aber leider weiss ich nicht wie
kannst du mir da bitte einen tipp geben????
-
du könntest z.b. ein dreifachpointer nehmen...
der erste stufe wäre dann ein zeiger auf ein array von CStringdoppelpointern...
von denen jeder wiederum auf ein array mit CString-pointern zeigt...
und diese CStringpointer lässt du dann auf einen einzelnen mit new allokierten CString zeigen... wenn du dann umsortierungen machst. bleiben die objecte der CString-klasse selber an ihrer position und du vertauscht nur die pointer...
allerdings würde ich mal stark vermuten das solche dinge (bezüglich performance) schon in den STL klassen berücksichtigt sind und gleich einen stl-container nehmen... auch hab ich bisher noch nix gefunden warum man einen CString nehmen sollte... der std::string ist mindestens genauso mächtig und man ist damit platformunabhängiger...denn standard sollte man nich einfach so aus jux verlassen sondern nur wenn man einen wirklich guten grund dafür hat...
-
mann, mann, mann.....das ist hart...nu bin ich verwirrt
wie CString is nix?????
wovon redest DU????was ist das: stl-container und std::string????
Ich habe Matrizen (ca 400*40) und diese befülle ich mit Strings unterschiedlicher Laenge. Genau deshalb habe ich mir mal eben eine dyn. Matrize angelegt.
Jetzt moechte ich die Strings in der matrize sortieren.
Dazu mache ich extrem oft einen Dreieckstausch ueber ein Hilfsarray.
Dabei geht einiges an Zeit verloren, da ich staendig die Strings selbst kopiere.
Das moechte ich gerne verbessern indem ich nur die Pointer auf die Inhalte austausche.Koenntest Du mir bitte ein wenig meinen Code umstellen???
Dann raff ich es wahrscheinlich.Ich schau derweil mal nach diesem Container und dem string....
Dann weiß ich vielleicht wovon Du redest.Vielen Dank!!!
CString **m_Matrix; for (i=0;i<m_AnzahlAuftraege;i++) { m_Matrix[i] = new CString[m_spalten]; } do // Sortierung nach gewähltem Suchkriterium ALT!!!!!!!!!!!!!!! { if ((m_Matrix[a][m_kritkomp]) >( m_Matrix[a+1][m_kritkomp])) { // Dreieckstausch nach gewähltem Suchkriterium for (int i=0;i<40;i++) { m_HilfsMatrix[0][i] = m_Matrix[a][i] ; m_Matrix[a][i] = m_Matrix[a+1][i] ; m_Matrix[a+1][i] = m_HilfsMatrix[0][i]; } a=0; } }while (!(a== (m_AnzahlAuftraege-2) && ((m_Matrix[a][m_kritkomp]) <= ( m_Matrix[a+1][m_kritkomp]))));
-
ich hab mir mal deine antwort noch ein wenig durch die ruebe gehen lassen...
habe es mir mal papiermaessig visualisiert
was muss ich den nun sortieren von den drei arrays???
-
also mal angenommen du hast irgendeine klasse.
von objecten dieser klasse willst du ein array anlegen dessen grösse du erst zur laufzeit kennst...deine variante war jetzt diese
CString * myCStringarray = new CString[100];
das teil hat wie gesagt den nachteil das du erstens beim umsortieren des arrays immer die objekte rumschieben musst und dann hat das noch den nachteil das du den krempel nur mit dem defaultkostruktor aufrufen kannst...
sowas wie new CString("tralala")[100] ist nicht möglich...
wenn du aber ein CString-pointerarray anlegst von dem jeder pointer auf ein object zeigst kannst du ersten jeden konstruktor aufrufen den du willst und zweitens musst du beim rumverschieben nur die pointer woanders hinzeigen lassen..
CString **myCStringarray = new CString*[100]; for(int i=0;i<100;++i)myCStringarray[i] = new CString("tralala"); //hier gehts wie gesat nicht nur mit dem defaultkonsturktor
den ganzen spass kannst du natürlich auch für ein 2darray machen musst dann wenn du es mit pointern machen willst halt nur mit nem 3fach-pointer anfangen...
zu der stl... ein blick darein lohnt sich immer find ich, weil die verschiedenen containerklassen einem doch ne menge arbeit abnehmen und es auch recht mächtige algorithmen dafür gibt, die man sich nicht erst selber schreiben muss.. (sowas wie sortieren ist das z.b. schon fertig)...
wie man allerdings abschätzt welche containerklasse den geringsten aufwand bezüglich eines konkreten problems bedeutet hab ich bis heute nicht rausbekommen da kommt man doch immer wieder auf erstaunliche ergebnisse was denn nun schneller gewesen wäre... am besten simuliert man das ganze immer und stoppt die zeit bevor man sich für einen bestimmten stl-container entscheidet( natürlich nur wenns überhaupt zeitkritisch ist, an sonsten bin ich immer faul und nehme einen std::vector)
-
puuuh viel holz!!1!
das schau ich mir mal in ruhe an und meld mich dann morgen vormittag nochmal
das hoert sich vielversprechend an.....brauche aber zeit
vielen dank fuer die tipps!
-
hi ich habs raus!!!!
habe einfach mal den code aus meinem embedded compiler in den normalen vc++6.0 kopiert und dort debugged
es werden definitiv die pointer kopiert und nicht die inhalte auf die die pointer zeigen!!!
danke fuer eure tipps!! (besonders windalf)
werde auch noch eben die anderen klassen checken...wenns da sortiermethoden gibt waere das schon klasse
noch eine nicht sooo wichtige kleinigkeitwindalf: ein 2darray nennt man matrize (matrix)
gruss
günni