struktur an funktion übergeben?



  • hi

    ich möchte in meinem programm folgende strukturvariable an eine incluierte datei übergeben:

    #include "datei.h"
    
    struct eingabewerte{
    
            double erdbeschl;                    // Erdbeschleunigung max. 4 Stellen 
            char fluidname[255];                // Fluid max. 10 Stellen 
            double fluiddichte;                  // Fluiddichte max. 4 Stellen 
            int modellart;                      // 1-Tiravib, 2-Schubert, 3-Partikel
            int status_param;                   // Status der Parameterauswahl 0-3
            int dem_fall;                       // Fall von Modell Partikel_DEM 0-...
            char fallbeschreibung[5][255];      // Kurzbeschreibung für Fall-Modell DEM
            int mischv_status;                  // Mischungsverhältnis --> 0-Volumenanteil 1-Masseanteil
            double mischv_anteil1;               // Mischungsverhältnis Anteil Stoff1 (Volumenanteile)
            double dichte[2];                    // Dichte von Stoff 1 und 2 (0 bzw. 1)
            double korndurchm[2];                // Korndurchmesser von Stoff 1 und 2 (0 bzw. 1)
            double cw_wert[2];                   // Cw-Wert von Stoff 1 und 2 (0 bzw. 1)
    
    }eingabe;
    

    meine funktion rufe ich dann so in der main.cpp auf:

    test(eingabe);
    

    meine datei.h sieht so aus:

    #include <windows.h>
    void test(eingabewerte eingabe2);
    

    und meine datei.cpp so:

    #include "datei.h"
    
    void test(eingabewerte eingabe2)
    {
    
    // mache was mit eingabe2...
    
    }
    

    leider geht es so nicht. wie muss die datei.h und die datei.cpp aussehen, damit es geht.
    habe schon viel gelesen und probiert, habe da aber wohl einen denkfehler drinne.

    vielen dank
    slower



  • Deine Struktur ist noch nicht bekannt wenn der Header inkludiert wird.

    Liesmal hier:

    http://www.c-plusplus.net/forum/topic,4751.html

    Ist nicht ganz was Du hast, dürfte DIr aber das verständnis dazu geben.



  • hhhmmm also das hat mich jetzt noch mehr verwirrt. vielleicht ist ja einer so gnädig, mir das an meinem bsp. zu erklären?

    wäre echt super



  • -Befindet sich die Strukturdefinition von der Funktionsdekalration?

    Der normale Aufbau ist

    #include <a.h>
    // andere includes
    // Strukturdefinitionen
    struct eingabewerte {
    //...
    };
    // Globale nur falls nötig
    //...
    // Funktionsprototypen
    void test(eingabewerte eingabe2);
    //....
    
    // Funktionen
    void test(eingabewerte eingabe2) 
    { 
    // mache was mit eingabe2... 
    }
    

    Wenn man diese Reihenfolge einhält kann man die Punkte Strukturdefiniton einschließlich Funktionsprototypen in eine oder mehrere Headerdateien auslagern. Diese Reihenfolge ist sinnvoll da man im Normalfall nur auf vorher bekannte Dinge zugreifen kann.

    Nächste Frage was willst du in test machen. So wie du sie deklariert hast kannst du die Daten in eingabe2 in der Funktion nicht so ändern das sie auch in der aufrufenden Funktion geändert sind.
    Falls du das möchstest musst du folgendes Schreiben.

    // Funktionen
    void test1(eingabewerte &eingabe2) 
    { 
    *eingabe2.status_param=23;
    // mache was mit eingabe2... 
    }
    

    Falls noch weitere Fragen sind wir sind neugierig.

    Willst du eigentlich ein C oder ien C++ Programm schreiben. Die Konstrukte die du benutzt sind eher typisch für C. So wie das aussieht würde sich in C++ dafür ein Klassendefinition anbieten.



  • PAD schrieb:

    #include <a.h>
    // andere includes
    // Strukturdefinitionen
    struct eingabewerte {
    //...
    };
    // Globale nur falls nötig
    //...
    // Funktionsprototypen
    void test(eingabewerte eingabe2);
    //....
    
    // Funktionen
    void test(eingabewerte eingabe2) 
    { 
    // mache was mit eingabe2... 
    }
    

    allerdings ist das dann call by value und bei solch einer großen struktur nicht gerade atemberaubend schnell. eine andere möglichkeit wäre:

    //datei.h
    #include <what_ever>
    
    struct eingabewerte; //vorwärts-deklaration
    void test1 (const eingabewerte &); 
    
    //eingabewerte.h
    struct eingabewerte{ 
    
            double erdbeschl;                    // Erdbeschleunigung max. 4 Stellen  
            char fluidname[255];                // Fluid max. 10 Stellen  
            double fluiddichte;                  // Fluiddichte max. 4 Stellen  
            int modellart;                      // 1-Tiravib, 2-Schubert, 3-Partikel 
            int status_param;                   // Status der Parameterauswahl 0-3 
            int dem_fall;                       // Fall von Modell Partikel_DEM 0-... 
            char fallbeschreibung[5][255];      // Kurzbeschreibung für Fall-Modell DEM 
            int mischv_status;                  // Mischungsverhältnis --> 0-Volumenanteil 1-Masseanteil 
            double mischv_anteil1;               // Mischungsverhältnis Anteil Stoff1 (Volumenanteile) 
            double dichte[2];                    // Dichte von Stoff 1 und 2 (0 bzw. 1) 
            double korndurchm[2];                // Korndurchmesser von Stoff 1 und 2 (0 bzw. 1) 
            double cw_wert[2];                   // Cw-Wert von Stoff 1 und 2 (0 bzw. 1) 
    
    }eingabe; //wozu gleich eine instanz erstellen?
    
    //datei.cpp - hier die implementierung
    #include "eingabewerte.h"
    void test1(const eingabe &e) {
      //...
    } 
    
    //main.cpp
    #include "datei.h"
    #include "eingabewerte.h"
    
    int main () {
      eingabewerte blub;
      test1(blub);
    }
    

    allerdings könnte die funktiondeklaration test1 auch besser zur datei mit definition der struct passen. kommt dann drauf an.



  • Ich hab mich momentan an die C-Lösungen gehalten, da für mich nicht klar ist ob er das Programm in C oder C++ schreiben möchte.

    Der Code sieht nach C aus, auch wenn er im C++ postet



  • ich danke euch beiden sehr!

    verwende jetzt die variante von DAVIE, genau so wollte ich es haben.
    aber auch die variante von PAD, hat mir beim verstehen gaholfen. mir ist jetzt einiges klarer.

    thx slower


Anmelden zum Antworten