Dynamisches Array zurückgeben.
-
Ich will ein int Array zurückgeben, dessen Länge erst zur Laufzeit bekannt ist (also mit new erstellen). Ich hab dann ihn als Zeiger Definiert (int *Positionen)
Jedoch wenn ich vom anderen Zeiger (z) einer int Variable etwas zuweisen will funktioniert das nicht (Zugriffsverweigerung)
void Suche_Positionen(AnsiString String,AnsiString Zeichen,int *Positionen) { //...... Positionen[j] = i; //...... } main() { //... int i; int *z; i = z[0] //.... }
-
Hallo,
Zugriffsverweigerung
Schöne Bezeichnung.

Dein z ist ja auch nicht gültig, da du keinen Speicher allokiert hast. Du hast doch new schon erwähnt, solltest also wissen wie das geht.
-
Hallo
oder besser gleich std::vector benutzen.
bis bald
akari
-
//j wird vorher ermittelt Positionen = new int[j-1]; //..... Suche_Positionen(.....,z); //der Aufruf.,und da das ein Zeiger ist (Positionen) bezieht er sich doch darauf.

-
Hallo
Zum einen war dieser Ausschnitt nicht schon im ersten Post zu sehen. Zum Andern sagt er auch nicht viel aus, zum Beispiel ob j zur Laufzeit wirklich größer 1 ist und ob der Inhalt von Positionen über z wirklich an Suche_Positionen gegeben wird. Daalso noch immer nicht der relevante und komplette Ablauf für uns zu sehen ist, können wir dazu nicht viel sagen, außer das du den Debugger benutzen sollst und/oder std::vector.
bis bald
akari
-
void __fastcall TForm1::Button1Click(TObject *Sender) { //Zum Testen int i; int *z; Suche_Positionen("12i456i890i","i",z); i=z[0]; } void Suche_Positionen(AnsiString String,AnsiString Zeichen,int *Positionen) { int i=0,j=0; while (true) { i = Suchen(String,Zeichen,i+1); if (i==0) break; j++; } Positionen = new int[j-1]; i=0;j=0; do { i = Suchen(String,Zeichen,i+1); Positionen[j] = i; j++; } while(i==0); }
-
Hallo
/Edit : Okay langsam wird klarer.
int *z; // z wird nie initialisert. Suche_Positionen("12i456i890i","i",z); i=z[0];Du müßtest schon Suche_Positionen mit der Adresse von z, und bei der Funktion selber mit einer Pointer auf Pointer arbeiten. Oder mit einer Referenz auf Pointer.
Das ganze Gefuddle kannst du dir aber sparen wenn du std::vector verwendest (Ja das ist schon der dritte Hinweis...)bis bald
akari
-
Wie lasse ich denn, den Zeiger (z) auf den bereich, der in der Funktion erstellt wurde, zeigen. Deswegen ist er nicht in der aufrufenden Funktion deklariert.
-
Hallo
grundsätzlich
void __fastcall TForm1::Button1Click(TObject *Sender) { //Zum Testen int i; int *z; Suche_Positionen("12i456i890i","i",z); i=z[0]; } void Suche_Positionen(AnsiString String,AnsiString Zeichen,int *&Positionen) // Referenz auf Pointer { ... Positionen = new int[j-1]; ... }Allerdings erstellst du durch das new ein Element zu wenig, und außerdem must du ja das Suchen zweimal machen.
Deshalb solltest du das ganze lieber so machen
#include <vector> // Am Anfang der Datei ... void __fastcall TForm1::Button1Click(TObject *Sender) { //Zum Testen int i; std::vector<int> z; Suche_Positionen("12i456i890i","i",z); if (!z.empty()) { i=z[0]; } } void Suche_Positionen(AnsiString String,AnsiString Zeichen,std::vector<int>& Positionen) { int i=0 while (i != 0) { i = Suchen(String,Zeichen,i+1); if (i!=0) Positionen.push_back(i); } }Desweiteren weiß ich ja nicht was die Funktion Suche() machen, aber hoffentlich etwas anders als AnsiString::Pos
bis bald
akari
-
Ja danke hab es hinbekommen
Von dieser Vektor Sache hatte ich noch nie was gehört.
Danke für die Hilfe.
-
Dann informier dich bitte darüber. vector ist Teil das C++Standards.
z.Bsp. hier im Magazin
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html