Struktur Array in Funktion nutzen?



  • Mahlzeit,

    ich hab da mal ein ziemlich großes Problem und hoffe auf Hilfe, denn google und meine schlauen Bücher können mir auch nicht mehr helfen.

    Ich hab ne Struktur

    struct auswertung
    {
    int proband;
    int loesung;
    int loesung2;
    int loesung3;
    int loesung4;
    int loesung5;
    long time;
    long time2;
    long time3;
    long time4;
    long time5;
    };
    

    dann hab ich die benannt:

    auswertung save[i];
    

    Global kann ich die nicht deklarieren, denn dann bekomm ich den Fehler:

    F:\main.cpp variable-size type declared outside of any function

    Wenn ich es in der main() deklarieren würde, kann ich die Struktur nicht in den Funktionen aufrufen.

    Hat jemand eine Idee, wie ich dieses Problem lösen kann?

    Liebe grüße

    Sarah


  • Mod

    Die Frage die sich dein Compiler (und auch ich) stellt ist: Welchen Wert hat i?



  • ich habe i vorher deklariert als int i=0

    und dann wird der Wert hier immer erhöht:

    do
    {
    
    frage1();
    frage2();
    frage3();
    frage4();
    frage5();
    
    cout<<"neuer Test? (1=ja, 0=Nein)";
    cin>>y;
    i++;
    }
    while(y !=1);
    


  • Wenn du schon in deiner Struktur variaben mit den namen time 1, time2.... etc. hast, dann solltest du auch für diese ein Array verwenden.

    struct auswertung
    {
       int proband;
       int loesung[5];
       long time[5];
    };
    

    Du hast zwei Möglichkeiten einem Array zu erstellen:

    // 1. Du kennst die maximale Anzahl Elemente (auf dem Stack)
    int main()
    {
       auswertung save[10];
    }
    
    // 2. Du kennst NICHT die maximale Anzahl Elemente (auf dem Heap)[Regelfall]
    int main()
    {
       int anzahl;
       std::cin >> anzahl;
    
       auswertung *save = new auswertung[anzahl]; //speicher reservieren
       //arbeiten mit save
       delete[] save; //speicher wieder freigeben nicht mehr mit save arbeiten
    }
    

    In C++ verwendet man Arrays in der Form von C eher selten. Wir können das z.B. mit dem std::vector lösen. Dieser kann dann beliebig viele Elemente halten, ohne new/delete verwenden zu müssen.

    #include <vector>
    
    //struct einfügen
    
    int main()
    {
       std::vector<auswertung> save;
    
       //Werte einfügen
    }
    

    Siehe auch: http://www.cplusplus.com/reference/stl/vector/



  • sarah s. schrieb:

    ich habe i vorher deklariert als int i=0
    und dann wird der Wert hier immer erhöht:

    ...
    

    Zeige bitte deinen Gesamten Code, der Fehler leigt weiter vorne.



  • #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    #include <sys/timeb.h>
    #include <time.h>
    //#include "funk.cpp"
    
    struct auswertung
    {
    int proband;
    int loesung[5];
    long time[5];
    
    };
    
    //int loesung[4];
    //long zeit[4];
    int frage1(void);
    int frage2(void);
    int frage3(void);
    int frage4(void);
    int frage5(void);
    
    int i;
    int y;
    //int proband;
    auswertung save[i];  
    
    int main()
    {
        int  eingabe=0;
         cout<<"Psychologisches Institut II" <<endl;
         cout<<"Teiluntersuchung: 5 Fragen" <<endl;
         cout<<"<1> Neuen Versuch starten" <<endl;
         cout<<"<2> Auswertung der Versuche" <<endl;
         cout<<"<3> Ende" <<endl;
         cout<<"Ihre Eingabe"<<endl;
         cin>>eingabe;
    
         switch(eingabe)
         {
                        case 1:
    cout<<"Bitte geben sie ihre Probandennummer ein: ";
    cin>>save[i].proband;
    system ("pause");
    
    do
    {
    
    frage1();
    frage2();
    frage3();
    frage4();
    frage5();
    
    cout<<"neuer Test? (1=ja, 0=Nein)";
    cin>>y;
    i++;
    }
    while(y !=1);
    
                             break;
    


  • sarah s. schrieb:

    #include <stdlib.h>
    #include <iostream.h>
    #include <conio.h>
    #include <sys/timeb.h>
    #include <time.h>
    //#include "funk.cpp"
    

    In C++ heißen die Header <iostream>, <cstdlib> und <ctime>. (Die Funktionen liegen dann im Namespace std)

    int i;
    int y;
    //int proband;
    auswertung save[i];
    

    Arrays mit variabler Länge (VLAs) gibts in C++ nicht. Das heißt, i muss eine Compilezeit-Konstante sein, z.B. 5. Das besagt auch die Fehlermeldung, und das haben auch mehrere Vorposter schon geschrieben.
    Oder du musst eben ein dynamisches Array (C-Style) oder einen Container wie std::vector (C++-Style) verwenden.



  • auswertung save[i]; funktioniert nur, wenn der Compiler VLAs als Erweiterung unterstützt. Und selbst wenn es funktioniert, wird die Größe des Arrays nicht auf magische Weise an i gebunden, d.h. der Compiler legt immer ein Array der Größe 0 an (weil i zum Zeitpunkt der Definition 0 ist), welche Werte i danach bekommt, interessiert nicht.
    Nimm std::vector , den kannst du beliebig vergrößern.



  • Danke für eure Hilfe dann werde ich mich wirklich dannn in Vektoren einarbeiten und hoffen das ich das hinbekomme, aber danke für eure Ratschläge.



  • Kannste nicht einfach Excel für die Auswertung nehmen? Oder ist das eine Übungsaufgabe zum C++ lernen?



  • ipsec schrieb:

    d.h. der Compiler legt immer ein Array der Größe 0 an (weil i zum Zeitpunkt der Definition 0 ist)

    Nein. der Wert von i ist unspezifiziert weil nicht initialisiert.



  • omglol schrieb:

    Kannste nicht einfach Excel für die Auswertung nehmen? Oder ist das eine Übungsaufgabe zum C++ lernen?

    Das ist leider eine Übungsaufgabe und ich hab im moment voll die Denkblockade nach 8 Std. Programmieren...



  • pumuckl schrieb:

    ipsec schrieb:

    d.h. der Compiler legt immer ein Array der Größe 0 an (weil i zum Zeitpunkt der Definition 0 ist)

    Nein. der Wert von i ist unspezifiziert weil nicht initialisiert.

    Ich hatte mich auf das Zitat "ich habe i vorher deklariert als int i=0" bezogen und nicht auf den Quelltext, aber da du es sagst: gab es da nicht die Regel, dass globale (Builtin-)Variablen ohne Initialisierung den Wert 0 erhalten (im Gegensatz zu lokalen, die unspezifiziert sind)?


Anmelden zum Antworten