Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
Zeiger auf Zeiger von einer Funktion zurückgeben

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Programmieren - C
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Peter
Gast





BeitragVerfasst am: 06. Jun 2001 23:10   Titel: Zeiger auf Zeiger von einer Funktion zurückgeben

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[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
Gast





BeitragVerfasst am: 06. Jun 2001 23:29   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

Ich habe mich an einer Stelle vertippt:

statt
char (*tst)[8] = new char[8];
sollte da
char (*tst)[8] = new char[8];
stehen.

Suche immernoch nach Lösungen
 

Peter
Gast





BeitragVerfasst am: 07. Jun 2001 2:22   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

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
 

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 07. Jun 2001 10:25   Titel: Re: Zeiger auf Zeiger von einer Funktion

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 [8] also illegal ist.

Und wer sichergehen will, daß ein [ als [ erscheint, schreibt \[, 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?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

Peter
Gast





BeitragVerfasst am: 07. Jun 2001 16:56   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

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

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

Der Kompiler liefert nun:
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

Also immernoch der selbe Fehler ;-(
 

Peter
Gast





BeitragVerfasst am: 07. Jun 2001 23:44   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

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



Anmeldungsdatum: 09.04.2001
Beiträge: 1354

BeitragVerfasst am: 08. Jun 2001 21:57   Titel: Re: Zeiger auf Zeiger von einer Funktion zurück

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[x,y]

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 , aber so könnte es gehen:

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

tst = new char[8];
rev = &tst;
...
return rev;
}
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

Peter
Gast





BeitragVerfasst am: 08. Jun 2001 23:29   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

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 [3][8], und nicht nur [8] !

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



Anmeldungsdatum: 09.04.2001
Beiträge: 1354

BeitragVerfasst am: 09. Jun 2001 9:18   Titel: Re: Zeiger auf Zeiger von einer Funktion

@Peter:

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


char** readkinfo();
...
char** readkinfo()
{
...
char (*tst)[8] = new char[3][8];
...
return (char**)tst;
}
main()
{
...
char (*bbb)[8];
(char **)bbb = readkinfo();
...
}


Zuletzt bearbeitet von gewitter am 09. Jun 2001 9:18, insgesamt 1-mal bearbeitet
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

hjb
Pro-Linux


Anmeldungsdatum: 15.08.1999
Beiträge: 3236
Wohnort: Bruchsal

BeitragVerfasst am: 09. Jun 2001 10:20   Titel: Re: Zeiger auf Zeiger von einer Funktion

Hi,

ich würde Zeile 28/29 so umschreiben:

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

und den Typ mytype am Anfang definieren:
typedef char * mytype[8];

Der Grund für den typedef ist, daß ein typecast auf (char *[8]) 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?
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger

Peter
Gast





BeitragVerfasst am: 09. Jun 2001 12:31   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

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

Jetzt kann ich endlich weiterbasteln an meinem Projekt.

cu pwk.linuxfan
 

Peter
Gast





BeitragVerfasst am: 10. Jun 2001 19:14   Titel: Visual C++ packt es nicht !!

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
Gast





BeitragVerfasst am: 11. Jun 2001 17:23   Titel: Zeiger auf Zeiger von einer Funktion zurückgeb

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 "[" 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



Anmeldungsdatum: 09.04.2001
Beiträge: 1354

BeitragVerfasst am: 14. Jun 2001 20:33   Titel: Re: Zeiger auf Zeiger von einer Funktion zurückgeben

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.
 
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Programmieren - C Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy