![]() |
[C++] Pointer-Problem: illegal indirection
Hallo zusammen,
mein C++-Compilier (VS2005 Prof.) meldet mir "illegal indirection" bei diesem Code:
Code:
Das MSDN sagt dazu folgendes:
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"; } } Zitat:
StudentenlisteSenden sieht wie folgt aus:
Code:
und arrStudenten ist ein Array aus mehreren Instanzen der Klasse CStudent:
CStudent * CPruefungsamt::StudentenlisteSenden()
{ return arrStudenten; }
Code:
Was mache ich falsch?
CStudent arrStudenten[8];
Grüße |
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 |
Re: [C++] Pointer-Problem: illegal indirection
Hallo Heiko!
Zitat:
Zitat:
Grüße |
Re: [C++] Pointer-Problem: illegal indirection
*studentenliste[i].NameSenden()
Wenn das ein Array ist kannst du den * wahrscheinlich weglassen, da Arrays Pointer sind. |
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:
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] |
Re: [C++] Pointer-Problem: illegal indirection
Hallo
Zitat:
Lasse ich das weg, erhalte ich diese Fehler: Zitat:
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. |
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
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. |
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
Wir wollen also folgende Reihenfolge erreichen:
|
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:
Aber das geht auch nicht. Wo sollen deiner Meinung nach denn die Klammern hin?
(*studentenliste)[i].NameSenden()
|
Re: [C++] Pointer-Problem: illegal indirection
Liste der Anhänge anzeigen (Anzahl: 1)
Delphi-Quellcode:
Bei mir funktionierts so.
cout << "Name: " << studentenliste[i].NameSenden() << ", Matrikel-Nr.: " << studentenliste[i].MatrikelNrSenden() << "\n";
Habe es mal kurz nachprogrammiert (Achtung, Klassen abgeändert) Im Anhang habe ich den Quellcode. Getestet mit g++. Ausgabe: Zitat:
|
Re: [C++] Pointer-Problem: illegal indirection
Auch wenn ich nicht sehr oft mit C++ gearbeitet habe, würde ich intuitiv doch Torpedo zustimmen. Denn wenn ich einen int* habe, diesen als Array interpretiere und dann indexiere (und das gibts :shock: ), dann muss ich das nicht auch noch dereferenzieren. Zum Mitschreiben:
Code:
Und jetzt lyncht mich.
int* IntArray;
IntArray = new int[5]; //ist das so richtig? //oder gerne auch mit malloc IntArray[3] = 5; delete IntArray; |
Re: [C++] Pointer-Problem: illegal indirection
@Apollonius:
Das ist mehr Java als C++ ;) Hier mal ein Beispiel:
Code:
#include <iostream>
using namespace std; int main() { int arr[5]; // Normales Array erstellen int * a = arr; // Das Programm kompiliert hier fehlerlos, weil ein array ein Pointer ist und damit mit int* kompatibel a[0] = 3; // Trotzdem kann man dann ohne * darauf zugreifen, weil das schon [] macht cout<<a[0]<<"\n"; // Es wird 3 ausgegeben return 0; } |
Re: [C++] Pointer-Problem: illegal indirection
Tatsache, Torpedo hat recht. :thumb:
Der Fehler: Zitat:
Code:
Ich danke allen, die mir hier geantwortet haben. :)
void CPruefung::NummerSenden()
|
Re: [C++] Pointer-Problem: illegal indirection
Aaaah, jetzt hab ich es auch verstanden. Glaube ich :mrgreen: . Wenn ich das richtig sehe, enthält das Array ja gar keine Zeiger, sondern direkt die Objekte (so langsam verstehe ich, warum C++ mit diesem Konzept ziemlich allein auf weiter Flur steht *g*), dann ist die Dereferenzierung per * oder -> natürlich komplett überflüssig. Die Dereferenzierung von CStudent* nach CStudent steckt ja schon im []-Operator.
[edit] Jut, so langsam erreichen wir wohl Konsens ;) . [/edit] |
Re: [C++] Pointer-Problem: illegal indirection
@Torpedo:
Das ist wohl ein Kompliment - ich habe mich nie im Entferntesten mit Java beschäftigt. Aber sofern mich meine C-Kenntnisse nicht ganz verlassen haben, ist mein Code auch halbwegs korrekt, wenn ich ein dynamisches Array erstellen will - bei dir ist die Größe ja hartcodiert. Und falls das new nicht ganz stimmen sollte, kann man ja auch malloc(5*4) nehmen. |
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
Nun habe ich hier 2 nützliche Dinge gelernt: 1. [] ist ein Operator (ich wusste das wirklich nicht) 2. [] dereferenziert gleich, sehr schön. :) Danke nochmals. |
Re: [C++] Pointer-Problem: illegal indirection
Etwas offtopic, aber vielleicht interessant für dich:
Zitat:
|
Re: [C++] Pointer-Problem: illegal indirection
Hi
Zitat:
Das mit dem Überladen lasse ich vorerst mal, sonst geht hinterher gar nichts mehr und ich blicke überhaupt nicht mehr durch. :mrgreen: Danke für die Info. Man lernt eben nie aus. :) |
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
|
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
@Torpedo: Fragt sich, ob man eine verkettete Liste wirklich indizieren will :mrgreen: . |
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
Code:
kommentiert. Seltsamerweise habe ich ein paar Tage später (wenn ich so drüber nachdenke, es war heute) Code von jemand anderem gesehen, der auch auf seltsame Weise Gebrauch von diesem Operator machte.
// HERE BE DRAGONS
Aber so ist das eben. Der Sprache selbst fehlen so viele praktische und heutzutage selbstverständliche Features, dafür hat sie so viele obszöne und esoterische Features, dass man damit fast alles machen kann, auch Dinge hinzufügen, die so nie vorgesehen waren, oder sich etwas syntaktische Vereinfachung verschaffen, indem man sie zweckentfremdet. Aber das lässt man lieber andere machen. |
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
Vom Überladen würde ich auch die Finger lassen, bis du einen guten Grund findest. Wenn du nicht unbedingt mathematisch orientierte Klassen schreibst (für die auch nur die arithmetischen Operatoren zu überladen wären, und das ist ja noch im Rahmen), wirst du das ohnehin kaum selbst machen müssen. Für die meisten Szenarien, in denen eine Überladung weiterer Operatoren sinnvoll wäre, gibt es in der STL (und natürlich in Boost) schon fertige Implementationen. Daß man ->, [] und das unäre * überladen kann, ist übrigens für Iteratoren und Smart-Pointer essentiell. Letztere sind übrigens, wenn sinnvoll eingesetzt, so bequem wie ein Garbage-Collector, ohne mit dessen Nachteilen behaftet zu sein ;) Es gibt allerdings tatsächlich einige Operatoren, die man nie überladen sollte, z.B. &&, || und , . Weiß der Geier, weshalb die Möglichkeit überhaupt besteht. Und verkettete Listen indiziert man nicht einmal in C++ ;) Zitat:
Zitat:
|
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
Zitat:
|
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
Zitat:
|
Re: [C++] Pointer-Problem: illegal indirection
Nein, boost::format verwendet den Modulo-Operator dafür. Nach dem Motto
Code:
Hat interessante Vorteile, speziell im Vergleich zu Stream-Operatoren oder dem QString::arg() (oder, davon abgesehen, gegenüber printf). Ist in meinen Augen aber noch mehr zweckentfremdet.
boost::format("%1%, %2%") % "Hallo" % "Welt"
|
Re: [C++] Pointer-Problem: illegal indirection
Ich weiß nicht was ihr alle gegen einen []-Operator bei verketteten Listen habt. Man muss doch nicht bei jedem Zugriff die ganze Kette durchlaufen. :)
Code:
Den Such-Zeiger in der Liste muss man ja nicht jedes mal wieder an den Anfang setzen.
TStringList strl;
strl.add("Hallo"); strl.add("Welt"); for(int i = 0; i<strl.count(); i++) cout<<strl[i]<<"\n"; Aber kann schon sein, dass es bei verketteten Listen nicht benutzt wird. Ein anderes Beispiel, wo es sicher benutzt wird, wäre zum Beispiel eine Klasse für Vektor-Berechnungen. v3 = v1 + v2; anstatt v3 = v1.add(v2); |
Re: [C++] Pointer-Problem: illegal indirection
Da wäre das Komma doch passender gewesen.. *g*
|
Re: [C++] Pointer-Problem: illegal indirection
Zitat:
boost.serialization verwendet auch <<, >> und & für das Streamen eines Wertes :shock: |
Re: [C++] Pointer-Problem: illegal indirection
Naja, printf ist halt nicht zu gebrauchen, wenn man eine Anwendung international gestalten will, unterstützt keine benutzerdefinierten Typen und auch keine umgeleiteten Streams. Damit ist es zumindest für meinen Entwickleralltag vollkommen nutzlos. Streams sind, was Internationalisierung betrifft, natürlich auch nicht zu gebrauchen. Praktischerweise kann man boost::format aber in Streams schieben.
Hmm. Wenn ich so drüber nachdenke... DESHALB hat man wohl die Shift-, sprich Schiebe-Operatoren dafür benutzt... um Dinge in den Stream hineinzuschieben :wall: Was DAX' scherzhafte Bemerkung zum Kommaoperator angeht: Ich tippe mal, dass das auch der erste Gedanke der Boost-Leute war. Blöderweise kann man dann einen format-Aufruf nicht als Parameter übergeben, weil das Komma dann als Parameter-Trenner statt als Operator interpretiert wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz