struct an funktion übergeben in c++
-
Hallo an alle,
ich hoffe ich bin im richtigen Forums-Bereich, wenn nicht dann bitte mal verschieben.
Hab hier ein kleines Problem. Ich möchte eine Funktion schreiben die mir Dateien erstellt mit Daten die aus einem Struct-Konstrukt kommen.Schreib ich den Code alles in eine Quelldatei funktioniert das auch tadellos.
Hier der Quelltext wie es funktioniert, entschuldigt die eventuelle "Unordnung" hab das jetzt nur schnell zusammenkopiert.
#include <iostream> #include <sstream> #include <fstream> using namespace std; int main() { typedef double coord_double; typedef struct { coord_double x; coord_double y; coord_double z; } coord_anchor; int anchor_n=4; coord_anchor anchor[4]; anchor[1].x=1; anchor[1].y=2; anchor[1].z=3; anchor[2].x=4; anchor[2].y=5; anchor[2].z=6; //... for (int i=1;i<=anchor_n;i++) { stringstream str; str << "anchor" << i << ".txt"; ofstream ofs ( str.str().c_str()); if (!ofs.bad()) { ofs << "Anchor "<<i<<"\n" "x "<<anchor[i].x<<", y "<<anchor[i].y<<", z "<<anchor[i].z<<"\n"<< endl; ofs.close(); } } }Schreibe ich jetzt aber den Algorithmus zur Dateiausgabe in eine extra Datei und deklarier das ganze als Funktion die die Daten übergeben bekommt funktioniert nix mehr. Hier mal so wie ich es aufgeteilt hatte.
Header-Files:
coord.h
#ifndef COORD_H #define COORD_H typedef double coord_double; typedef struct { coord_double x; coord_double y; coord_double z; } coord_anchor; #endiffile.h
#ifndef FILE_H #define FILE_H void file_out(int,coord_anchor); #endifHier die c++ Datein
file_out.cpp#include <sstream> #include <fstream> using namespace std; void file_out(int anchor_n,double anchor[]) { for (int i=1;i<=anchor_n;i++) { stringstream str; str << "anchor" << i << ".txt"; ofstream ofs ( str.str().c_str()); if (!ofs.bad()) { ofs << "Anchor "<<i<<"\n" "x "<<anchor[i].x<<", y "<<anchor[i].y<<", z "<<anchor[i].z<<"\n"<< endl; ofs.close(); } } }test.cpp
#include <iostream> #include <sstream> #include <fstream> #include "coord.h" #include "file.h" using namespace std; int main() { int anchor_n=4; coord_anchor anchor[4]; anchor[1].x=1; anchor[1].y=2; anchor[1].z=3; anchor[2].x=4; anchor[2].y=5; anchor[2].z=6; file_out(anchor_n, anchor[4]); return 0; }Da bekomme ich beim Kompilieren selber keine Fehler, erst wenn ich das Debugging starte bekomme ich folgende Fehlermeldungen und ich weiss einfach nicht mehr weiter.
------ Erstellen gestartet: Projekt: test, Konfiguration: Debug Win32 ------ Kompilieren... file_out.cpp d:\eigene dateien\visual studio 2008\projects\test\test\file_out.cpp(18) : error C2228: Links von ".x" muss sich eine Klasse/Struktur/Union befinden. Typ ist 'double' d:\eigene dateien\visual studio 2008\projects\test\test\file_out.cpp(18) : error C2228: Links von ".y" muss sich eine Klasse/Struktur/Union befinden. Typ ist 'double' d:\eigene dateien\visual studio 2008\projects\test\test\file_out.cpp(18) : error C2228: Links von ".z" muss sich eine Klasse/Struktur/Union befinden. Typ ist 'double' Das Buildprotokoll wurde unter "file://d:\eigene Dateien\Visual Studio 2008\Projects\test\test\Debug\BuildLog.htm" gespeichert. test - 3 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========Falls sich jemand der Sache annimmt und Rat weiss dann danke ich schon mal im Voraus. Ich sollte eventuell erwähnen das ich Visual C++ 2008 nutze und eigentlich blutiger Anfänger bin.
mfg Morxi
-
void file_out(int anchor_n,double anchor[]) { for (int i=1;i<=anchor_n;i++) { stringstream str; str << "anchor" << i << ".txt"; ofstream ofs ( str.str().c_str()); if (!ofs.bad()) { ofs << "Anchor "<<i<<"\n" "x "<<anchor[i].x<<", y "<<anchor[i].y<<", z "<<anchor[i].z<<"\n"<< endl; ofs.close(); } } }Du notierst den Parameter anchor als double-Array, nicht als dein struct. double ist nunmal keine Klasse mit den Elementen x, y und z. Das meckert der Compiler an. Du solltest dort also deinen Typen struct coord_anchor angeben.
-
Problem gelöst, danke.
-
Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Morxi schrieb:
...
Noch ein paar kleine Anmerkungen.
1. Auch wenn man hier vielleicht die Bedeutung leicht erkennt, rate ich dir Abkürzungen für Variablen ab (nach einen halben Jahr hat man sonst manchmal Verständnisprobleme). Und vor allem Rate ich grundsätzlich zu sprechenden Namen.
2. typedef struct ist ein altes C-Relikt. enum, struct, class... sind bereits Typdefinitionen.// In C++ unüblich: typedef struct { coord_double x; coord_double y; coord_double z; } coord_anchor; // In C++ üblich: struct coord_anchor { coord_double x; coord_double y; coord_double z; };3. In C++ würde ich auch in Strukturen Konstruktoren nutzen, spart häufig einiges bei der Verwendung.
4. Häufig bessere Alternativen zum C-Array sind std::tr1::array (Falls der TR1 unter deinem Compiler unterstützt wird) oder std::vector.
5. Ich würde auch in Headern immer die Parameternamen mit Angeben.
Warum? Man sollte immer gegen die Schnittstelle, nie die Implementierung programmieren. In dem man zum Verständnis aber gezwungen ist in die Implementierung zu schauen, wird mit diesem Prinzip schon gebrochen.cu André