Übergabe von Arrays mittels Zeigern und anschließende Ausgabe in txt



  • Hallo zusammen,

    ich beschäftige mich jetzt schon länger damit, wie ich ganze Arrays am besten zwischen Funktionen austauschen kann. Im Code findet ihr meine 4 Funktionen:
    1. Einlesen aus Text
    2. Streckenmeter berechnen
    3. Radius berechnen
    4. Beide Arrays wieder in Textfile schreiben

    Für die wichtigen x,y Variablen habe ich das Problem über globale Variablen gelöst, was ich für Radius und Streckenmeter gerne vermeiden würde. Laut den Einträgen und Anleitungen, die ich im Netz gefunden habe, sollte das mit Zeigern so funktionieren. In meiner Textdatei stehen allerdings hauptsächlich falsche Werte (e-39 Größenordnung).

    Kann mir jemand bitte helfen und sagen, was ich falsch mache?
    Vielen Dank im Voraus!

    #include <string>
    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <cmath>
    #include <Eigen/Dense> //Eigen Library
    
    float * streckenmeter (float x[1000], float y[1000], int n);
    float * radius (float x[1000], float y[1000], int n);
    int txt_input();
    void txt_output(float * sp1, float * sp2, int n);
    
    using namespace std;
    using namespace Eigen;
    
    // Globale Variablen
        float x[1000] = {};
        float y[1000] = {};
    
    int main()
    {
        // Einlesen der Text-Datei
        int input_size = txt_input();
    
        float *s = streckenmeter(x, y, input_size);
        float *r = radius(x,y, input_size);
    
        txt_output(s,r,input_size);
    
        return 0;
    }
    
    int txt_input() // Gibt Anzahl der eingelesenen x/y-Koordinaten zurück
    {
           ifstream track_input("Silverstone.txt"); //Öffnet die Datei zum Lesen
    
        // Anzahl der x- und y- Koordinaten (=Zeilen) bestimmen
    
        string line;
        string buff_sp1, buff_sp2;
        int i = 0;
        int input_size;
    
        if (track_input.is_open())
            {
            while ( getline (track_input,line) )
                {
                    buff_sp1 = line;
                    buff_sp2 = line;
                    stringstream istr(buff_sp1+" "+buff_sp2);
                    istr >> x[i] >> y[i];
                    i++;
                }
            input_size = i;
            track_input.close();
            }
        else cout << "Unable to open file";
    
        return input_size;
    }
    
    void txt_output(float * sp1, float * sp2, int n)
    {
        ofstream output;
        output.open ("Output.txt");
        for (int i = 0; i < n; i++)
        {
            output << sp1[i] << " " << sp2[i] << endl;
        }
    //    output.close; Fehlermeldung
    }
    
    float * streckenmeter (float x[1000], float y[1000], int n)
    {
        float meter[n] = {};
        meter[0] = 0;
        float schritt[n-1] = {};
    
        for (int i = 0; i < n - 1; i++)
        {
            schritt[i] = sqrt(pow((x[i+1] - x[i]),2) + pow((y[i+1] - y[i]),2));
            meter[i+1] = meter[i] + schritt[i];
        }
        cout << "Meter[0] = " << meter[0] << endl;
        return meter;
    }
    
    float * radius (float x[1000], float y[1000], int n)
    {
        float Radius[n];
    
      /* Berechnung von z zur Übersicht entfernt. */
    
        Radius[n] = sqrt(pow(z[1]/2,2) + pow(z[2]/2,2) - z[0]);
    
        cout << "Radius[0] = " << Radius[0] << endl;
        return Radius;
    
    }
    


  • Benutze std::vector oder std::array.



  • return meter;
    

    Das ist eine lokale Variable. Fehler!



  • Danke für deine Antwort.
    Was kann ich denn machen, außer die Variablen Radius und meter global zu deklarieren?

    Wenn ich Radius als Vector erstelle, so wie hier:

    #include <vector>
    
    int main()
    {
        std::vector<int> v;
        int i;
    
        for (i=0; i<100; ++i) {
            v.push_back(i); // Fügt i ans Ende von v an.
            ++v[i]; // v[i] muss bereits existieren.
        }
    }
    

    ... das passt ja dann nicht mehr zu meiner float * Funktion. Wie müsste ich das anpassen?

    Sorry, dass ich so dumm frage, aber bestehende Anleitungen etc. helfen mir da leider nicht wirklich weiter.



  • Kannst du irgendwie pseudocodemäßig beschreiben, was du erreichen willst, was du wo benutzen willst?
    Lass Code weg, der mit der Frage nichts zu tun hat, z.B. irgendwelche Berechnungen...



  • Du solltest dir globale Variablen lieber nicht angewöhnen. Schlechter Stil.
    Mögliche Alternativen wären:
    a) Speicherverwaltung mit new und delete übernehmen (ebenfalls schlecht)
    b) Array kopieren
    c) Array in main() deklarieren, der Funktion übergeben und befüllen
    d) std::vector/std::array nutzen (beste && einfachste Möglichkeit; hast du ja anscheinend auch schon erkannt)

    Aber auch hier musst du dich fragen, wie du dein Objekt aus der Funktion in deine main()-Funktion bekommst. Hier bietet sich für dich vermutlich Möglichkeit b) an.
    Das heißt:

    std::vector<float> streckenmeter(std::vector<float> x, std::vector<float> y, int n);    // nimm hier lieber vernünftige Variablennamen; was ist "n"?
    

    Eine Frage noch: warum erstellst du jetzt einen std::vector voller ints? Du willst, dachte ich, floats?
    Was du genau mit deinem Codebeispiel zeigen willst, weiß ich auch nicht so genau.



  • Der Code soll folgendes machen.
    1.) x und y aus Spalten einer .txt Datei auslesen --> Klappt
    2.) Mithilfe von x und y Streckenmeter und Radius berechnen --> Klappt
    3.) Die Arrays/Vektoren Radius und Streckenmeter brauch ich in der main wieder, um sie an die txt_output zu geben, die die beiden Variablen spaltenweise in ein txt-File schreiben soll --> An der Übergabe hakt es

    Deinen Vorschlag Skylac werde ich morgen mal testen, vielen Dank dafür!
    Der 2. Codeschnipsel ist aus einer Anleitung kopiert, da ich noch nie mit der Vector Lib gearbeitet habe und erstmal sicher gehen wollte, dass manni66 das gemeint hat. Natürlich brauch ich in meinem Fall float.

    n soll die Länge von x und y sein, die in den txt Inputs verschieden ist.
    Ich werd versuchen Variablen besser zu benennen, danke für den Tipp 🙂


Log in to reply