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

Vue hybride

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut Utiliser un tableau alloué dynamiquement dans une instruction conditionnelle en dehors de cette instruction
    Bonjour,

    Je suis sur un cas de déclaration de tableau qui me dérange.
    Après que mon programme ait lu l'en-tête d'un fichier, il sait si le fichier contient un tableau d'entiers de 2 bytes ou de 4 bytes. Suivant le résultat, il peut allouer dynamiquement l'espace mémoire. Cette allocation se fait dans une instruction switch (ou if). Mais ensuite je ne peux pas utiliser mon tableau en dehors de cette instruction car le compilateur me dit que le tableau que j'essaie de manipuler doit l'être à l'endroit où il est déclaré.
    Est-ce qu'il y a un moyen d'utiliser une méthode semblable à une surdéfinition pour que le pointeur sur le tableau que j'essaie d'utiliser en dehors de l'instruction switch puisse marcher ?

    Code de déclaration ci-dessous :
    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
    switch(TYPE) 
    {
      case 2:
      {
        short int* tab=new short int[size_tab];
        short int* tabtmp=new short int[size_tab];
        break;
      }
      case 4:
      {
        long int* tab=new long int[size_tab];
        long int* tabtmp=new long int[size_tab];
        break;
      }
    }
    Error pour les lignes suivantes en dehors de l'instruction de condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(i=0; i < A; i++)
    {
      for(j=0; j < B; j++)
        tab[A*j+i]=tabtmp[B*i+j];
    }

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Il suffit de déclarer tab et tabtmp avant le switch.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    Il suffit de déclarer tab et tabtmp avant le switch.
    Comment le déclarer avant le switch si je ne connais pas son type avant ? Le type du tableau dépend de la condition. Si le fichier lu informe que le type est '2' alors les elmts du tableau sont des short int ; si c'est '4' alors ce sont des long.
    Je fais truc* tab=new truc[size_tab]; ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ah pardon, j'avais lu un peu trop vite ton message.

    Dans ce cas tu pourrais factoriser tout le code commun dans une fonction template
    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
    template <typename T>
    void fonction(std::size_t size_tab)
    {
        T* tab = new T[size_tab]; // un std::vector<T> serait plus classe
        T* tabtmp = new T[size_tab];
     
        ...
    }
     
    // Ensuite dans ta fonction précédente...
    switch(TYPE) 
    {
      case 2:
        fonction<short int>(size_tab);
        break;
     
      case 4:
        fonction<long int>(size_tab);
        break;
    }

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    Merci pour cette solution. Je fais connaissance avec les templates.
    Bonne journée

    Citation Envoyé par Laurent Gomila Voir le message
    tu pourrais factoriser tout le code commun dans une fonction template
    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
    template <typename T>
    void fonction(std::size_t size_tab)
    {
        T* tab = new T[size_tab]; // un std::vector<T> serait plus classe
        T* tabtmp = new T[size_tab];
     
        ...
    }
     
    // Ensuite dans ta fonction précédente...
    switch(TYPE) 
    {
      case 2:
        fonction<short int>(size_tab);
        break;
     
      case 4:
        fonction<long int>(size_tab);
        break;
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 40
    Par défaut
    Finalement, je n'arrive pas à appliquer ta solution.
    J'ai mis le programme que j'ai fais si dessous contenant ce que j'ai détaillé dans mon 1er message.
    La partie concernant l'appel de la fonction avec templates ne compile pas. (Je mets les erreurs après le code.).
    Il faut déclarer les tabeaux tabA et tabB dans le main mais je vois pas comment avec ce template...

    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
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <new>
    #include <iomanip>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include "read_header.h"
     
    using namespace std;
     
    void initialize(std::size_t size_tabA, std::size_t size_tabB);
     
    template <typename T>
     
    void initialize(std::size_t size_tabA, std::size_t size_tabB)
    {
      T* tabA = new T[size_tabA];
      T* tabB = new T[size_tabB];
    }
     
    int main(int argc, char *argv[])
    {
      string file_in;
     
      long int TYPE, nbheadA, px_i, px_j, px_k;
      string og;
     
      file_in=argv[1];
      read_header(file_in, &TYPE, &nbheadA, &px_i, &px_j, &px_k, &og);
      if (px_k != 1 && og != "jhd") exit (-1);
     
      unsigned long int size_tabA=px_i*nbheadA;
      unsigned long int size_tabB=px_i*px_j;
    //*******************************************************************************
    //Ouverture du fichier en lecture
      ifstream fichier(file_in.c_str(), ios::in);
      if(!fichier.is_open()) exit (-1);
    //*******************************************************************************
      switch(TYPE) 
      {
        case 1:
          initialize<unsigned char>(size_tabA,size_tabB);
          fichier.read(reinterpret_cast<unsigned char*>(*tabA),size_tabA*sizeof(unsigned char));
          fichier.read(reinterpret_cast<unsigned char*>(*tabB),size_tabB*sizeof(unsigned char));
          break;
     
        case 2:
          initialize<unsigned short int>(size_tabA,size_tabB);
          fichier.read(reinterpret_cast<unsigned short int*>(*tabA),size_tabA*sizeof(unsigned short int));
          fichier.read(reinterpret_cast<unsigned short int*>(*tabB),size_tabB*sizeof(unsigned short int));
          break;
      }
      fichier.close();
      delete[] tabA;
      delete[] tabB;
      return (0);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    test.cpp: In function ‘int main(int, char**)’:
    test.cpp:45: erreur: ‘tabA’ was not declared in this scope
    test.cpp:46: erreur: ‘tabB’ was not declared in this scope
    test.cpp:56: erreur: ‘tabA’ was not declared in this scope
    test.cpp:57: erreur: ‘tabB’ was not declared in this scope

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PPT-2010] Tableau Excel dynamique dans une présentation
    Par dream3w dans le forum Powerpoint
    Réponses: 2
    Dernier message: 01/01/2013, 17h46
  2. Rafraichir un tableau croisé dynamique dans une feuille
    Par onejock dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 02/07/2008, 10h18
  3. Réponses: 1
    Dernier message: 19/02/2007, 19h18
  4. Réponses: 1
    Dernier message: 23/06/2006, 11h19
  5. Réponses: 9
    Dernier message: 22/06/2006, 20h06

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