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

MFC Discussion :

[VC]Portée des variables et limites des tableau


Sujet :

MFC

  1. #1
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut [VC]Portée des variables et limites des tableau
    Je m'explique :

    j'ai une fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ReadJPEG()
      {
      FILE *JpgFic = fopen("C:\\FicTest.jpg", "rb);
      if(JpgFic)
        {
        unsigned char Buffer [Width*Heigth*3];
        ...
        fclose(JpgFic);
        }
      }
    première question quand je débug ça plante à l'entrée de ma fonction (au niveau de l'accolade) Stack Overflow 0x0000000FD...

    En rajoutant au fur et à mesure mon code je me rend compte que c'et mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char Buffer [Width*Heigth*3];
    qui fait planter le debug (mon image est de 1000*1000)

    Donc voici ma première question :

    Ma variable étant déclarée dans le "if" ça portée devrait être les accolades du if ?

    Et ma deuxième :
    Quelle et la limite d'un tableau en C++? parce que visiblement le 1000*1000*3 il aime pas...
    Qui va piano va sano...

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    le probleme c'st que ta variable est declarée dans la pile ,
    et que par defaut il y a une limite de la pile je crois de 1M voir /STACK
    vaudrait mieux faire un new ....

  3. #3
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    ouais, c'est ce qu j'allais faire de toute façon, effectivement, ça fait un tableau de 2,89 mega....

    Par contre pour la portée, ça me parait bizarre...
    Qui va piano va sano...

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    pour la portée c'est celle de la boucle ou accolade immediatement superieure,donc ici le if
    attention a une variable globale portant le meme nom ...

  5. #5
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    j'ai trouvé ça dans le post-it FAQ du forum VC++, et je crois que ç fais parti du même style de problême.

    Citation Envoyé par Loulou24
    Pourquoi mon code, pourtant valide, ne compile pas sous Visual C++ 6 ?

    Visual C++ 6 est sorti en 1998, et n'inclue donc pas dernière norme du C++, datant de la même année. Il en résulte certains manques, et des résultats parfois étonnants avec du code pourtant parfaitement valide.

    Voici quelques exemples de codes standards mais qui ne compilent pas sous VC++ 6


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int i = 0; i < 50; ++i)
    {
       // ...
    }
     
    for (int i = 0; i < 20; ++i) // Erreur : "i : redefinition"
    {
       // ...
    }
    Ce code est pourtant correct : en effet la portée de la variable i devrait être limitée au bloc de la boucle concernée.
    Une solution (de derrière les fagots) pour corriger ce manque : inclure systematiquement nos boucles dans un if, ainsi la portée sera bien limitée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define for if (true) for

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct A
    {
        static const int Taille = 12; // Erreur : "syntaxe non valide"
        int Tab[Taille];
    };
    Ce code devrait compiler, car les constantes entières statiques peuvent être initialisées dans leur définition.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct A
    {
        void Func()
        {
        }
    };
     
    std::vector<A> Tab;
    std::for_each(Tab.begin(), Tab.end(), std::mem_fun_ref(A::Func));
     
    // Erreur : fonction 'void' renvoyant une valeur
    Cette écriture devrait être possible, mais VC6 ne sait pas la gérer du fait de son manque de spécialisation partielle de template.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::set<int> s;
    std::vector<int> v(s.begin(), s.end()); // Erreur : "conversion impossible"
     
    std::list<int> l;
    l.sort(std::less<int>()); // Erreur
    VC6 ne gère pas correctement les fonctions membres template de classe template, ce qui entre autre vous empêchera d'utiliser les fonctions de la STL prenant en entrée une paire d'itérateurs quelconques, ou list::sort avec un foncteur personnalisé.

    http://www.developpez.net/forums/vie...2dfa37f3e0d0bd

    J'ai vérifié, j'ai pas de variable globale avec le même noM...
    Qui va piano va sano...

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    je veux bien mais j'ai ecris ce style de chose des milliers de fois .
    ce qui n'est pas la meme chose que le pb montre par loulou24 sur une boucle for.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bool JpgFic=true;
        if(JpgFic)
        {
         unsigned char Buffer[100];
     
        } 
        Buffer[0]=0; // ligne 988
    provoque les erreurs suivantes:
    Compiling...
    TestMdiView.cpp
    C:\MsDev\Samples\TestMdi\TestMdiView.cpp(646) : warning C4101: 'ct' : unreferenced local variable
    C:\MsDev\Samples\TestMdi\TestMdiView.cpp(988) : error C2065: 'Buffer' : undeclared identifier
    C:\MsDev\Samples\TestMdi\TestMdiView.cpp(988) : error C2109: subscript requires array or pointer type
    C:\MsDev\Samples\TestMdi\TestMdiView.cpp(988) : error C2106: '=' : left operand must be l-value
    Error executing cl.exe.
    alors je comprends pas ton pb . tu es sur du constat ?

  7. #7
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    oui, c'est vrai que j'ai pas d'erreur de compilation...

    Mon problème venait bien du debordement de la pile (tableau trop grand), et mon étonnement, venait du fait qu'en debuggant, le plantage se faisait à l'entrée de la fonction alors que mon tableau qui fait déborder la pile etait dans un if...
    Ce qui me parait bizarre, c'est qu'il crée toutes les variables de la pile à l'entrée de la fonction, je pensais qu'il les rajoutais au fur et à mesure qu'il rentrai dans des accolades (if, for...), par ce que moi je déclare souvent des variables dans les accolades pour minimiser le nombre de variables déclarées (bien que ça soit pas une grosse économie, c'est plus la façon dont j'ai appris à coder...).
    Qui va piano va sano...

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    il y a quelque chose qui va pas la

  9. #9
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    Citation Envoyé par farscape
    il y a quelque chose qui va pas la
    C'est à dire????
    Qui va piano va sano...

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/06/2011, 08h20
  2. Réponses: 0
    Dernier message: 14/09/2008, 18h35
  3. Réponses: 0
    Dernier message: 14/09/2008, 18h30
  4. [VB6] Limitation des variables à 64 Ko
    Par daladim dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 06/06/2006, 21h37

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