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 :

tableau à dimension variable


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    53
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 53
    Par défaut tableau à dimension variable
    bonjour, j'essaye de faire un programme qui r'ealise la transformée d'ADAMAR,
    en fait c'est l'histoire d'une matrice carrée d'ordre 2 puissance n générée à l'aide d'une matrice carée d'ordre 2 puissance n-1.
    voila ma question: comment créer un tableau qui gere ça? j'ai essayé les pointeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int **TabOrdN, **TabOrd2N, ord;
    for(int i=0;i<ord,i++)  for(int j=0;j<ord,j++)
    {
      TabOrd2N[i][j]=TabOrdN[i][j];     TabOrd2N[i+ord][j]=TabOrdN[i][j];
      TabOrd2N[i][j+ord]=TabOrdN[i][j];     TabOrd2N[i+ord][j+ord]= -TabOrdN[i][j];
    }
    mais ca me donne des resultats bizzares ( ╝╝+Ê♣◘○♠♥•,♦☺Ã╚╔┼█)

  2. #2
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    t'as bien sur alloué toutes les cases de tes matrices ?

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    53
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 53
    Par défaut
    c'est justement ça le probleme combien de cases allouer puisque la taille sera variable? je voudrais faire quelque chose de récurrent

  4. #4
    Membre éclairé Avatar de tintin72
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    663
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 663
    Par défaut
    Salut,

    Je ne connais pas cet algoritme mais là déjà
    les 2 boucles for cote à cote c pas trop bon, de même
    que les déréférencement ??? des pointeurs.
    Je suis d'ailleur étonné que ça compile!
    Essaies plutôt un truc comme ça;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int **TabOrdN, **TabOrd2N, ord;
    for(int i=0;i<ord,i++)  
    {
      TabOrd2N[i][j]=TabOrdN[i][j];     
      TabOrd2N[i][j+ord]=TabOrdN[i][j];    
     
      for(int j=0;j<ord,j++)
      {
       TabOrd2N[i+ord][j]=TabOrdN[i][j];
       TabOrd2N[i+ord][j+ord]= -TabOrdN[i][j];
      }
    }
    je ne sais pas si c'est l'algo que tu cherche mais c plus clair.
    Pour ce qui est des tableau redimensionnables je te conseillerais
    d'utiliser plutôt les vector de la stl, il y aura moins de risque d'erreurs.

  5. #5
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par tintin72
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int **TabOrdN, **TabOrd2N, ord;
    for(int i=0;i<ord,i++)  
    {
      TabOrd2N[i][j]=TabOrdN[i][j];     
      TabOrd2N[i][j+ord]=TabOrdN[i][j];    
     
      for(int j=0;j<ord,j++)
      {
       TabOrd2N[i+ord][j]=TabOrdN[i][j];
       TabOrd2N[i+ord][j+ord]= -TabOrdN[i][j];
      }
    }
    vous faites un concours la c'est ça ?

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Décembre 2005
    Messages
    53
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2005
    Messages : 53
    Par défaut
    je crois que ton algo fais la meme chose, c'est vrai que c'est plus clair, je vais essayer avec stl, merci..

  7. #7
    Membre éclairé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Par défaut
    Citation Envoyé par akfp85
    je crois que ton algo fais la meme chose, c'est vrai que c'est plus clair, je vais essayer avec stl, merci..
    tu rigoles ? il n'a plus rien a voir, et surtout j est déclaré dans la deuxieme boucle.. C'est n'importe quoi ce qu'il a mis !

    enfin bon, un type matrice c'est quand meme pas compliqué a réaliser si ?
    si tu fais un int** TU DOIS L'ALLOUER, sinon ça saute.

    je te conseille de prendre des cours sur les bases des pointeurs avant de te lancer dans tes calculs de matrice

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Des réponses groupées...

    Citation Envoyé par akfp85
    en fait c'est l'histoire d'une matrice carrée d'ordre 2 puissance n générée à l'aide d'une matrice carée d'ordre 2 puissance n-1.
    voila ma question: comment créer un tableau qui gere ça? j
    boost.uBLAS, Blitz++, MTL, newMat, ... comme d'hab quoi.

    Pour les tableaux "rectangulaires" (pas matrices) -> boost.multi_array

    Pour les tableaux "irréguliers" -> std::vector<std::vector<T> >

    Pour les exercices -> cerveau - crayon - papier

    La FAQ C (qui en plus ne gère pas les cas d'erreurs) pour gérer ces structures, c'est moyen ... en C++.

    tu peux toujours réallouer avec realloc
    Attention, realloc() est vicieux, si ça foire, cela retourne 0. Et il ne faut pas oublier de libérer la mémoire en passant par des temporaires...


    Une fonction récursive est une fonction qui s'appelle...


    @ Koala. Ton premier code à-la-C présente plusieurs problèmes
    - il peut fuir si une erreur d'allocation survient en cours de redimensionnement
    - Il fuit car sa libération de la structure initiale est partielle.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par Luc Hermitte
    <snip>

    Une fonction récursive est une fonction qui s'appelle...
    Je voulais dire par là qu'elle pouvait tres facilement etre transformée en récursive si besoin était... j'aurais du le dire différemment (mea maxima culpa )

    Citation Envoyé par Luc Hermitte
    @ Koala. Ton premier code à-la-C présente plusieurs problèmes
    - il peut fuir si une erreur d'allocation survient en cours de redimensionnement
    - Il fuit car sa libération de la structure initiale est partielle.
    De fait... Je mets correction ici, pour laisser la pertinence à ta remarque (mais où avais-je la tete :oops )

    Par contre, en relisant le code (qui n'avait pas été testé à la compilation, je viens, en plus, de remarquer quelques erreurs de syntaxe que je corrige partout
    Code C++ : 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
    int** Agrandit(int** depart)
    {
        try
        {
            int** tempo=new int*[taille+1];
            for(int i=0;i<taille;i++)
            {
                 //allocation des colone, puis copie des éléments déjà connus
                 tempo[i]=new int[taille+1]
                 for(int j=0;j<taille;j++)
                 {
                     tempo[i][j]=depart[i][j];
                 }
                 //déclaration de l'élément surnumeraire pour la ligne envisagée
                 tempo[i][taille]= whatyouwant;
            }
        }
        //pour récupérer les différentes erreurs qui auraient pu survenir
        //(principalement les erreurs d'allocation)
        catch(...)
        {
             //l'affichage d'un message pourrait etre sympa, vraissemblablement
             // au travers de stc::cerr...
             // renvoie la matrice non modifiée
             return depart;
    //NOTA: typiquement, new renvoie une exception de type 
    // std::bad_alloc(), que l'on pourrait utiliser dans le catch 
    // (sous la forme decatch(std::bad_alloc &e) ) mais il faut alors penser à 
    //inclure le fichier d'entete <stdexcept>
        }
        // libération de la mémoire utilisée par la matrice de départ AVANT de
        // perdre l'adresse mémoire à laquelle elle commence
        for(int i=0;i<taille;i++)
        {
            //D'abord les colones
            int* supress=depart[i];
            delete[] suppress;
        }
        //puis les lignes
        delete[] depart;
        ++taille;
        return tempo;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Sauf que si c'est la première allocation qui produit une erreur, il faut pas libérer toutes les autres.
    Le plus simple est de loin d'utiliser std::vector<int>.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Bonjour,

    et qu'est ce qu'en pense l'autur du message de toutes ces réponses ?

    Au départ j'avais suggéré des réponses en utilisant des fonctions C, car le code donné laissait sous-entendre un besoin de comprendre ce qu'était l'allocation de tableaux 2D, et les pointeurs ...
    avant de passer à l'utilisation des librairies C++, et des tableaux vector ...

    Mais bon ... peut être me suis-je trompé ?
    C'est clair que les vector seraient une bonne solution.

    @+

Discussions similaires

  1. tableau de dimension variable
    Par kapaty dans le forum C
    Réponses: 6
    Dernier message: 05/03/2010, 00h00
  2. Réponses: 11
    Dernier message: 11/06/2008, 18h05
  3. tableau à dimension variable
    Par bubuche87 dans le forum Débuter
    Réponses: 6
    Dernier message: 20/11/2007, 20h21
  4. tableau à dimension variable
    Par dnmfaw dans le forum Débuter
    Réponses: 5
    Dernier message: 10/09/2007, 18h09
  5. [débutant] un tableau de dimension variable selon l'objet qui le contient
    Par Epistocles dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 09/01/2007, 18h07

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