Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C++] Pointer-Problem: illegal indirection (https://www.delphipraxis.net/102976-%5Bc-%5D-pointer-problem-illegal-indirection.html)

Matze 7. Nov 2007 19:23


[C++] Pointer-Problem: illegal indirection
 
Hallo zusammen,

mein C++-Compilier (VS2005 Prof.) meldet mir "illegal indirection" bei diesem Code:

Code:
void CKommunikation::StudentenInfo(void)
{
   CStudent *studentenliste;
   studentenliste = pa.StudentenlisteSenden();

   for (int i = 0; i < 8; i++)
   {
      cout << "Name: " << *studentenliste[i].NameSenden() << ", Matrikel-Nr.: " << *studentenliste[i].MatrikelNrSenden() << "\n";
   }
}
Das MSDN sagt dazu folgendes:

Zitat:

Compilerfehler C2100

Fehlermeldung
Zeigeroperation ungültig
illegal indirection

Der Dereferenzierungsoperator (* ) wurde mit einem Wert verwendet, der kein Zeiger ist.
Nur finde ich keinen Fehler.

StudentenlisteSenden sieht wie folgt aus:

Code:
CStudent * CPruefungsamt::StudentenlisteSenden()
{
   return arrStudenten;
}
und arrStudenten ist ein Array aus mehreren Instanzen der Klasse CStudent:

Code:
CStudent arrStudenten[8];
Was mache ich falsch?

Grüße

hoika 7. Nov 2007 19:34

Re: [C++] Pointer-Problem: illegal indirection
 
Hallo,

ich würde mal ein paar Variablen verwenden
und dann den Debugger nehmen.

Delphi-Quellcode:
void CKommunikation::StudentenInfo(void)
{
   arrayStudent *studentenliste;
   CStundent ???
   studentenliste = pa.StudentenlisteSenden();

   for (int i = 0; i < 8; i++)
   {
      CStudent = studentenliste[i];
      cout << "Name: " << CStudent.NameSenden() << ", Matrikel-Nr.: " << CStudent
.MatrikelNrSenden() << "\n";
   }
}

Heiko

Matze 7. Nov 2007 19:38

Re: [C++] Pointer-Problem: illegal indirection
 
Hallo Heiko!

Zitat:

Zitat von hoika
ich würde mal ein paar Variablen verwenden

Was meinst du damit?

Zitat:

Zitat von hoika
Code:
void CKommunikation::StudentenInfo(void)
{
   arrayStudent *studentenliste;
   CStundent ???
   // ...

Da die Studentenliste ein Array der Instanzen von CStudent ist, muss ich als "Datentyp" schon den Klassennamen CStudent angeben.

Grüße

Torpedo 7. Nov 2007 19:43

Re: [C++] Pointer-Problem: illegal indirection
 
*studentenliste[i].NameSenden()
Wenn das ein Array ist kannst du den * wahrscheinlich weglassen, da Arrays Pointer sind.

Khabarakh 7. Nov 2007 19:45

Re: [C++] Pointer-Problem: illegal indirection
 
Der bislang völlig von C++ Verschonte wagt eine Antwort, mal sehen, was daraus wird :stupid: . Jedenfalls dürfte in C++ wie in C#[*] gelten, dass "*" als unärer Operator einen niedrigeren Rang als "." als primärer Operator einnimmt. Solange du also nicht den Rückgabewert der Methode dereferenzieren willst, musst du klammern oder "->" verwenden.
Zitat:

postfix-expression . name
postfix-expression –> name


Remarks
The member access operators . and -> are used to refer to members of structures, unions, and classes. Member access expressions have the value and type of the selected member.

There are two forms of member access expressions:

In the first form, postfix-expression represents a value of struct, class, or union type, and name names a member of the specified structure, union, or class. The value of the operation is that of name and is an l-value if postfix-expression is an l-value.

In the second form, postfix-expression represents a pointer to a structure, union, or class, and name names a member of the specified structure, union, or class. The value is that of name and is an l-value. The –> operator dereferences the pointer. Therefore, the expressions e–>member and (*e).member (where e represents a pointer) yield identical results (except when the operators –> or * are overloaded).
[*] Bitte daraus nicht schließen, dass man in c# solche Ungeheuer öfter als zweimal pro Dekade bräuchte ^^ .

PS: Dass der Compiler den nicht-passenden Typen überhaupt nicht beim Namen nennen, könnte man ja fast als blanken Hohn ansehen... aber mit seinen knapp 30 Jahren kann man das der Sprache wohl noch verzeihen ;) .

[edit]
@Torpedo: So wie ich mein Zitat verstanden habe, kann der .-Operator nur nach dem Dereferenzieren der Klasse benutzt werden - sonst wäre sein "->"-Kumpane ja völlig witzlos.
[/edit]

Matze 7. Nov 2007 19:47

Re: [C++] Pointer-Problem: illegal indirection
 
Hallo

Zitat:

Zitat von Torpedo
Wenn das ein Array ist kannst du den * wahrscheinlich weglassen, da Arrays Pointer sind.

Da ich aber auf den Inhalt des Arrays zugreifen möchte, brauche ich doch diesen Inhaltsoperator (oder wie sich der nennt). Oder nicht?

Lasse ich das weg, erhalte ich diese Fehler:

Zitat:

Error 1 error LNK2001: unresolved external symbol "public: int __thiscall CPruefung::NummerSenden(void)" (?NummerSenden@CPruefung@@QAEHXZ) CKommunikation.obj
Error 2 fatal error LNK1120: 1 unresolved externals D:\Eigene Dateien\...\Projekt_1.exe 1
Ob sie allerdings damit zusammenhängen, weiß ich nicht, denke aber schon. :?

Edit: @Sebastian: Danke, doch damit geht's irgendwie auch nicht. Frustrationshalber habe ich alle Kombinationan ausprobiert: Mit * und ->, ohne Stern und -> etc. *g* Aber alles hilft nicht.

Torpedo 7. Nov 2007 19:48

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von Matze
Da ich aber auf den Inhalt des Arrays zugreifen möchte, brauche ich doch diesen Inhaltsoperator (oder wie sich der nennt). Oder nicht?

Auf den Inhalt greifst du dann doch mit dem []-Operator zu ;)
Vielleicht hat auch Khabarakh recht, probiers mal aus.

EDIT:
So wie ich das verstehe greifst du mit dem zusätzlichen * auf das 1. Element im Array zu. Da dieses Element aber kein Array ist, kann dann nicht mit [i] auf dessen Elemente zugegriffen werden. Ich weiß aber nicht ob * oder [] einen höheren Stellenwert hat, also kann auch umgekehrt sein.

Khabarakh 7. Nov 2007 20:01

Re: [C++] Pointer-Problem: illegal indirection
 
Zitat:

Zitat von Torpedo
Ich weiß aber nicht ob * oder [] einen höheren Stellenwert hat, also kann auch umgekehrt sein.

[] ist ebenfalls primär.
Wir wollen also folgende Reihenfolge erreichen:
  1. Array indexieren (ja, das Wort gibt's laut LEO wirklich :mrgreen: ) per [] primär
  2. Zeiger auf Klasse dereferenzieren per * unär
  3. Memberzugriff per . primär
=> Entweder Klammer um 2. oder 2.+3. durch "->" zusammenfassen.

Matze 7. Nov 2007 20:14

Re: [C++] Pointer-Problem: illegal indirection
 
Moin,

danke für die Mühe, aber irgendwie bin ich zu blöd dafür. *g*

Ich habe ja den Pointer aufs 1. Arrayelement. Damit ich direkt das Array nutzen kann, muss ich das doch dereferenzieren mittels * und dann müsste ich's doch normal nutzen können. Daher hätte ich es der Überlegung nach so gemacht:

Code:
(*studentenliste)[i].NameSenden()
Aber das geht auch nicht. Wo sollen deiner Meinung nach denn die Klammern hin?

Torpedo 7. Nov 2007 20:14

Re: [C++] Pointer-Problem: illegal indirection
 
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
cout << "Name: " << studentenliste[i].NameSenden() << ", Matrikel-Nr.: " << studentenliste[i].MatrikelNrSenden() << "\n";
Bei mir funktionierts so.

Habe es mal kurz nachprogrammiert (Achtung, Klassen abgeändert)
Im Anhang habe ich den Quellcode. Getestet mit g++.

Ausgabe:
Zitat:

Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234
Name: Max Mustermann, Matrikel-Nr.: 1234


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz