Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » zeiger/referenz auf mehrdimensionale arrays

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
23.08.2003, 04:19 Uhr
~karlnapf
Gast


hallo
ich habe ne frage
ich habe ein array der form m_iArray[7][7]
jetzt möchte ich eine funktion haben die einen zeiger (oder eine referenz) auf das array zurückliefert

const int* get_array (void)
{
return m_iArray;
}
diese methode liefert mri beim kompillieren folgendes:
error: cannot convert 'int(*)[7]' to 'const int*'

laut meinem buch ist aber m_iArray ein zeiger auf das ganze array
bin noch recht neu in dem thema deswegen kanns sein dass die frage blöd ist aber freu mich trotzdem über eine antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.08.2003, 08:26 Uhr
Tommix



Hallo,
die Frage ist keineswegs blöd. Blöd ist, wer nicht fragt.

C++:
const int* get_array (void)
{
    return m_iArray[0];
}


kompiliert erst mal. Aber warum Deine Variante nicht geht, ist mir auch nicht ganz klar. Ich hoffe mal einer der Spezies hier im Forum erklärt uns das.

Gruss, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.08.2003, 10:39 Uhr
0xdeadbeef
Gott
(Operator)


Hm. Ist m_iArray wirklich als

C++:
int m_iArray[7][7];


oder als

C++:
int **m_iArray;


deklariert?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.08.2003, 10:42 Uhr
virtual
Sexiest Bit alive
(Operator)


Klar ist m_iArray ein Zeiger auf das ganze Array. Im allgemeinen kann man den namen des Arrays als dessen Zeiger verwenden. Wenn Ich also ein

C++:
int array[7];


habe dann ist array ein Zeiger auf ein int.
Oder allgemeiner:
Ist

C++:
type array[];


gegeben, dann kann man array in den meisten Fällen wie ein type* verwenden.

Bei dem 2D Array sieht es so aus:

C++:
int array[7][7];


Also ist array eigentlich ein Array von 7 eindimensionalen Arrays (welches auch jeweils 7 Elemente beinhalten). Expliziter geschrieben also:

C++:
typedef int ein_dimenisionales_array[7];
ein_dimensionales_array array[7];


Folglich kann array meistens wie ein Zeiger auf den Typen ein_dimensionales_array verwendet werden, oder kurz auf ein int (*)[7].
Nun sind aber "int*" und "int*[7]" unterschiedliche Typen und genau das bemängelt Dein (C++) Compiler.
Ich möchte jetzt nicht im Detail auf den Unterschied zwischen Array Namen und Zeiger eingehen (zB folgt aus obigen überlegungen nicht, daß m_iArray zuweisungkompatibel mit einem int** ist), allerdings verhält es sich so, daß bei einem

C++:
int array[7][7]


Die Daten tatsächlich hintereinander im Speicher gehalten werden, so daß sie kompatibel mit einem int* sind. In C, was im unterschied zu C++ etwas weniger genau arbeitet, was die Typsicherheit angeht, ist dies dann sogar keine Fehlermeldung, sondern nur eine Warnung. Um die fehlermeldung wegzubekommen, mußt Du in C++ casten, etwa so:

C++:
return reinterpret_cast<int*>(m_iArray);



Beachte: der rinterpret_cast schmälert generell die Portabilität Deines Programms!
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 23.08.2003 um 10:44 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: