Hilfe beim übersetzen vom D code in c++



  • Hi, habe aus dem Internet folgenden D Code

    T[2][] fourier(T)(T[] input, float bitrate) {
        auto samples = input.length;
        auto f = fft(input);
        T[2][] r = new T[2][f.length];
        for(int i = 0; i < samples; i++) {
            T y = cast(T)(f[i].re * f[i].re + f[i].im * f[i].im);
            T x = cast(T)(1.0 * i * bitrate / samples);
    
            r[i] = [x, y];
        }
        return r;
    }
    

    welchen ich in C++ Code übersetzen möchte. Bei meinem Versuch bin ich so weit gekommen

    void fourier(double input[], int bitrate){
       complex<double> data[4096];
       for (int i = 0; i< 4096; i++)
          data[i] = input[i];
    
       complex<double>* fft;
       fft = MyDFT(data,  4096);
    
       for (int i = 0; i<4096; i++){
            float y = (float)(fft[i].real() * fft[i].real() +  fft[i].imag() * fft[i].imag());
            float x = (float)(1.0 * i * bitrate / 4096);
            rpub[0][i] = x;
            rpub[1][i] = y;
       }
    }
    

    4096 ist die Arraylänge und ist vorgegeben.
    rpub ist das Rückgabearray und global deklariert. Das programm kompiliert und läuft, wird aber nach einigen Sekunden getötet.
    was läuft da schief und vorallem was kann ich besser machen?



  • Warte, ich seh mal eben in meiner Glaskugel nach - ups, Akku leer.

    Du erwartest doch jetzt nicht ernsthaft, dass dir jemand aus diesem Nichts an Informationen eine Lösung zaubert, oder?

    Benutze einen Debugger!



  • Naja, die beiden Codeschnipsel haben nicht wirklich was gemeinsam, ausser dass beide eine Schleife haben.

    Wenn der D-Code klappt und richtig ist, wieso transformierst du den nicht 1-zu-1 nach C++ und nutzt den da?

    Und was du besser machen kannst:
    - Keine globalen Variablen nutzen.
    - Den Fehler, dass dein Programm "getötet" wird entfernen.
    - Den Algorithmus ruhig generisch wie in dem D-Code halten.

    Ich selbst hab noch nie eine Fourier-Transformation geschrieben, daher kann ich nichts zur Programmlogik sagen, aber mir scheint als ob deine Funktion mehr macht als der D-Code, und daher werfe ich mal den Tip ein: "One Function, one Purpose"!



  • haha, der glaskugelspruch.
    in den 10 zeilen Code die da sind kann man doch sehen ob/wo da Mist gebaut wurde? Die Funktion wird permanent aufgerufen, muss da Speicher freigegeben werden? (hab ewig kein C++ programmiert, und sonst auch nur als Anfänger)
    Mein restlicher Programmcode wird wahrscheinlich auch nicht weiter helfen aber kann ich gerne posten.
    Debugger ist nen bisschen schwierig weil ich nur die Konsole zum programmieren habe, geht bei dem Projekt grad nicht anders.



  • Gnomecoder schrieb:

    in den 10 zeilen Code die da sind kann man doch sehen ob/wo da Mist gebaut wurde?

    Ja? An welcher stelle kann ich z.B. sehen, ob fft ein Nullpointer ist?

    Gnomecoder schrieb:

    Die Funktion wird permanent aufgerufen, muss da Speicher freigegeben werden?

    Moment, ich schau mal in meine ... Ach, das hatten wir ja schon

    Gnomecoder schrieb:

    Debugger ist nen bisschen schwierig weil ich nur die Konsole zum programmieren habe, geht bei dem Projekt grad nicht anders.

    Wo ist da der Widerspruch?



  • manni66 schrieb:

    Gnomecoder schrieb:

    Debugger ist nen bisschen schwierig weil ich nur die Konsole zum programmieren habe, geht bei dem Projekt grad nicht anders.

    Wo ist da der Widerspruch?

    Da ist kein Widerspruch, die beiden Aussagen hängen einfach nicht zusammen 😃 😉

    Dann stell mal dein Programm (was ja, so wie du sprichst, nicht so groß sein dürfte) insofern um, als dass du nur Container aus der STL nutzt und rohe Zeiger mal komplett rausfliegen. Und bau mal überall Assertions ein.


Anmelden zum Antworten