Forum: PC-Programmierung Typkonvertierung


von Michael (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit einer Konvertierung.
mein funktionierendes Beispiel sieht so aus:



1
typedef std::complex<double> Complex;
2
typedef std::valarray<Complex> CArray;
3
4
const Complex test[] = { 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 };
5
CArray data(test, 8);

ich möchte nun gern Daten aus einem Array vom Typ int konvertieren, 
damit ich dynamische Daten hier verarbeiten kann.

Leider ist das Ergebnis immer 0:
1
int do_fft(int* daten,int points)
2
{
3
    Complex *f_arr;
4
5
    f_arr=(Complex*)malloc((points+1)*sizeof(Complex));
6
    if(f_arr==NULL)
7
      {
8
        cerr << "Kein Ram vorhanden"<<endl;
9
        exit(1);
10
      }
11
    int i=0;
12
13
    //Float Werte erzeugen
14
15
    for(i=0;i<points;i++)
16
    {
17
      *f_arr=*daten*1.0;
18
      f_arr++;
19
      daten++;
20
    }
21
22
23
24
    const Complex test[] = { 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 };
25
    //CArray data(test, 8);
26
    //CArray data(*f_arr, points);
27
     CArray data((Complex*)daten, points);
28
}
Ich habe es mit allesn drei Varianten (Die letzten drei Zeilen im Code) 
getestet, es funktioniert nur mit den Konstanten.
Wäre nett wenn jemand hier helfen könnte.

Dank und Gruß Michael

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Michael schrieb:
> f_arr=(Complex*)malloc((points+1)*sizeof(Complex));

Du verwendest C++. Was soll da malloc?
1
f_arr = new Complex[points + 1];

Michael schrieb:
> const Complex test[] = { 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0 };

Wieviele Elemente hat das Array? Nein, das dürften nicht 8 sein.

von Dirk B. (dirkb2)


Lesenswert?

Michael schrieb:
> //CArray data(*f_arr, points);

Kann da der Dereferenzierungsoperator zuviel sein.
Allerdings ist zu diesem Zeitpunkt der Bereich auf den f_arr dann zeigt 
ungültig.

Du solltest niemals den Zeiger, der eine Rückgabe von malloc speichert, 
verändern. Bzw erst dann, wenn das free() dazu gemacht wurde.

von Michael (Gast)


Lesenswert?

Vielen Dank,

jetzt habe ich dank der Unterstützung einen Weg gefunden.


Gruß Michael

von Vincent H. (vinci)


Lesenswert?

Ich versteh das Problem nicht? std::complex besitzt folgenden 
Konstruktur:
1
complex( const T& re = T(), const T& im = T() );

Das heißt
1
auto c = complex(42.0);

compiliert ohne dass man einen Imaginärteil angeben muss.

Und nachdem sich int impliziet nach double konvertieren lässt geht auch 
folgendes
1
auto c = complex(42);


Und damit lässt sich in Folge etwa copy_n nutzen und man landet bei 
einem Einzeler -> https://godbolt.org/z/4C_oky

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.