Forum: PC-Programmierung Typkonvertierung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael (Gast)


Bewertung
-1 lesenswert
nicht 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) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank,

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


Gruß Michael

von Vincent H. (vinci)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.