Zeiger auf Zeiger von einer Funktion zurückgeben

Post Reply
Message
Author
Peter

Zeiger auf Zeiger von einer Funktion zurückgeben

#1 Post by Peter »

Hallo,

wie sieht der Funktionsprototyp einer Funktion aus, die einen 2 Dimensionalen Array zurückgibt ?

Bisher habe ich:

char** readkinfo();
...
char** readkinfo()
{
...
char (*tst)[8] = new char<font size="3">[8];
...
return tst;
}
main()
{
...
char (*bbb)[8]; //Zeile 28
bbb = readkinfo(); //Zeile 29
...
}

Bei der Kompilation kriege ich:
mki.cpp: In function `int main()':
mki.cpp:29: assignment to `char (*)[8]' from `char **'
mki.cpp:28: warning: `char (* tst)[8]' might be used uninitialized in this function

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#2 Post by Peter »

Ich habe mich an einer Stelle vertippt:

statt
char (*tst)[8] = new char[8];
sollte da
char (*tst)[8] = new char[<font size="3">8];
stehen.

Suche immernoch nach Lösungen

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#3 Post by Peter »

Ich habe mich dochnicht vertippt, denn das Newsystem scheint meine Klammern nicht zu mögen also:
statt:
char (*tst)[8] = new char[8];
sollte da stehen
char (*tst)[8] = new char(Eckigeauf)3(Eckigezu)[8];

Hoffentlich kann das Newssystem das jetzt.

cu

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Zeiger auf Zeiger von einer Funktion

#4 Post by hjb »

Hi,

du mußt natürlich char** tst = ... schreiben. Sonst würdest du dem 9. Element eines Arrays ein zweidimensionales Array zuweisen, wo nur ein eindimensionales erwartet wird. Mal ganz abgesehen davon, daß das Array nur 8 Elemente hat, der Zugriff auf [<!--no-->8<!--no-->] also illegal ist.

Und wer sichergehen will, daß ein [<!--no--> als [<!--no--> erscheint, schreibt \<!--no-->[<!--no-->, sonst läuft er Gefahr, daß das Board das als Code interpretiert. Siehe Hilfe zum Board.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#5 Post by Peter »

Hmm,
hjb ich habe mal deinen Vorschlag getestet, also sieht mein Programm jetzt so aus:

char** readkinfo();
...
char** readkinfo()
{
...
char **tst = new char[<!--no-->3<!--no-->][<!--no-->8<!--no-->];
...
return tst;
}
main()
{
...
char (*bbb)[<!--no-->8<!--no-->]; //Zeile 28
bbb = readkinfo(); //Zeile 29
...
}

Der Kompiler liefert nun:
mki.cpp: In function `int main()':
mki.cpp:29: assignment to `char (*)[<!--no-->8<!--no-->]' from `char **'
mki.cpp:28: warning: `char (* tst)[<!--no-->8<!--no-->]' might be used uninitialized in this function

Also immernoch der selbe Fehler ;-(

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#6 Post by Peter »

Ich vermute das Problem liegt darin, dass man normalerweise die eine Dimension eines Übergebenen Arrays angeben _muss_ (z.B. wenn man einen 2 Dimensionalen Array an eine Funktion übergibt). Bei der Funktion sollte alse meiner Meinung nach etwas anderes als "char** readkinfo()" stehen. Ich vermute etwas wie "char*[8] readkinfo()", aber das geht leider nicht so.

Bitte helft mir !! Warte noch.

gewitter
Posts: 1354
Joined: 09. Apr 2001 9:03

Re: Zeiger auf Zeiger von einer Funktion zurück

#7 Post by gewitter »

Zweidimensional wird das Array nur durch die logische Unterteilung einer im Speicher zusammenhängenden Gruppe von Char: Daher liegt das Ergebnis näher als bisher geprobt:

char *zeiger = &array[<!--no-->x,y<!--no-->]

wenn ein bestimmter offset in einem array gebraucht wird, bzw.

return &array

ansonsten kann ein zeiger kein array sein und es ist kein zeiger-array <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle"> , aber so könnte es gehen:

char** readkinfo();
...
char** readkinfo()
{
...
char *tst, **ref;

tst = new char[8];
rev = &tst;
...
return rev;
}

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#8 Post by Peter »

Entweder ich verstehe deinen Ansatz überhauptnicht, oder du hast mein Problem nicht ganz verstanden. Die Dritte lösung ist: Du bist in die Eckigeklammer Falle des Boards getappt ! Ich nehme mal an du meinst in deinem Code [<!--no-->3<!--no-->][<!--no-->8<!--no-->], und nicht nur [<!--no-->8<!--no-->] !

Trotzdem funktioniert dein Code nicht, selber Fehler. Der Fehler kommt ja auch dazu zustande, wenn ich ihn richtig verstehe, dass ich einen doppelten Zeiger (**) einem 2 Dimensionalen Array zuweisen will, der halt die eine Dimension fest hat. Der Rotstift ist also entweder bei dem Funktionsprototypen oder in der main() Funktion anzusetzen.

Als alternatve könnte ich den Array einfach in eine Structur kapseln, aber ich will diese Notlösung eingenlich nicht begehen.

Ich hoffe jemand weiß Rat !


PS:
Da der Fehler warscheinlich leichter am eigenen PC zu finden ist, kann ich einem Interessenten gerne den ganzen Code schicken (5-6 Seiten Code), damit er gleich testen kann ob der Fehler auch weg ist. Meine E-Mail Add ist: pwk.linuxfan@gmx.de schreib mir einfach dass du gerne mal den mki code hättest.

gewitter
Posts: 1354
Joined: 09. Apr 2001 9:03

Re: Zeiger auf Zeiger von einer Funktion

#9 Post by gewitter »

@Peter:

Aha, jetzt kommen wir der Sache schon näher:


char** readkinfo();
...
char** readkinfo()
{
...
char (*tst)[<!--no-->8<!--no-->] = new char[<!--no-->3<!--no-->][<!--no-->8<!--no-->];
...
return (char**)tst;
}
main()
{
...
char (*bbb)[<!--no-->8<!--no-->];
(char **)bbb = readkinfo();
...
}
Last edited by gewitter on 09. Jun 2001 9:18, edited 1 time in total.

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Zeiger auf Zeiger von einer Funktion

#10 Post by hjb »

Hi,

ich würde Zeile 28/29 so umschreiben:

mytype bbb;
bbb = (mytype) readkinfo();

und den Typ mytype am Anfang definieren:
typedef char * mytype[<!--no-->8<!--no-->];

Der Grund für den typedef ist, daß ein typecast auf (char *[<!--no-->8<!--no-->]) nicht funktioniert. Den Typecast brauchen wir, um den Rückgabewert der Funktion von char** auf unseren Typ zu casten. Die beiden Typen sind eigentlich gleichwertig, da C sowieso keine Arraygrenzen prüft. Es ist also eher eine Macke des Compilers oder der Sprachdefinition, die den typecast nötig macht.

Die Lösung von Thomas könnte auch gehen, aber bei Typecasts auf der linken Seite von Zuweisungen bin ich immer skeptisch.

Ich habe es auch nicht ausprobiert, Irrtümer sind also nicht ganz ausgeschlossen.

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#11 Post by Peter »

Danke,
die Lösung von Thomas hat das Problem gelöst !!!

Jetzt kann ich endlich weiterbasteln an meinem Projekt.

cu pwk.linuxfan

Peter

Visual C++ packt es nicht !!

#12 Post by Peter »

Hmmm,

zufrüh gefreut. Das Problem ist nicht gelöst, ich kann zwar jetzt den Code ohne Probleme übersetzten, und auch ausführen, jedoch bin ich drauf angewiesen, dass mein Programm auch unter Windoof läuft, Visual C++ meint zu Thomas's Lösung, die unter Linux mit gcc ohne Probleme läuft, dass auf der linken Seite der Zuweisung kien L-Wert steht, was auch immer ein L-Wert ist. hjb, den Vorschlag funktioniert noch nicht einmal unter Linux, immernoch die alte Fehlermeldung.

Ich sehe momentan folgende Lösungsmöglichkeiten für mein Problem (ich habe sie nach Optimalität sortiert)
1. Ihr erklärt mir wie man unter Linux (am Besten mit gcc bzw g++) *.exe Dateien aus C++ Code erzeugt.
2. Einer von euch weiß eine bessere (oder andere) Art das Problem zu lösen
3. Ich probiere den 2D Array in eine struct einzupacken, und übergebe einen Zeiger darauf.

Vielen Dank für die Lösungen die da waren, und die die (hoffentlich) kommen werden

Peter

Zeiger auf Zeiger von einer Funktion zurückgeb

#13 Post by Peter »

HJB,

ich habe deine Lösung nocheimal genau betrachtet, denn die von Thomas funzt ja nicht mit dem sch*** Visual C++, ich habe deinen Fehler entdeckt, klein aber folgeschwer. Bei der Definition von mytype:
typedef char * mytype[8];

sollter folgendes stehen:
typedef char (*mytype)[8];
da der "[<!--no-->" Operator eine höhere priorität hat als der "*" Operator

ich bastel jetzt mein Programm nach deiner Lösung, mal schauen ob das unter windoof compiliert :^}

gewitter
Posts: 1354
Joined: 09. Apr 2001 9:03

Re: Zeiger auf Zeiger von einer Funktion zurückgeben

#14 Post by gewitter »

Sicherlich bringt nur die Definition eines eigenen Typs eine brauchbare Lösung, wenn das Programm dann auch noch portiert werden soll. Aber vielleicht gibts ja bei Visual C++ noch einen Kompiler-Schalter, damit der nicht so strikt überprüft. Habe erst gerade Visual C++ auf dem W2K-Klient installiert und noch nicht ausgetestet.

Post Reply