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 Zeigertyp
    

    Was 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 initialisieren
    

    Aha.

    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 Dimension
    

    So 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 initialisieren
    

    Aber 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?


  • Mod

    silent_max schrieb:

    { // ?Muss ich eingeben, wenn nicht mosert mein Compiler
    

    Dieses 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 initialisieren
    

    Aber 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 Element a[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.


  • Mod

    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.


Anmelden zum Antworten