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 :

Plantage à cause de tableaux de char


Sujet :

C

  1. #1
    Membre confirmé Avatar de bricechris
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Par défaut Plantage à cause de tableaux de char
    Bonjour,

    Depuis un moment, j'ai un problème qui ne viendrait à priori pas du langage C, puisque quand je compile tout se passe correctement. Mais lorsque je lance l'exécutif du programme : là, au lieu d'avoir ma fenêtre normale, j'ai un rapport d'erreur de Windows.

    Le plantage viendrait apparemment de mes tableaux de char "trop" volumineux. J'ai 4 tableaux de char comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define XX 640
    #define YY 480
     
    Uint8 r[XX][YY] = {0}, g[XX][YY] = {0}, b[XX][YY] = {0}, e[XX][YY] = {0};
    Avec ça, donc, mon programme plante dès que je le lance. Mais dès que j'abaisse les valeurs, de par exemple de 500 pour XX et 300 pour YY, le programme marche sans le moindre problème.

    J'aurais vraiment besoin de votre aide parce que je ne sais pas comment faire.
    Merci !

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    salut,

    j'ai un rapport d'erreur de Windows.
    il dit quoi ?

    Si ta déclaration est dans une fonction, oui en effet, tu exploses la pile.
    Il faudra donc passer par les malloc.

  3. #3
    Membre confirmé Avatar de bricechris
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Par défaut
    Le rapport d'erreur classique de Windows.
    test.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour blabla..
    Ma déclaration n'est pas dans une fonction, mais dans le main(). Je déclare mes variables au début du programme et puis c'est tout.

  4. #4
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    main() est quand même une fonction !!

    Essaies les malloc à la place des déclarations que tu as faites.

  5. #5
    Membre confirmé Avatar de bricechris
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 47
    Par défaut
    Je ne comprends pas. Pourquoi tu voudrais utiliser des malloc, fregolo ? Elles ne seraient pas inutiles si ce n'est que pour les appeler qu'une seule fois ?

    Sinon, j'ai réussi à "pallier" au problème en supprimant 2 des 4 tableaux. Le problème reste qu'on dirait que j'ai une quantité anormalement faible de place en mémoire. En plus, là, mon programme est ridiculement petit. Si je voulais faire un truc plus gros, je serai à nouveau dans le caca.


    Vous savez dans quoi mon programme stock ses variables ? La ram ? Processeur ? etc.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Il n'y a qu'une place très limitée pour les données statiques (ce que tu essaies d'utiliser). Les allocations par malloc() en revanche sont allouées dans le heap, qui est beaucoup plus grand.

  7. #7
    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
    Vous savez dans quoi mon programme stock ses variables ? La ram ? Processeur ? etc
    Les variables sont stockées dans des zones différentes selon leur mode de création :

    - Les variables en allocation automatique (variables locales, créées à l'entrée du bloc où elles sont déclarées et détruites à la sortie) sont placées sur la "pile" (où il y a relativement peu de place)

    - Les variables en allocation dynamique (créées par malloc() et compagnie) sont placées sur le "tas" (où il y a beaucoup de place)

    - Les variables en allocation statique (variables globales et variables locales déclarées static, créées et initialisées au lancement du programme et détruites à la fin) sont placées dans la zone "programme" (où il y a beaucoup de place).

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par bricechris Voir le message
    Bonjour,

    Depuis un moment, j'ai un problème qui ne viendrait à priori pas du langage C, puisque quand je compile tout se passe correctement.
    Attention, un programme qui se compile est simplement un programme syntaxiquement correct. Ca n'empêche pas le caca issu d'une mauvaise programmation
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char tab[5];
    tab[-145]='a';
    Ca compilera sans souci. Mais à l'exécution...

    Citation Envoyé par bricechris Voir le message
    Le plantage viendrait apparemment de mes tableaux de char "trop" volumineux. J'ai 4 tableaux de char comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define XX 640
    #define YY 480
     
    Uint8 r[XX][YY] = {0}, g[XX][YY] = {0}, b[XX][YY] = {0}, e[XX][YY] = {0};
    Avec ça, donc, mon programme plante dès que je le lance. Mais dès que j'abaisse les valeurs, de par exemple de 500 pour XX et 300 pour YY, le programme marche sans le moindre problème.
    Vraiment bizarre. Car 640 * 380 ça donne 307 200 soit 300ko par tableau soit 1200 ko (ou 1,17Mo) pour les 4. C'est réellement très peu. Ton système aurait dû les accepter. A moins que le Uint8 soit différent d'un char...

    Toutefois je suis dubitatif à propos de ta façon de l'initialiser. Un tableau 2D s'initialise généralement de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <type> tab[xx][yy]={
        {..., ..., ..., ..., ...},
        {..., ..., ..., ..., ...},
        {..., ..., ..., ..., ...},
        {..., ..., ..., ..., ...},
    };
    Là, tu n'as mis qu'un jeu d'accolades. Je suis pas certain que cette écriture soit la meilleure.
    A la limite, tu pourrais vérifier cette hypothèse de cette façon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define XXYY (640*480)
     
    Uint8 r[XXYY] = {0}, g[XXYY] = {0}, b[XXYY] = {0}, e[XXYY] = {0};
    Ainsi tu sauras si ça vient d'un problème de mémoire ou de codage.

    Par ailleurs, tu pourrais aussi essayer ton code sur un autre ordi pour voir. Et si cet autre ordi était sous Linux, ce serait un "problème possible" en moins...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Vraiment bizarre. Car 640 * 380 ça donne 307 200 soit 300ko par tableau soit 1200 ko (ou 1,17Mo) pour les 4. C'est réellement très peu. Ton système aurait dû les accepter
    Pas d'accord !!

    J'avais développé un programme multi-plateformes. Sous Linux, aucun souci, mais sous Windows j'avais un joli "Stack overflow" avec un tableau de 600ko.

    Je crois que ça se règle quelque part dans Windows (base de registre ?). Mais la valeur par défaut n'est pas grande sous Windaube.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    C'est dans les options de compilation de ton programme, ça fait 1Mo committé par défaut (10Mo réservés) et ça ne s'appelle pas "Windaube".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fregolo52 Voir le message
    Pas d'accord !!

    J'avais développé un programme multi-plateformes. Sous Linux, aucun souci, mais sous Windows j'avais un joli "Stack overflow" avec un tableau de 600ko.

    Je crois que ça se règle quelque part dans Windows (base de registre ?). Mais la valeur par défaut n'est pas grande sous Windaube.
    Amusant et merci de faire partager ton expérience.

    Moi qui développe en 24/7 sous Linux, je remercie chaque jour le Seigneur de m'avoir fait connaitre ce SE
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. tableaux de char[]
    Par Diablo_22 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 06/06/2008, 11h20
  2. Problème avec les tableaux de char.
    Par Letinono dans le forum Débuter
    Réponses: 3
    Dernier message: 29/05/2008, 16h24
  3. Réponses: 1
    Dernier message: 08/05/2008, 14h28
  4. plantage à cause de Rave
    Par looping dans le forum Rave
    Réponses: 3
    Dernier message: 28/04/2008, 14h43
  5. Réponses: 31
    Dernier message: 07/12/2006, 11h46

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