IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[débutant]Problème de compatibilité de format tableau


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut [débutant]Problème de compatibilité de format tableau
    Bonjour,
    Je suis débutante et je travaille sur un projet de traitement d'un fichier .wav sur VC++ 2008.
    J'ai un problème de compatibilité entre le vecteur reçu à la sortie d'openAL et le format sous lequel je calcule mon spectre. J'ai essayé plusieurs choses mais ça ne fonctionne pas.
    Le type à la sortie d'openAL est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<ALshort>
    et le type pris en compte par ma fft est:J'ai essayé de placer les valeurs dans un tableau de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int n=0;
    	n= B.sampling(n);
    	float *tab1=0.f;
    	int i=0;
     
    for (i=0; i=n; i++)
    {
     
    	tab1[i]=Samples[i];
     
    }
    mais j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     error C2440: 'initializing' : cannot convert from 'float' to 'float *'
    Avez vous des suggestions?
    Merci
    Cdlt
    Gate35

  2. #2
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Y a rien qui te choque ici ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut Re
    Je devrais?Ah oui l'allocation de toute la liste c'est ça ?je l'initialise comment alors?Désolée je débute et c'est dur!
    Merci

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    En outre, je rajouterais que probablement ton autre interface attend un float* car elle attend un tableau (avec certainement une taille associée ?). En ce cas, tu n'as pas besoin de convertir tes données, mais tu peux t'appuyer sur &Samples[0] car std::vector te garantie que les données se suivent.
    Quelle est la déclaration de la fonction fft où tu veux injecter tes données ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    La déclaration de la fft est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int Processing :: fft1d( float *a,  int n, int isgn )

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Donc il est probable que tu puisse faire un appel du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ton_objet.fft1d( &Samples[0],  Samples.size(), ??? )
    En gros, ne pas faire de recopie de std::vector<float> vers un float* dynamique.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    En m'appuyant sur J'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     error C2664: 'Processing::fft1d' : cannot convert parameter 1 from 'short *' to 'float *'

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    après avoir relu votre réponse précédente j'ai remis en float et j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     error C2664: 'SaveSound' : cannot convert parameter 2 from 'float *' to 'const std::vector<_Ty> &'
    1>        with
    1>        [
    1>            _Ty=float
    1>        ]
    1>        Reason: cannot convert from 'float *' to 'const std::vector<_Ty>'
    1>        with
    1>        [
    1>            _Ty=float
    1>        ]
    1>        No constructor could take the source type, or constructor overload resolution was ambiguous

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Quelle est l'interface de SaveSound ? Elle a l'air de prendre un std::vector. Auquel cas pas besoin de passer par &Samples[0].
    &Samples[0] te retourne un float* (si Samples est de type std::vector<float>) sur le premier élément du tableau contenu dans Samples. Si tu as une interface 'C' qui demande des (float *, int), alors tu peux utiliser (&Samples[0], Samples.size()). En revanche, si ton interface demande des std::vector, alors utilises directement Samples.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    Elle prend effectivement un std::vector mais lorsque j'utilise Samples j'ai alors:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    error C2664: 'Processing::fft1d' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'float *'
    1>        with
    1>        [
    1>            _Ty=float
    1>        ]
    1>        No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    Code de SaveSound:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void SaveSound(const std::string& Filename, const std::vector<ALshort>& Samples)
    {
        // On renseigne les paramètres du fichier à créer
        SF_INFO FileInfos;
        FileInfos.channels   = 1;
        FileInfos.samplerate = 44100;
        FileInfos.format     = SF_FORMAT_PCM_16 | SF_FORMAT_WAV;
     
        // On ouvre le fichier en écriture
        SNDFILE* File = sf_open(Filename.c_str(), SFM_WRITE, &FileInfos);
        if (!File)
        {
            std::cerr << "Impossible de créer le fichier audio" << std::endl;
            return;
        }
     
        // Ecriture des échantillons audio
        sf_write_short(File, &Samples[0], Samples.size());
     
        // Fermeture du fichier
        sf_close(File);
    }
    Merci

  11. #11
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Si tu as une interface 'C' qui demande des (float *, int), alors tu peux utiliser (&Samples[0], Samples.size()). En revanche, si ton interface demande des std::vector, alors utilises directement Samples.
    Donc ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    void SaveSound(const std::string& Filename, const std::vector<float>& Samples)
    {
        // On renseigne les paramètres du fichier à créer
        SF_INFO FileInfos;
        FileInfos.channels   = 1;
        FileInfos.samplerate = 44100;
        FileInfos.format     = SF_FORMAT_PCM_16 | SF_FORMAT_WAV;
     
        // On ouvre le fichier en écriture
        SNDFILE* File = sf_open(Filename.c_str(), SFM_WRITE, &FileInfos);
        if (!File)
        {
            std::cerr << "Impossible de créer le fichier audio" << std::endl;
            return;
        }
     
        // Ecriture des échantillons audio
        sf_write_float(File,&Samples[0], Samples.size());
     
        // Fermeture du fichier
        sf_close(File);

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    excusez moi j'ai changé en cours de route désolée

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    Mais les erreurs sont toujours là
    Elle prend effectivement un std::vector mais lorsque j'utilise Samples j'ai alors:
    Code :
    error C2664: 'Processing::fft1d' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'float *'
    1> with
    1> [
    1> _Ty=float
    1> ]
    1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
    Code de SaveSound:
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    void SaveSound(const std::string& Filename, const std::vector<float>& Samples)
    {
        // On renseigne les paramètres du fichier à créer
        SF_INFO FileInfos;
        FileInfos.channels   = 1;
        FileInfos.samplerate = 44100;
        FileInfos.format     = SF_FORMAT_PCM_16 | SF_FORMAT_WAV;
     
        // On ouvre le fichier en écriture
        SNDFILE* File = sf_open(Filename.c_str(), SFM_WRITE, &FileInfos);
        if (!File)
        {
            std::cerr << "Impossible de créer le fichier audio" << std::endl;
            return;
        }
     
        // Ecriture des échantillons audio
        sf_write_float(File, &Samples[0], Samples.size());
     
        // Fermeture du fichier
        sf_close(File);
    }

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Je ne vois pas Processing::fft1d dans le code que tu montres ?

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    C'est un vector<short> qu'elle a, pas un vector<float>, donc une conversion semble nécessaire... Et je doute fort qu'un simple cast soit ce qui convient. Il y a probablement un facteur d'échelle à appliquer quelque part.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    L'appel de fft1 se fait depuis une classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void Processing:: ampspec(float* real,float* amp, int n)
    {
    	Processing B;
    	int i,j;
     
     
    	;
     
    	for(i=0; i<n; i++)
     
     
    	i=B.fft1d(real,n,-1);
     
    	if(i==-1)
    	{
    		printf("\nInsufficient memory.\n");
    	}
    	else
    	{
    		for(j = 0; j < n ; j++)
    			amp[j] = (float)(2*abs(i*(1+real[j])));
    	}
     
    }

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    et le Processing::fft1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    int Processing :: fft1d( float *a,  int n, int isgn )
    {
      int l,l1,l2,j,jj,i,ii,k,nh,nm;
      float *cr;
      float den,p,q;
      float ur,vr,wr,urtemp;
      float pi,x;
    	float nf =(float)(n);
     
      /* traduction de éléments du tableau */
     
      a--;
     
     
     
     
      /* Alloue un espace pour le tableau de travail.                                        */
     
      if ((cr=(float *)malloc(nf*sizeof(float)))==NULL) return(-1);
     
     
      /* translate l'origine des tableaux de travail*/
     
      cr--;
     
     /*Transformée inverse et directe*/ 
     
      if ( isgn < 0 )
        den=1.0;
      else
        den=(float)(n);
     
    /*constantes de mise à jour*/
     
      pi = (float)(4.0 * atan( 1.0 ));
      p = (float)(n);
      q = (float)(log( p ) / log( 2.0 ));
      k = (int)(q);
      nh = n/2;
      nm = n-1;
     
     /*routine d'inversion des bits*/
     
      for ( i=nh+1, j=1; i<=n; i++, j++ )
        {
        cr[j] = a[i];
     
        }
     
      for ( i=1; i<=nh; i++, j++ )
        {
        cr[j] = a[i];
     
        }
     
      for ( i=1, j=1; i<=nm; i++ )
        {  
        if ( i < j )
          {
     
          vr = cr[j];
     
          cr[j] = cr[i];
     
          cr[i] = vr;
     
          }
        jj = nh;
        while ( jj < j )
          { 
          j -= jj;
          jj = jj/2;
          }
     
        j += jj;
        }
     
     
     /*Transformée de Fourrier rapide*/
     
      for ( l=1; l<=k; l++ )
        {
        l1 = (int)(ldexp( 1.0, l ));
        x = (2 * pi * (float) isgn) / (float)(l1);
        wr = (float)(cos( x ));
     
        l2 = l1/2;
        ur = 1.0;
     
        for ( j=1; j<=l2; j++ )
          {
     
          for ( i=j; i<=n; i+=l1 )
            {
            ii = i + l2;
            vr = (cr[ii] * ur );
     
            cr[ii] = cr[i] - vr;
     
            cr[i] = cr[i] + vr;
     
            }
     
          urtemp = ur;
          ur = (ur * wr) ;
     
          }
        }
     
      /*Echelle de sortie dépendant des transformées inverse ou directe*/
     
      for ( i=1; i<=n; i++ )
        {
        cr[i] = cr[i] / den;
     
        }
     
      for ( i=nh+1, j=1; i<=n; i++, j++ )
        {
        a[j] = cr[i];
     
        }
     
      for ( i=1; i<=nh; i++, j++ )
        {
        a[j] = cr[i];
     
        }
     
      /* Espace libre du tableau de travail.*/
     
      cr++;
     
      free( cr );
     
     
      a++;
     
      return(1);
    }

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    Pourriez vous développer à propos du facteur d'échelle s'il vous plais?

    Merci

  19. #19
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    On reprend depuis le début. Dans tout le code que tu développes, tu devrais te trimballer qu'avec des std::vector. Ce serait uniforme, résoudrait tes conversions et t'éviterais les affreuses lignes que j'ai vues (malloc/free). Ensuite, quand tu utilises une bibliothèques externes : soit elle accepte un std::vector et auquel cas pas de problème. Soit elle offre une interface à la C avec un tableau et tu utilises &[0] avec size().
    Ensuite, comme dit JolyLoic, fais attention à ce que tu manipules : non seulement le type est important pour la compilation mais tu dois veiller à ce que tu manipules aie un sens par rapport à ce que tu fais (la représentation des données est cohérente avec les algos que tu appliques).

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 73
    Par défaut
    Ok désolée merci je vais essayer de reprendre avec que des std::vector...

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/05/2011, 14h38
  2. Problème de compatibilité tableau
    Par jmjmjm dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 29/05/2006, 17h55
  3. [Débutant] Problème de création et de remplissage de tableau
    Par pinggu dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 24/05/2006, 16h50
  4. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 13h00
  5. Réponses: 11
    Dernier message: 02/09/2003, 15h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo