Primer Aufgabe 9.3
-
Hallo an alle!
Ich bin im Moment den Primer durchzuarbeiten und komme leider nicht weiter.
Aufgabenstellung:
Begin with the following structure declaration:
struct chaff
{
char dross[20];
int slag;
};
Write a program that uses placement new to place an array of two such structures in a buffer. Then assign values to the structure members (remembering to use strcpy() for the char array) and use a loop to display the contents. Option 1 is to use a static array, like that in Listing 9.9, for the buffer. Option 2 is to use regular new to allocate the buffer.Mein Code:
#include <iostream> #include <new> const int BUF = 512; int N = 2; char buffer[BUF]; using namespace std; struct chaff { char dross[20]; int slag; }; chaff* assignChaff(chaff c); void output(chaff* c); int main() { chaff* neu[N]; neu[0] = new chaff[N]; neu[1] = new (buffer) chaff; chaff* a; for (int i = 0; i < N; i++) { a = assignChaff(*neu[i]); output(a); } system("pause"); return 0; } chaff* assignChaff(chaff c) { char p[20]; int k; cout << "Input: " << endl; cin.getline(p, 20); cout << "Number: " << endl; cin >> c.slag; strcpy(c.dross, p); } void output(chaff* c) { cout << "Output p: " << c.dross << c.slag << endl; cout << c.dross << endl; cout << c.slag << endl; }
Das Problem ist, dass er in der Funktion output das dross und slag nicht als nicht definiert warnimmt. Wenn ich den Output in die main-Funktion übertrage, dann gibt er mir nur eine Adresse aus. Ich verstehe nicht wo die Fehler liegen??
Vielen Dank im Voraus!
Mod-Edit: clang-format
-
Der . Operator und Zeiger passen nicht zusammen.
-
Bevor du dich mit fortgeschrittenem Stoff wie placement-new beschäftigst, solltest du vielleicht einmal Grundlagen lernen.
Also z.B. mit Fragen wie "was ist ein Pointer", "wie dereferenziere ich einen Pointer" etc.
Es bringt nichts, wenn du dir placement-new vorher anschaust. Wirklich nicht!
Auch bringt es nicht, davon zu sprechen, dass "er" etwas falsch wahrnimmt. Am besten, du sagst uns noch, wer "er" denn ist und wie er seine Wahrnehmung äußert (copy+paste, nicht indirekte Rede).
Fangen wir einfach an:
Warum ist die Signatur von output so:void output(chaff* c)
Wäre es nicht sinnvoller, a) den Parameter const zu machen, b) eine const& statt eines Pointers zu übergeben? Zumal du im Body von output auchc.dross
etc. schreibst, was mit der Pointersignatur nicht zusammenpasst.Nehmen wir die nächste Funktion: warum ist die Signatur so:
chaff* assignChaff(chaff c)
Auch das ergibt wenig Sinn, zumal in der Funktion auch kein "return" vorhanden ist.Ans main gehen wir dann, wenn du diese beiden Funktionen überarbeitet hast... Oder geh im Buch zurück.
-
Als er meine ich das Programm!