Anfänger mit Strukturen
-
Wie ihr schon an der Überschrift erkennt fang ich gerade erst an mit Strukturen.
Mein "Programm" soll einfach eine Subtraktion machen, dabei soll der Umgang mit Strukturen bei der Übergabe zu anderen Funktionen geübt werden.
Das Listing sieht so aus:#include <iostream> using namespace std; typedef struct m_tStrukturTAG { int number1; int number2; }m_tStruktur; typedef struct StrukturTAG { int number1; int number2; }Struktur; int Subtraktion(Struktur* pStruktur) { return (pStruktur->number2 - pStruktur->number1); } int main() { m_tStruktur firstStruktur; int result; firstStruktur.number1 = 10; firstStruktur.number2 = 5; cout << "Die Nummer lautet: " << Subtraktion(&firstStruktur.number1); cin.get(); return 0; }Der Fehler der dazu ausgegeben wird lautet volgendermaßen:
'Subtraktion': Konvertierung des Parameters 1 von 'int *' in 'Struktur *' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Ich weiß das ich den reinterpret_cast<int*> operator nutzen muss, leider weiß ich aber nicht wie.
Kann mir jemand weiterhelfen.
Danke schon mal im voraus!
-
Hallo
du must schon die ganze Struktur als Pointer übergeben, und auch die Definition der Struktur kannst du vereinfachen
struct tStruktur { int number1; int number2; }; int Subtraktion(tStruktur* pStruktur) { return (pStruktur->number2 - pStruktur->number1); } int main() { tStruktur firstStruktur; int result; firstStruktur.number1 = 10; firstStruktur.number2 = 5; cout << "Die Nummer lautet: " << Subtraktion(&firstStruktur); cin.get(); return 0; }/Edit : Ach Mist, jetzt hab ich vergessen, genau den Fehler zu berichtigen den ich ankreide... danke Lord
bis bald
akari
-
Grüß Dich!
Platy schrieb:
int Subtraktion(Struktur* pStruktur)
{
return (pStruktur->number2 - pStruktur->number1);
}int main()
{
cout << "Die Nummer lautet: " << Subtraktion(&firstStruktur.number1);
}
[/cpp]
Der Fehler der dazu ausgegeben wird lautet volgendermaßen:'Subtraktion': Konvertierung des Parameters 1 von 'int *' in 'Struktur *' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Ich weiß das ich den reinterpret_cast<int*> operator nutzen muss, leider weiß ich aber nicht wie.
Lies die Fehlermeldung und bedenke, dass die einfachste Lösung in der Regel auch die Beste ist. Er kann eine 'int *' nicht nach 'Struktur *' verwandeln.
Die Frage sollte also nicht lauten, "Wie bekomme ich aus 'int *' ein 'Struktur *'?", sondern "Wieso 'int *'?!?"Deine Funktion erwartet eine 'Struktur *', du übergibst ein 'int *', hier ist also ein Typenfehler. Du rufst die Funktion mit dem Argument (&firstStruktur.number1) auf und firstStruktur.number1 ist ein int, & von 'int' ist 'int *'.
Du möchtest aber doch die Struktur übergeben und nicht nur eine der beiden Nummern: Subtraktion(&firstStruktur)
Ich vermute, Du bist inzwischen aber auch selbst drauf gekommen.
Viel Spaß beim weiteren C-lernen.
-
@akari: Subtraktion(&firstStruktur);

-
Wichtig bei dieser Lösung ist allerdings, dass zwei verschiedene Strukturen Existieren, eine wird in main() verwendet und übergeben, die andere dient der Berechnung in der Funktion, daher darf ich den ersten Lösungsweg nicht benutzen.
-
Hallo
Du hast recht, es gibt im Speicher nur eine Instanz der Struktur, an die Funktion wird nur eine Adresse übergeben.
Du könntest noch sowas machenint Subtraktion(tStruktur pStruktur) { return (pStruktur.number2 - pStruktur.number1); } ... cout << "Die Nummer lautet: " << Subtraktion(firstStruktur)was dann eine Übergabe per Value statt per Reference wäre.
Was du aber in keinem Fall brauchst sind zwei Typen, oder gar noch typedefs.
bis bald
akari
-
Platy schrieb:
Wichtig bei dieser Lösung ist allerdings, dass zwei verschiedene Strukturen Existieren, eine wird in main() verwendet und übergeben, die andere dient der Berechnung in der Funktion, daher darf ich den ersten Lösungsweg nicht benutzen.
Jetzt wo Du es sagst... darfst Du eigentlich keine Lösung benutzen.
Du musst wirklich umcasten und wenn ich mir das so ansehe, wäre Vererbung hier eigentlich ein gutes Stichwort. Da Du mit Strukturen arbeitest, stehen Dir natürlich nicht die C++-Hilfen zur Verfügung, also keine Klassen.
Deine Struktur 'm_tStrukturTAG' könnte dann so aussehen:
typedef struct m_tStrukturTAG { Struktur Data; // Der Typ Struktur wurde zuvor definiert. }m_tStruktur;und main:
int main() { m_tStruktur firstStruktur; int result; firstStruktur.Data.number1 = 10; firstStruktur.Data.number2 = 5; cout << "Die Nummer lautet: " << Subtraktion(&firstStruktur.Data); cin.get(); return 0; }
-
Danke jetzt funktioniert es, wenn auch auf einer komischen Art
typedef struct m_tStrukturTAG { Struktur Data; // Der Typ Struktur wurde zuvor definiert. }m_tStruktur;Denn dies ist ja eigentlich das gleiche als wenn ich die Struktur gleich weglassen würde und nur eine verwenden würde, in diesem Fall "Struktur".
Aber trotzdem Danke.
-
Xin schrieb:
Da Du mit Strukturen arbeitest, stehen Dir natürlich nicht die C++-Hilfen zur Verfügung, also keine Klassen.
Strukturen SIND Klassen, es stehen somit sämtliche Möglichkeiten zur Verfügung.
-
Bashar schrieb:
Xin schrieb:
Da Du mit Strukturen arbeitest, stehen Dir natürlich nicht die C++-Hilfen zur Verfügung, also keine Klassen.
Strukturen SIND Klassen, es stehen somit sämtliche Möglichkeiten zur Verfügung.
Die meisten (alle?) Compiler setzen Strukturen und Klassen gleich, aber wenn er "Strukturen" lernen will, dann gehe ich mal davon aus, dass er Strukturen lernen will, wie sie in C gebräuchlich sind, ansonsten würde er vermutlich mit Klassen arbeiten wollen und sich auch das Typedef schenken können.
-
Platy schrieb:
Danke jetzt funktioniert es, wenn auch auf einer komischen Art
typedef struct m_tStrukturTAG { Struktur Data; // Der Typ Struktur wurde zuvor definiert. }m_tStruktur;Denn dies ist ja eigentlich das gleiche als wenn ich die Struktur gleich weglassen würde und nur eine verwenden würde, in diesem Fall "Struktur".
Aber trotzdem Danke.
Aus Deinem Sourcecode sehe ich auch keinen Grund, warum Du zwei vergleichbare - um nicht zu sagen identische - Strukturen anlegst?!
Wenn Du nur mehrere Typen verwenden möchtest und auf Klassen umschwenken kannst oder möchtest, könntest Du es mit:
class Struktur { public: int number1; int number2; }; class m_tStruktur : public Struktur { };einfacher haben. Da m_tStruktur auch die Daten einer 'Struktur' enthält, darfst Du sie auch an Funktionen übergeben, die eigentlich eine 'Struktur' verlangen.
Ansonsten - wenn Du nur einen Typ brauchst, solltest Du vielleicht auch nur einen nehmen?!
Kommt hat drauf an, was Du da grade programmmieren möchtest.[edit: Tippfehler im Sourcecode geändert]
-
Xin schrieb:
Die meisten (alle?) Compiler setzen Strukturen und Klassen gleich
Alle Compiler für Standard-C++.
, aber wenn er "Strukturen" lernen will, dann gehe ich mal davon aus, dass er Strukturen lernen will, wie sie in C gebräuchlich sind,
Komisches Lernziel, wenn man C++ lernen will, sollte man C++ lernen und keine andere Sprache. Ich glaube auch nicht wirklich, dass er das selbst so will, ich tippe auf ein Lehrbuch oder einen Lehrer. Kommt ja oft genug vor, dass die -- C++-technisch gesehen -- in der Steinzeit verblieben sind.