Kein Zugriff auf public Struktur



  • Ich habe folgendes Problem.

    class CSVInterface	{
    public:
    	int DateiLesen(char* pszFilename);
    	int DateiSchreiben(char* pszFilename);
    	int VerzeichnisLesen(char* pszFilename);
    
    public:	
    	struct IGBTStruktur {		// Beschreibung
    		string ch_Hersteller;
    		string ch_Typ;
    		string i_Nennspannung;
    		string i_Nennstrom;
    		string ch_Pack;
    		string ch_Kommentar;
    	} IGBTDaten;
    
    protected:
    	int n,i,j;	// Indexvariablen
    
    };
    
    void main(void){
    	cout << "Das ist meine CSV Schnittstelle Testoberfläche\n**********************************************"<<endl;
    
    	CSVInterface CSV;
    
    	CSV.DateiLesen("CSVEingabe.csv");
    
    	cout << "\nHersteller:\t" << CSV.IGBTDaten.ch_Hersteller << endl;
    	cout << "Typ:\t" << CSV.IGBTDaten.ch_Typ << endl;
    	cout << "Nennspannung:\t" << CSV.IGBTDaten.i_Nennspannung << endl;
    	cout << "Nennstrom:\t" << CSV.IGBTDaten.i_Nennstrom << endl;
    	cout << "Gehäuse:\t" << CSV.IGBTDaten.ch_Pack << endl;
    	cout << "Kommentar:\t" << CSV.IGBTDaten.ch_Kommentar << endl;
    
    	string TestString;
    	TestString =  CSV.IGBTDaten.ch_Hersteller.c_str();
    
    	cout << "\nTestString:\t" << TestString << endl;
    
    	getch();
    }
    

    Dies hier funktioniert ...

    Jetzt versuche ich diese Klasse in Simplorer C/C++ Interface nutzbar zu machen. Das ist ein Simulationsprogramm bei dem es möglich ist, Erweiterung über dieses Interface zu programmieren. Als Compiler dient dazu MS Visual C++ 6.0.

    ...
    	CSVInterface CSV;
    	CSV.DateiLesen("CSVEingabe.csv");
    
    	string TestString;
    	TestString = CSV.IGBTDaten.ch_Hersteller.c_str();	
    ...
    

    Beim erstellen kommen folgende Fehlermeldungen

    Setting environment for using Microsoft Visual C++ tools.
    ExcelImport.cpp
    ExcelImport.cpp(17) : error C2039: 'IGBTDaten' : Ist kein Element von 'CSVInterface'
            CSVSchnittstelle.h(12) : Siehe Deklaration von 'CSVInterface'
    ExcelImport.cpp(17) : error C2228: Der linke Teil von '.ch_Hersteller' muss eine Klasse/Struktur/Union sein
    ExcelImport.cpp(17) : error C2228: Der linke Teil von '.c_str' muss eine Klasse/Struktur/Union sein
    ExcelImport2_Interface.cpp
            1 file(s) copied.
    

    Ich kann mir nicht erklären, warum dass in der Visual C++ Oberfläche funktioniert, beim übertragen aber nicht mehr. ch_Hersteller ist Teil der Klasse, da habe ich nichts verändert. Die Klasse wird vorher eingebunden, sonst würde es bereits bei der Objekterstellung zum Fehler kommen.



  • Hi,
    der scheint die Klasse string nicht zu kennen, hast du die included ?



  • Ich tippe einfach mal auf deinen Compiler. Kannst du keine neuere Version benutzen? Hast du wenigstens die Service Packs installiert?



  • @proggingmania
    ja, in der header datei der klasse bereits ... ich habs eben auch nochmal extra davor eingebunden. Hat nichts gebracht.

    @Michael E.
    Es ist ja der gleiche Compiler. MS Visual C++ 6.0 habe ich für das Testprogramm genutzt, und dieser wird auch als Compiler von Simplorer genutzt um die Programme zu übersetzen. Steht sogar in den Systemvoraussetzungen. Service Packs werden automatisch aufgespielt, da können wir uns nicht gegen wehren.

    Der scheint mir die Struktur IGBTDaten nicht kennen zu wollen. Aber warum? Ich habe die Strukturdefinition direkt über ' cout << "\nHersteller:\t" << CSV.IGBTDaten.ch_Hersteller << endl; ' gesetzt, geht auch nicht.

    Wie bekomme ich sonst ein Datensatz aus verschiedenen Datentypen zusammengefasst?



  • Mach doch mal auf ser Struktur ne klasse, und probie obs dann funzt.:

    class IGBTStruktur {        // Beschreibung
        public:   
            string ch_Hersteller;
            string ch_Typ;
            string i_Nennspannung;
            string i_Nennstrom;
            string ch_Pack;
            string ch_Kommentar;
       };
    
      IGBTStruktur IGBTDaten;
    

    und versuche dann über IGBTDaten zuzugriefen!



  • Hi,

    kenne mich mit C-Syntax nicht so besonders gut aus, deswegen weiß ich nicht, ob das hier noch wie gewünscht funktioniert:

    etsmart schrieb:

    ...
    	struct IGBTStruktur {		// Beschreibung
    		string ch_Hersteller;
    		string ch_Typ;
    		string i_Nennspannung;
    		string i_Nennstrom;
    		string ch_Pack;
    		string ch_Kommentar;
    	} IGBTDaten;
    ...
    

    Das ist "alte C-Syntax" ... versuch es dochmal mit der normalen C++-Syntax:

    class CSVInterface    {
    public:
        int DateiLesen(char* pszFilename);
        int DateiSchreiben(char* pszFilename);
        int VerzeichnisLesen(char* pszFilename);
    
    // erneutes public: braucht's nicht
    
    // Erstmal die Deklaration
       struct IGBTStruktur {
    		string ch_Hersteller;
    		string ch_Typ;
    		string i_Nennspannung;
    		string i_Nennstrom;
    		string ch_Pack;
    		string ch_Kommentar;
    	};
    // Dann die Membervariable:
       IGBTStruktur IGBTDaten;
    ...
    

    EDIT:

    BorisDieKlinge schrieb:

    Mach doch mal auf ser Struktur ne klasse, und probie obs dann funzt.:...

    Also der Compiler macht aus einem struct dasselbe wie aus einer "class mit allem public" - aber vllt. ändert die Trennung von struct- und Member-Deklaration ja was.

    Gruß,

    Simon2.



  • Was ist den die "alte C-Syntax"? Das was bei der neuen Syntax steht ist doch nichts anderes, als das IGBTDaten in einer neuen Zeile erstellt wird. Ich spare mir halt die Zeile.

    Aber ich hab den Fehler gefunden. In der Simplorer Oberfläche muss die Header Datei, die ich einbinde als Fenster geöffnet sein. Da seh ich zwar keinen Sinn drin, aber egal.



  • etsmart schrieb:

    Was ist den die "alte C-Syntax"? Das was bei der neuen Syntax steht ist doch nichts anderes, als das IGBTDaten in einer neuen Zeile erstellt wird. ...

    Wie schon gesagt: Kann gut sein, dass das an meiner Unkenntnis mit dieser Syntax (Vermischung von Typ- und Variablen-Deklaration sind mir unheimlich - das ist mir "eine eingesparte Zeile" nicht wert) liegt.
    Ich kenne das eigentlich nur als "reinrassigen" C-Programmen und habe es eigentlich noch nie in C++-Programmen gesehen... daher wohl mein Irrtum.

    Aber gut, wenn Du den Fehler gefunden/behoben hast.

    Gruß,

    Simon2.



  • Simon2 schrieb:

    etsmart schrieb:

    Was ist den die "alte C-Syntax"? Das was bei der neuen Syntax steht ist doch nichts anderes, als das IGBTDaten in einer neuen Zeile erstellt wird. ...

    Wie schon gesagt: Kann gut sein, dass das an meiner Unkenntnis mit dieser Syntax (Vermischung von Typ- und Variablen-Deklaration sind mir unheimlich - das ist mir "eine eingesparte Zeile" nicht wert) liegt.
    Ich kenne das eigentlich nur als "reinrassigen" C-Programmen und habe es eigentlich noch nie in C++-Programmen gesehen... daher wohl mein Irrtum.

    Aber gut, wenn Du den Fehler gefunden/behoben hast.

    Gruß,

    Simon2.

    Hast du dir noch nie Gedanken darüber gemacht warum man an das Ende der Klassendefinition ein Semikolon dran hängt? Eben weil man das kann. Es ist legales C und legales C++.



  • lolz schrieb:

    ...Es ist legales C und legales C++.

    Davon bin ich auch ausgegangen ... immerhin hat sich der OP auch nicht über eine Compilerfehlermeldung beschwert. 😃

    Ich bin (wie schon 2mal gesagt) eben aus Überzeugung ungeübt in dieser Syntax...

    Gruß,

    Simon2.


Log in to reply