Typkonvertierung



  • Hallo,
    ich habe das Problem, das ich eine Typkonvertierung duchfuehren muss, und nicht so recht weiss, ob ich das richtig mache. Ich habe da so meine Zweifel, denn soetwas habe ich bislang noch nicht programmiert.
    Ich muss einen Satz von float-Daten aus einer Datei lesen. Dazu habe ich
    dieses 'Array' definiert.

    float* ampl= (float*) malloc(sizeof(float)*mm);

    Fuer eine spaetere Anwendung benoetige ich die Daten allerdings als double, weshalb ich versuche, sie mittels

    double* Ampl= (double*) malloc(sizeof(double)mm);
    Ampl= reinterpret_cast<double
    >(ampl);

    zu konvertieren. die Variable Ampl soll dabei ein neues 'Array' bezeichnen.
    Beim Kompilieren bekomme ich keinen Fehler, allerdings kann ich zur Zeit noch nicht testen, ob das Programm das macht, was es soll.

    Waere schoen, wenn mir jemand helfen koennte. Danke!



  • [quote="neruda"]
    float* ampl= (float*) malloc(sizeof(float)*mm);
    [quote]

    Schlecht, mach gleich

    double* ampl = new double[mm]; // <- Das ist C++
    

    und fülls dann mit:

    ampl[i] = reinterpret_cast<double> your_float;
    


  • Danke soweit, aber wenn ich nun

    float* ampl= new float[mm];
    ...
    double* Ampl= new double[mm];
    for(i=1; i<mm; i++)
    {
    Ampl[i]= reinterpret_cast<double*>(ampl[i]);
    }

    eingebe, erhalte ich als Fehlermeldung beim Compilieren:

    error: invalid reinterpret_cast from type `float' to type `
    double*'

    Was habe ich denn jetzt schon wieder falsch gemacht?

    Nur des Interesses halber: War meine alte Version falsch oder einfach nur schlachter bzw.veralteter Programmierstil



  • Darum gibt's in meinem Post das *chen nicht, welches du verwendest, also nochmal:

    [cpp]ampl[i] = reinterpret_cast<double**/*NO * HERE*/**> your_float;[/cpp]



  • Warum willst du denn das Zeugt erst in einen Float* einlesen und nacher in einen Double* pressen? Macht für mich erst mal wenig Sinn.

    Und ist sowas erlaubt:

    int lowercase;
    int Lowercase;
    

    Selbst wenns erlaubt ist sollte man sowas nie machen!

    an deiner Stelle mach doch bitte

    float* ampl_f
    double* ampl_d
    

    Dann blickt auch noch jemand durch!



  • malloc() und co gehoert mehr in die Sparte C, unter C++ nimmt man new/delete. Ist also eine Frage des Stils und der Kompatibilitaet/des Standards.

    Macht ein reinterpret cast nicht einfach nur, dass das Programm die Daten unter dem Pointer als was anderes ansieht? Wenn ich floats in doubles umwandeln will muss ich doch die Daten im Speicher aendern, zum einen weil double ja doppelt so viel Platz braucht und ganz anders aufgebaut ist (bias/mantisse/...).

    Mein Ansatz

    float* ampl= new float[mm];
    ...
    double* Ampl= new double[mm];
    for(i=0; i<mm; i++)
    {
      Ampl[i]= (double)(ampl[i]);
    }
    

    wuerde doch sogar ohne (double) gehen, weil ich ja ein "upgrade" mache, der compiler da also auch keine Warnung werfen sollte.

    EDIT: Deine Schleife sollte bei 0 starten, nicht bei 1, sonst fehlt das erste Element 😉



  • Gast221212 schrieb:

    Und ist sowas erlaubt:

    int lowercase;
    int Lowercase;
    

    Jupp, aber kein guter Stil. Da Variablen case-sentitive sind koenntest du 2^n Variablen aus einem Wort erzeugen, aber das ist SEHR boese 😉

    so far

    Phil



  • pli schrieb:

    Macht ein reinterpret cast nicht einfach nur, dass das Programm die Daten unter dem Pointer als was anderes ansieht? Wenn ich floats in doubles umwandeln will muss ich doch die Daten im Speicher aendern, zum einen weil double ja doppelt so viel Platz braucht und ganz anders aufgebaut ist (bias/mantisse/...).

    Ich seh schon, hier diskutieren zwei Ahnungslose (Du und Ich). Aber was macht wohl das reinterpret in

    [cpp]reinterpret_cast[/cpp]

    ich dachte immer,

    int x = (int) double;
    

    würde nicht Neuinterpretieren sondern dem Compiler sagen ich weiß schon was ich mach...



  • Gast221212 schrieb:

    pli schrieb:

    Macht ein reinterpret cast nicht einfach nur, dass das Programm die Daten unter dem Pointer als was anderes ansieht? Wenn ich floats in doubles umwandeln will muss ich doch die Daten im Speicher aendern, zum einen weil double ja doppelt so viel Platz braucht und ganz anders aufgebaut ist (bias/mantisse/...).

    Ich seh schon, hier diskutieren zwei Ahnungslose (Du und Ich). Aber was macht wohl das reinterpret in

    [cpp]reinterpret_cast[/cpp]

    ich dachte immer,

    int x = (int) double;
    

    würde nicht Neuinterpretieren sondern dem Compiler sagen ich weiß schon was ich mach...

    Genau anders herum!

    http://www.dd.bib.de/~dozric/C++/kennen/keywords.htm#reinterpret_cast schrieb:

    C++ seit 1998 (ISO-Standard 14882) : Ein reinterpret_cast ist eine auffällige Form eines Typecast, mit dem die Bitfolge eines Ausdruckswertes völlig anders interpretiert wird.

    http://www.math.uni-wuppertal.de/~axel/skripte/oop/oop4_2.html schrieb:

    Mit reinterpret_cast<T>(a) wird die Typüberprüfung von C++ ganz ausgeschaltet. Zeiger können als ganze Zahlen interpretiert werden und umgekehrt, jeder Zeigertyp kann in jeden anderen konvertiert werden. Durch beliebige Uminterpretation der physikalischen Darstellung der Typen kann man so viel Unsinn anstellen.

    mit nem reinterpret_cast sagst du dem compiler, nimm das was da im speicher steht als das was ich dir sage, ich weiss, was ich tue. der klassische (...) cast hingegen funktioniert nur, wenn der compiler weiss, wie man Typ A in B umwandelt.



  • Ich glaube, ich habe kurzzeitig einfach nur den Ueberblick mit meinem Programm verloren. Zunaechst dachte ich ja, ich wuerde meine Daten als float einlesen muessen, weil sie mir mein Oszilloskop so aufnimmt. Anschliessend muesste ich sie in double konvertieren, weil ich mit ihnen ein Fast Fourier Trafo machen will, und FFTW eben double verlangt.
    Aber ich habe mir meinen Programm-Code noch einmal genauer angesehn, vielmehr eher mein Oszilloskos. Das speichert die Daten sogar nur als char ab. also kann ich sie genausogut gleich als double auslesen, also einfach eine automatische Typumwandlung vornehmen. Ich hoffe mal, dass das klappt.

    Immerhin: ich habe jetzt alle malloc durch new ersetzt. Man will ja mit der Zeit gehen


Anmelden zum Antworten