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

Visual C++ Discussion :

[Débutant][Win32] Problème d'allocation de tableau de FILE


Sujet :

Visual C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut [Débutant][Win32] Problème d'allocation de tableau de FILE
    Bonjour à tous,

    Je découvre Visual C++ aujourd'hui avec un programme qui n'avait aucun soucis de compilation sous Linux (compilateur g++). Visual a visiblement un problème avec l'allocation d'un tableau (in_file) qui doit permettre d'accéder à une série de fichiers.

    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
    // Juste pour info ---
    char file_name[1024];
    char** file_name_in;
    file_name_in = (char**) malloc(max_index * sizeof(char*));
    for (ind = 0; ind < max_index; ind++)
      {
        file_name_in[ind] = (char*) malloc(1024 * sizeof(char));
        if (!file_name_in[ind])
          printf("allocation failure for filename array %s",file_name_in[ind]);
          fscanf(fp_feature, "%s", file_name_in[ind]);
      }
    //---
    FILE * in_file[max_index]; // ligne 538 qui pose problème
    for (ind = 0; ind < max_index; ind++)
      {
        sprintf(file_name,"%s", file_name_in[ind]);
        if ((in_file[ind] = fopen(file_name, "rb")) == NULL) // ligne 545
          printf("Could not open input file: %s", file_name);
      }
    Sachant que :
    - max_index est un int lu prédédemment dans un fichier
    - feature_filename est un fichier qui contient les noms complets vers des fichiers de "features"

    Quand je compile, j'obtiens les erreurs suivantes :

    (538) : error C2057: expression constante attendue
    (538) : error C2466: impossible d'allouer un tableau de taille constante 0
    (538) : error C2133: 'in_file'*: taille inconnue

    Du coup, j'ai tenté une autre façon d'allouer mon tableau in_file :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FILE * in_file;
    in_file = (FILE *) malloc(max_index * sizeof(FILE));
    ce qui me génère ces nouvelles erreurs :

    (545) : error C2679: '=' binaire*: aucun opérateur trouvé qui accepte un opérande de partie droite de type 'FILE *' (ou il n'existe pas de conversion acceptable)
    1> c:\program files\microsoft visual studio 8\vc\include\stdio.h(68): peut être '_iobuf &_iobuf::operator =(const _iobuf &)'
    1> lors de la tentative de mise en correspondance de la liste des arguments '(FILE, FILE *)'

    (583) : error C2664: 'fseek'*: impossible de convertir le paramètre 1 de 'FILE' en 'FILE *'
    1> Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    1>e:\svm\src\pspsvm.cpp(584) : error C2664: 'fread'*: impossible de convertir le paramètre 4 de 'FILE' en 'FILE *'
    1> Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé

    La ligne 583 est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fseek(in_file[ind],sizeof(float)*i,SEEK_SET);
    Quelqu'un saurait me dire comment faire pour que ça compile correctement ?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Finalement, j'ai modifié mon code pour ne plus avoir à utiliser file_in comme un tableau, et ça compile. Ca s'exécute même plutôt correctement !

    Par contre, je ne m'explique pas pourquoi ça fonctionnait tel quel sous Linux...

    Enfin, désolée du dérangement !

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    La réponse est simple: On ne peut pas faire un tableau de FILE, vu que rien n'utilise les FILE par valeur.
    fopen() retourne un FILE* et non pas un FILE, donc si tu veux un tableau, tu dois utiliser un tableau de FILE*.
    ...de plus, le nombre de fichiers ouvrables simultanément par un processus est limité.

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    La réponse est même encore plus simple. Les tableaux statiques en Visual nécessitent que la taille soit connue à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MonType mon_tableau[3]; // OK
     
    int ma_taille(recuperer_ma_taille());
    MonType mon_tableau[ma_taille]; // KO
    La solution : passer par un std::vector ou utiliser l'allocation dynamique.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Pas seulement pour Visual, tu sais: C'est le standard C++ (ainsi que C90) qui veut ça.

    Ensuite, il n'est peut-être pas normal que tu compiles en C++, car ce code ressemble fort à un code C (qui nécessiterait le standard C99 en raison des déclarations de variable en milieu de bloc)...

  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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pas seulement pour Visual, tu sais: C'est le standard C++ (ainsi que C90) qui veut ça.
    Sans l'option -pedantic, gcc accepte ce genre de tableau.
    Citation Envoyé par Médinoc Voir le message
    Ensuite, il n'est peut-être pas normal que tu compiles en C++, car ce code ressemble fort à un code C (qui nécessiterait le standard C99 en raison des déclarations de variable en milieu de bloc)...
    Je ne suis pas le PO. Effectivement, tous dans ce code ressemble à du C

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    si tu veux un tableau, tu dois utiliser un tableau de FILE*.
    Citation Envoyé par 3DArchi Voir le message
    Les tableaux statiques en Visual nécessitent que la taille soit connue à la compilation. La solution : passer par un std::vector ou utiliser l'allocation dynamique.
    C'est bien ce que je me disais, vu les messages d'erreur que j'obtenais !

    Citation Envoyé par 3DArchi Voir le message
    Effectivement, tous dans ce code ressemble à du C
    Et, euh... c'est grave si j'utilise un code construit quasi comme en C, mais avec une extension C++ ? Pour info, mon code utilise un autre code qui, lui, est vraiment du C++ ^^"

  8. #8
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Patchanka Voir le message
    Et, euh... c'est grave si j'utilise un code construit comme en C, mais avec une extension C++ ?
    Mélanger les deux langage à au moins deux conséquences à mon avis néfastes :
    1/ Le risque de bug est très accru.
    2/ La maintenance est rendue plus ardu.
    Dans un contexte professionnel, je te demanderais de choisir : C ou C++.
    La seule raison valable est le cas où tu dois interfacer du code C++ (resp. C) avec une bibliothèque offrant une interface en C (resp C++). Auquel cas, j'isolerais le mélange dans une enveloppe adéquate.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 31
    Points : 26
    Points
    26
    Par défaut
    Ok, je vais tâcher de faire attention, alors. J'utilise une bibliothèque C++ avec mon code. De toute façon, je vais devoir remanier pas mal mon code, alors je vais essayer de faire ça proprement en tenant compte des spécificités du C++.

    Merci pour toutes vos précisions en tout cas !

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

Discussions similaires

  1. Problème d'allocation de tableau dynamique
    Par DuffNut dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2011, 11h17
  2. Réponses: 4
    Dernier message: 25/03/2010, 22h11
  3. problème d'allocation de tableau
    Par siempre dans le forum C
    Réponses: 23
    Dernier message: 26/08/2009, 04h05
  4. Réponses: 5
    Dernier message: 06/02/2007, 09h26
  5. Réponses: 19
    Dernier message: 29/06/2006, 13h11

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