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 :

retourner un double tableau


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Par défaut retourner un double tableau
    bonjour à tous, j'ai un petit soucis pour retourner un tableau à 2 dimensions, afin de l'utiliser dans une autre fonction. Voici mon mon 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    int ** init_spectre(int N, int P)
    {	
     
    	int * signal_discret = new int[N]; 
    	delete [] signal_discret;
     
    	int i,i2,j,k;
    	for (i=0;i<N;i++)
    	{
    		i2=i;
    		j=0;
     
    		for(k=1;k<=P;k++)
    		{
    			j=j<<1;
    			j=j|(i2&1);
    			i2=i2>>1;
    		}	
    	cout << "i=" << i2 << " et j=" << j << endl;
     
     
    	vector<vector<int> >spectre(N, vector<int>(2));  
     
    	spectre[j][0] = 0;   
        spectre[j][1] = 0;   
     
        cout << "spectre[" << j << "][0]=" << spectre[j][0] << endl;   
        cout << "spectre[" << j << "][1]=" << spectre[j][1] << endl;   
     
    	}
     
    	return ** spectre;
    }
    je ne vois pas ou est mon erreur...
    merci pour votre aide

  2. #2
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    En déclarant ton tableau ainsi, il sera détruit a la fin de la fonction car concidéré comme une variable locale à ta fonction.

    - Tu peux créer ton tableau avec new (mais attention au delete quand tu ne te sert plus de ton tableau)
    - Tu peux utilisé des SmartPointers (la pas de souci)
    - Tu peux créer ton tableau avant ta fonction et le passér par référence en paramètre (la il ne sera pas détruit)

    Voila

  3. #3
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut Re: retourner un double tableau
    Citation Envoyé par miminou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	int * signal_discret = new int[N]; 
    	delete [] signal_discret;
    Heu ... ca sert à quoi ca ?

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Par défaut
    en fait, je dois mettre 2 tableau en paramètre, donc un que je recupere d'un fichier wave, et un que je dois retourner ds une autre fonction pour pouvoir faire sa FFT. comment marche le SmartPointer?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Par défaut
    et comment puis-je déclarer mes 2 tableaux (signal_discret et spectre) en ne sachant pas la taille qu'ils font, en mettant une variable N qui serait déterminé selon la taille du fichier wave?

  6. #6
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Citation Envoyé par miminou
    et comment puis-je déclarer mes 2 tableaux (signal_discret et spectre) en ne sachant pas la taille qu'ils font, en mettant une variable N qui serait déterminé selon la taille du fichier wave?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<vector<int> >spectre;
    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
    void init_spectre(int N, int P, vector<vector<int>> &spectre)
    {   
     
       int * signal_discret = new int[N];
       delete [] signal_discret;
     
       int i,i2,j,k;
       for (i=0;i<N;i++)
       {
          i2=i;
          j=0;
     
          for(k=1;k<=P;k++)
          {
             j=j<<1;
             j=j|(i2&1);
             i2=i2>>1;
          }   
       cout << "i=" << i2 << " et j=" << j << endl;
     
     
       spectre.resize(N, vector<int>(2)); 
     
       spectre[j][0] = 0;   
        spectre[j][1] = 0;   
     
        cout << "spectre[" << j << "][0]=" << spectre[j][0] << endl;   
        cout << "spectre[" << j << "][1]=" << spectre[j][1] << endl;   
     
       }
    }
    Pour les smartpointers, je pense que le mieux c'est t'utiliser le bibliotheque Boost.

  7. #7
    Membre chevronné
    Profil pro
    Enseignant
    Inscrit en
    Avril 2004
    Messages
    440
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2004
    Messages : 440
    Par défaut
    Il y a quelques confusions...

    Déjà, si tu crées un vector<vector<int>>, alors c'est plus simple de retourner cet objet plutôt qu'un double pointeur dessus (c'est surtout plus faux que plus simple en fait)... Je crois que tu confonds les pointeurs et la classe vector qui remplace les pointeurs... Donc un return spectre; suffit...

    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
     
    vector<vector<int>>  init_spectre(int N, int P)
    {   
     
       //?????????????????????????????? 
       int * signal_discret = new int[N];
       delete [] signal_discret;
       // Fin ??????????????????????????
     
     
       for (int i=0;i<N;i++)
       {
          int i2 = i;
          int j = 0;
     
          for(int k=1;k<=P;k++)
          {
             j = j << 1;
             j = j| (i2 & 1);
             i2 = i2 >> 1;
          }   
       cout << "i = " << i2 << " et j = " << j << endl;
     
     
       vector<vector<int> >spectre(N, vector<int>(2)); 
     
       spectre[j][0] = 0;   
       spectre[j][1] = 0;   
     
        cout << "spectre[" << j << "][0]=" << spectre[j][0] << endl;   
        cout << "spectre[" << j << "][1]=" << spectre[j][1] << endl;   
     
       }
     
       return spectre;
    }
    A+

  8. #8
    Membre Expert
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Par défaut
    je t'avoue que j'ai pas tout pigé sur ton code mais tu peux passer en parametre les references de tes tableaux :

    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
     
    bool init_spectre(vector<vector<int> > & spectre), int P) 
    {    
     
    if( !spectre.size() )
    return false;
     
       int * signal_discret = new int[spectre.size()]; 
       delete [] signal_discret; 
     
       int i,i2,j,k; 
       for (i=0;i<spectre.size();i++) 
       { 
          i2=i; 
          j=0; 
     
          for(k=1;k<=P;k++) 
          { 
             j=j<<1; 
             j=j|(i2&1); 
             i2=i2>>1; 
          }    
       cout << "i=" << i2 << " et j=" << j << endl; 
     
     
     
       spectre[j][0] = 0;    
       spectre[j][1] = 0;    
     
        cout << "spectre[" << j << "][0]=" << spectre[j][0] << endl;    
        cout << "spectre[" << j << "][1]=" << spectre[j][1] << endl;    
     
       } 
     
    return true;
     
    }
    et tu appelles ta fonction comme ca :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    vector<vector<int> > spectre(N, vector<int>(2);
     
    if( init_spectre(spectre, P) )
    // OK
    else
    // pas OK

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut Re: retourner un double tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int ** init_spectre(int N, int P)
    je ne pense pas que vector<vector<int> > correpond a int **.
    utilise plustot un tableau.
    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
     
    {	
     
    	int * signal_discret = new int[N]; 
    	delete [] signal_discret;
     
    	int i,i2,j,k;
    	for (i=0;i<N;i++)
    	{
    		i2=i;
    		j=0;
     
    		for(k=1;k<=P;k++)
    		{
    			j=j<<1;
    			j=j|(i2&1);
    			i2=i2>>1;
    		}	
    	cout << "i=" << i2 << " et j=" << j << endl;
     
     
    	vector<vector<int> >spectre(N, vector<int>(2));
    ton spectre sera detruit en sortie de ta fonction car il n'est pas dynamique.
    vector<vector<int> >spectre(N, vector<int>(2)) est ici une variable local.
    faut que tu utilise un new.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	spectre[j][0] = 0;   
        spectre[j][1] = 0;   
     
        cout << "spectre[" << j << "][0]=" << spectre[j][0] << endl;   
        cout << "spectre[" << j << "][1]=" << spectre[j][1] << endl;   
     
    	}
     
    	return ** spectre;
    }

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Par défaut
    en fait, voici mon algo:

    void init_spectre (float signal_disret[N], float spectre [N][2])
    fonction qui initialise les 2 tableaux.
    signal_discret : valeur cherchée ds un fichier wave
    spectre : initialisé a 0

    comment je fais?

    merci a tous

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Par défaut
    petite précision:
    le 1er tableau, je l'utilise dans une autre fonction qui effectue un calcul de FFT (d'ou le fait que je veuille le retourner) et le 2e est mon résultat

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void init_spectre (float signal_disret[N], float spectre [N][2])
    A noter que N n'est pas signifiant, donc tu dois passer cette valeur en argument.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void init_spectre (float signal_disret[], float spectre [][2], int N)
    {
    ....
     for (int i = 0; i<N;i++)
       spectre[i][0] =spectre[i][1] =0;
    ....
    Tes deux tableaux doivent être créés avant l'appel de la fonction et simplement passés en argument de la fonction. Ce sont les tableaux d'origine qui seront ainsi modifiés.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 56
    Par défaut
    mais dans ce cas la comment je recupere mon tableau dans une autre fonction pour effectuer ma fft?

Discussions similaires

  1. Réponses: 7
    Dernier message: 27/04/2009, 19h12
  2. passage par parametre d'un double tableau
    Par nakac dans le forum C
    Réponses: 2
    Dernier message: 21/12/2008, 03h27
  3. Zend_BD->query() ne retourne pas un tableau d'objets
    Par Jokaritaff dans le forum Zend_Db
    Réponses: 6
    Dernier message: 04/06/2008, 12h14
  4. public static []tableau (double []tableau) ?
    Par rXpCH dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 29/02/2008, 08h34
  5. Réponses: 1
    Dernier message: 27/04/2007, 13h56

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