AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [C++] Pointer-Problem: illegal indirection
Thema durchsuchen
Ansicht
Themen-Optionen

[C++] Pointer-Problem: illegal indirection

Ein Thema von Matze · begonnen am 7. Nov 2007 · letzter Beitrag vom 7. Nov 2007
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#1

[C++] Pointer-Problem: illegal indirection

  Alt 7. Nov 2007, 20:23
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 7. Nov 2007, 20:34
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#3

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

  Alt 7. Nov 2007, 20:38
Hallo Heiko!

Zitat von hoika:
ich würde mal ein paar Variablen verwenden
Was meinst du damit?

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
  Mit Zitat antworten Zitat
Torpedo

Registriert seit: 21. Dez 2003
410 Beiträge
 
#4

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

  Alt 7. Nov 2007, 20:43
*studentenliste[i].NameSenden()
Wenn das ein Array ist kannst du den * wahrscheinlich weglassen, da Arrays Pointer sind.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

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

  Alt 7. Nov 2007, 20:45
Der bislang völlig von C++ Verschonte wagt eine Antwort, mal sehen, was daraus wird . 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]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#6

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

  Alt 7. Nov 2007, 20:47
Hallo

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.
  Mit Zitat antworten Zitat
Torpedo

Registriert seit: 21. Dez 2003
410 Beiträge
 
#7

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

  Alt 7. Nov 2007, 20:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

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

  Alt 7. Nov 2007, 21:01
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 ) 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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#9

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

  Alt 7. Nov 2007, 21:14
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?
  Mit Zitat antworten Zitat
Torpedo

Registriert seit: 21. Dez 2003
410 Beiträge
 
#10

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

  Alt 7. Nov 2007, 21:14
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
Angehängte Dateien
Dateityp: cpp t_282.cpp (772 Bytes, 1x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 Uhr.
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