Pointer auf mehrdimensionales Array - gelöst
-
Hallo liebe Gemeinde.
Ich wollte einen Pointer auf ein mehrdimensionales Array zeigen lassen.
Folgenden Programmcode habe ich aufgesetzt:
#include <iostream> using namespace std; int main() { #define Anzahl_1 5 #define Anzahl_2 5 double Zahlen[Anzahl_1][Anzahl_2]; double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]}; double a; cout << "Geben Sie 25 Werte ein!\n"; for(int i=0; i<Anzahl_1; i++) for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]:"; cin >> a; } cout << "Diese Werte haben Sie eingegeben:\n"; for(int i=0; i<Anzahl_1; i++) for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]:" << Zahlen[i][j]; } cout << "Diese Speicheradressen sind verwendet worden:\n"; for(int i=0; i<Anzahl_1; i++) for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]" << &pZahlen[i][j]; } return 0; }Jedoch bekomme ich bezogen auf Zeile 34 folgende Fehlermeldung:
error C2109: Index erfordert ein Array oder einen ZeigertypWas muss ich beim Code ändern, damit die Fehlermeldung nicht mehr auftritt?
Danke für die Antworten im Voraus.
Gruß
Max
-
Das kann ja heiter werden

-
Watt schrieb:
Das kann ja heiter werden

Was meinst Du damit?
-
silent_max schrieb:
#define Anzahl_1 5 #define Anzahl_2 5 double Zahlen[Anzahl_1][Anzahl_2]; double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]};Erklär mal bitte ganz detailliert, was in deinem Kopf vorgeht, wenn du so etwas schreibst. Versuch mal zu begründen, warum und wieso du es so geschrieben hast, wie du es geschrieben hast, was du meinst, was Zahlen und pZahlen genau ist und was der Code bewirkt. Das sind unangenehme Fragen, ich weiß. Aber deine Defizite sind scheinbar so groß, dass unsereins erst mal lernen muss, wie man dir etwas beibringen kann. Und das geht bestimmt einfacher, wenn unsereins weiß, wie du tickst, also, was für falsche bzw fehlende Vorstellungen du von der C/C++ Welt hast.
-
esperanto schrieb:
C/C++ Welt
Das ist hier wirklich treffend.
-
#include <iostream> using namespace std; int main() { #define Anzahl_1 5 //5 als Konstante definieren für die erste Dimension #define Anzahl_2 5 //5 als Konstante definieren für die zweite Dimension double Zahlen[Anzahl_1][Anzahl_2]; //Array mit 2 Dimensionen erzeugen double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]};//Pointer auf den zweidimensionalen Array deklarieren und gleichzeitig initialisieren double a; //Variable erzeugen cout << "Geben Sie 25 Werte ein!\n";//Selbsterklärend for(int i=0; i<Anzahl_1; i++) //Schleife für die erste Dimension erzeugen for(int j=0; j<Anzahl_2; j++) //Schleife für die zweite Dimension erzeugen { cout << "Zahl[" << i << "][" << j << "]:"; //Das z.B. "Zahl[2][4]:" in der Textausgabe steht cin >> a; //Möglichkeit für die Eingabe der 25 Zahlen bzw. Werte } cout << "Diese Werte haben Sie eingegeben:\n";//Selbsterklärend for(int i=0; i<Anzahl_1; i++)//siehe oben for(int j=0; j<Anzahl_2; j++)// siehe oben { cout << "Zahl[" << i << "][" << j << "]:" << Zahlen[i][j]; //Ausgabe der 25 eingegebenen Werte } cout << "Diese Speicheradressen sind verwendet worden:\n";//selbsterklärend for(int i=0; i<Anzahl_1; i++)//siehe oben for(int j=0; j<Anzahl_2; j++)//siehe oben { cout << "Zahl[" << i << "][" << j << "]" << &pZahlen[i][j];// Ausgabe der Speicheradressen für die 25 eingegebenen Werten } return 0; }Siehe Kommentare
Gruß
Max
-
double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]};//Pointer auf den zweidimensionalen Array deklarieren und gleichzeitig initialisierenAha.
Jetzt nimm das mal auseinander und kommentiere jede Zeile hiervon
double * pZahlen // ? = { // ? &Zahlen[Anzahl_1][Anzahl_2] // ? };
-
silent_max schrieb:
Hallo liebe Gemeinde.
#include <iostream> using namespace std; int main() { #define Anzahl_1 5 //Hier sollte man const $DATENTYP $BEZEICHNER verwenden #define Anzahl_2 5 double Zahlen[Anzahl_1][Anzahl_2]; double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]}; //Für das was du machen willst ist eigentlich gar kein Zeiger notwendig double a; cout << "Geben Sie 25 Werte ein!\n"; for(int i=0; i<Anzahl_1; i++) //anstatt int sollte man auto oder size_t nutzen for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]:"; cin >> a; //Was passiert hier? Wie kommt a ins Array? Das passiert hier jedenfalls nicht } cout << "Diese Werte haben Sie eingegeben:\n"; //Werte können nicht ausgegeben werden, da sie nirgends gespeichert sind. for(int i=0; i<Anzahl_1; i++) for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]:" << Zahlen[i][j]; } cout << "Diese Speicheradressen sind verwendet worden:\n"; for(int i=0; i<Anzahl_1; i++) for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]" << &pZahlen[i][j]; //Du brauchst hier keinen extra Zeiger. Der Adressoperator & reicht doch völlig aus. } return 0; }Max
-
double * pZahlen // ?Pointer vom Typ double deklariern = { // ?Muss ich eingeben, wenn nicht mosert mein Compiler &Zahlen[Anzahl_1][Anzahl_2] // ? Adressen der jeweiligen Zahlen/Werte von z.Bsp. Zahl[4][1] };
-
silent_max schrieb:
#define Anzahl_1 5 //5 als Konstante definieren für die erste Dimension #define Anzahl_2 5 //5 als Konstante definieren für die zweite DimensionSo etwas ist in C bestimmt üblich. In C++ eher nicht. Makros sind aus Google-baren Gründen eher blöd. in C++ kannst du einfach schreiben
const int anzahl1 = 5; const int anzahl2 = 5;und das sind dann auch "Compile-Zeit-Konstanten", die man für die Größe eines Arrays verwenden kann.
silent_max schrieb:
double Zahlen[Anzahl_1][Anzahl_2]; //Array mit 2 Dimensionen erzeugen double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]};//Pointer auf den zweidimensionalen Array deklarieren und gleichzeitig initialisierenAber pZahl ist doch vom Typ
double*, also nur ein Zeiger auf double. Und womit genau initialisierst du pZahl? Was ist das für eine Adresse? Worauf bezieht sie sich?silent_max schrieb:
double a; //Variable erzeugen cout << "Geben Sie 25 Werte ein!\n";//Selbsterklärend for(int i=0; i<Anzahl_1; i++) //Schleife für die erste Dimension erzeugen for(int j=0; j<Anzahl_2; j++) //Schleife für die zweite Dimension erzeugen { cout << "Zahl[" << i << "][" << j << "]:"; //Das z.B. "Zahl[2][4]:" in der Textausgabe steht cin >> a; //Möglichkeit für die Eingabe der 25 Zahlen bzw. Werte }Hier hast du etwas vergessen. Du kommst bestimmt selbst drauf. Und wenn nicht, spiel das mal mit einem Debugger durch, wenn du das Problem mit pZahl beseitigt hast.
silent_max schrieb:
cout << "Diese Speicheradressen sind verwendet worden:\n";//selbsterklärend for(int i=0; i<Anzahl_1; i++)//siehe oben for(int j=0; j<Anzahl_2; j++)//siehe oben { cout << "Zahl[" << i << "][" << j << "]" << &pZahlen[i][j];// Ausgabe der Speicheradressen für die 25 eingegebenen Werten }&pZahlen[i][j] wird wie folgt implizit geklammert: &((pZahlen[i])[j])
pZahlen ist ja ein Zeiger auf double
Was ist dann der Typ des Ausdrucks pZahlen[i]?
Was ist dann der Typ des Ausdrucks pZahlen[i][j]?
Und worauf bezieht sich die Adresse, wenn du noch den Adressoperator davor hängst?
-
silent_max schrieb:
{ // ?Muss ich eingeben, wenn nicht mosert mein CompilerDieses Zitat bringt wunderbar zum Ausdruck, was bei dir falsch läuft und wieso deine Programme nie funktionieren und nie funktionieren werden.
c.rackwitz schrieb:
Wenn du selber Code schreibst, musst du ihn auch verstehen. Code ist kein Haufen von wahllos zusammengeschmissenen Buchstaben und Zeichen, Code ist Logik pur. Du musst genau wissen, warum du wo und welches Zeichen setzt.
-
silent_max schrieb:
double * pZahlen // Pointer vom Typ double deklariern = { // Muss ich eingeben, wenn nicht mosert mein Compiler &Zahlen[Anzahl_1][Anzahl_2] // Adressen der jeweiligen Zahlen/Werte von z.Bsp. Zahl[4][1] };Adressen? Mehrzahl? Warum das denn?
Bitte pflück mal den Ausdruck auseinander: &Zahlen[Anzahl_1][Anzahl_2]
Das ist äquivalent zu folgender Klammerung &((Zahlen[Anzahl_1])[Anzahl_2])
Und jetzt arbeite Dich bitte von innen nach außen. Sage, mit was für Typen du auf jeder Stufe zu tun hast und was für ein Wert rauskommt bzw worauf er sich bezieht.
-
@silent_max
Ist dir aufgefallen das schon wieder deine Initialisierung vom Pointer angemeckert wurde.
Genau so wie bei den letzten Threads von dir.
Auch aus dem gleichen Grund.Willst du nicht mal darüber nachdenken was du schreibst.
Die anderen hier wollten wissen, warum du in der Zeile 9
double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]};- das & benutzt
- die [] nimmst
- warum da Anzahl_1 und Anzahl_2 stehen.
Beantworte das mal.
Dein "//Pointer auf den zweidimensionalen Array deklarieren und gleichzeitig initialisieren" kann sich hier jeder denken.
Wir wollen nur wissen, warum du das so machen möchtest und mal darüber nachdenkst.
-
silent_max schrieb:
double Zahlen[Anzahl_1][Anzahl_2]; //Array mit 2 Dimensionen erzeugen double *pZahlen = {&Zahlen[Anzahl_1][Anzahl_2]};//Pointer auf den zweidimensionalen Array deklarieren und gleichzeitig initialisierenAber pZahl ist doch vom Typ
double*, also nur ein Zeiger auf double. Und womit genau initialisierst du pZahl? Was ist das für eine Adresse? Worauf bezieht sie sich?[/quote]Was meinst Du jetzt mit pZahl?
silent_max schrieb:
double a; //Variable erzeugen cout << "Geben Sie 25 Werte ein!\n";//Selbsterklärend for(int i=0; i<Anzahl_1; i++) //Schleife für die erste Dimension erzeugen for(int j=0; j<Anzahl_2; j++) //Schleife für die zweite Dimension erzeugen { cout << "Zahl[" << i << "][" << j << "]:"; //Das z.B. "Zahl[2][4]:" in der Textausgabe steht cin >> a; //Möglichkeit für die Eingabe der 25 Zahlen bzw. Werte }Hier hast du etwas vergessen. Du kommst bestimmt selbst drauf. Und wenn nicht, spiel das mal mit einem Debugger durch, wenn du das Problem mit pZahl beseitigt hast.
Ich komme selbst mit´m Debugger darauf, was Du meinst....
silent_max schrieb:
cout << "Diese Speicheradressen sind verwendet worden:\n";//selbsterklärend for(int i=0; i<Anzahl_1; i++)//siehe oben for(int j=0; j<Anzahl_2; j++)//siehe oben { cout << "Zahl[" << i << "][" << j << "]" << &pZahlen[i][j];// Ausgabe der Speicheradressen für die 25 eingegebenen Werten }&pZahlen[i][j] wird wie folgt implizit geklammert: &((pZahlen[i])[j])
[/quote]Wenn ich das mache dann kommt bei mir die Meldung "Der Ausdruck muss den Typ
"pointer-to-object" aufweisen.pZahlen ist ja ein Zeiger auf double
Was ist dann der Typ des Ausdrucks pZahlen[i]?
Was ist dann der Typ des Ausdrucks pZahlen[i][j]?
Und worauf bezieht sich die Adresse, wenn du noch den Adressoperator davor hängst?
So wie ich Dich jetzt verstehe, muss ich drei Pointer deklarieren?
*pZahlen[i]
*pZahlen[j]
*pZahlen[i][j]
-
DirkB schrieb:
- das & benutzt //Wenn ich einen Pointer auf eine eine Zahl setze, dann muss ich doch z.B.*pa = &a schreiben?????? - die [] nimmst //Dachte, dass man bei mehrdimensionalen Arrays eben für eine Ebene eben die eckigen Klammern verwendet - warum da Anzahl_1 und Anzahl_2 stehen.// Sind eben Platzhalter für die als Konstante deklarierte 5
-
Wenn du ein Array definierst mit
int a[5][5];, existiert dann ein Elementa[5][5]?int a[5][5]; ... a[5][5] = 12; // ist das erlaubt?
-
silent_max ist ein
TROLL
Bitte schließen
-
for(int i=0; i<Anzahl_1; i++) for(int j=0; j<Anzahl_2; j++) { cout << "Zahl[" << i << "][" << j << "]:"; cin >> a; }Den gleichen Unsinn, für eine angebliche Eingabe in Arrays, hat er schon im anderen Thread veranstaltet.
Und ist dabei jeder Nachfrage geschickt aus dem Weg gegangen.Mods, please, das ist ein verdammter Troll. Merkt ihr das nicht?
-
Erst wenn der Faden hier auch 20 Seiten hat.
-
weltuntergang schrieb:
Mods, please, das ist ein verdammter Troll.
Dann antworte doch einfach nicht! Das ist wesentlich einfacher.
Ich persönlich (und ich wette auch viele andere) finde die silent_max-Threads viel zu gute Unterhaltung, als dass ich sie schließen möchte. Es schadet schließlich auch niemandem direkt. Es ist schade um einige kompetente Leute, die hier ihre Zeit mit Antworten verschwenden, aber ich glaube die haben sowieso genug Zeit und selber Spaß an der Sache.