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 :

Taille max d'un tableau ?


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut Taille max d'un tableau ?
    Dans le cadre du développement d'un programme convertissant une image .jpeg en .gif, je dois créer un tableau (l'histogramme).
    Ce tableau doit contenir 16 millions d'éléments (255*255*255 en fait), or...je n'arrive pas à créer un tableau contenant plus de 4 millions (3 200 000 environ, si je me souviens bien).
    Comment dois-je faire svp ?

  2. #2
    Membre Expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Par défaut
    N'utilise pas un tableau...

  3. #3
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    quand tu dis que tu n'arrives pas... ça veut dire quoi ?
    tu as un message d'erreur ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    La commande linux "limits" donne la taille de la pile pour tout processus. Chez moi c'est 8Mo. Ton tableau fait 16Mo...
    Essaye de mettre le tableau en global (ou en static dans ta fonction)
    Sinon, il serait preferable de faire de l'allocation dynamique pour une telle taille

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Désolé j'ai oublié de préciser, quand je dis que je n'arrive pas à créer ce tableau...j'ai en fait une "Erreur de segmentation". Probablement un dépassement de mémoire, comme le précise Gruik.

    Allocation dynamique, tu pourrais préciser s'il te plait ?
    Je fais en général de la programmation objet (Java, C#), et en général je ne gère pas des tableaux aussi grands.
    Le langage C me perturbe un petit peu à vrai dire...

  6. #6
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Allocation dynamique:
    malloc, calloc, realloc.

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Ok merci, je suis allé voir la faq, je vais tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* hist=malloc((255*255*255)*sizeof *hist);
    Je verrai ce que ça donne demain, quand je pourrai tester à la fac...

    Merci .

  8. #8
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Quel est la taille des éléments, int c'est peut être trop.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Le int représente les occurrences d'une couleur, le tableau représentant les occurences de toutes les couleurs possibles. Il a donc comme valeur maximim la taille de l'image en pixel.
    Le int n'est peut-être pas suffisant...si je suppose que je travaille sur des images de tailles 512x512 au maximum.

    Je vais vérifier le maximum pour int.

    Edit:
    Citation Envoyé par La faq C du site
    • (signed) int : de -32767 à 32767
    • unsigned int : de 0 à 65535
    • (signed) long : de -2147483647 à 2147483647
    • unsigned long : de 0 à 4294967295
    512*512 = 262144
    Je vais me tourner vers le type long (voire unsigned long...l'occurrence ne peut pas être négative).

    Merci.

  10. #10
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Ou "long long int" non supporté par tous les compilos.

  11. #11
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Citation Envoyé par shinkyo
    La faq C du site a écrit :
    • (signed) int : de -32767 à 32767
    • unsigned int : de 0 à 65535
    • (signed) long : de -2147483647 à 2147483647
    • unsigned long : de 0 à 429496729
    Pas sur un processeur 32bits.

  12. #12
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Ah ? C'est pour quel processeur, ce que j'ai c/c stp ?
    Et pour un 32 bits, c'est comment ?

  13. #13
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Citation Envoyé par shinkyo
    Ah ? C'est pour quel processeur, ce que j'ai c/c stp ?
    Et pour un 32 bits, c'est comment ?
    ça c'est pour du 16bits (int sur 65535 <=> 2octets <=> 16bits)
    pour du 32 il faut multiplier par 65536
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  14. #14
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui, ça fait longtemps que les int sur les PC sont sur 4 octets

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Ah...je pige pas trop tous ces chiffres lol, mais d'après ce que j'ai compris, un unsigned int suffirait pour coder 512*512 ?
    Merci.

  16. #16
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 38
    Par défaut ok
    bonjour
    pense a utiliser une allocation dynamique ça marche
    bon chanse

  17. #17
    Membre Expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Par défaut
    Citation Envoyé par shinkyo
    Ah...je pige pas trop tous ces chiffres lol, mais d'après ce que j'ai compris, un unsigned int suffirait pour coder 512*512 ?
    Merci.
    Et largement.

  18. #18
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par shinkyo
    Dans le cadre du développement d'un programme convertissant une image .jpeg en .gif, je dois créer un tableau (l'histogramme).
    Ce tableau doit contenir 16 millions d'éléments (255*255*255 en fait), or...je n'arrive pas à créer un tableau contenant plus de 4 millions (3 200 000 environ, si je me souviens bien).
    Comment dois-je faire svp ?
    Sur ton implémentation, la taille maximale théorique d'un objet C en bytes est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <stdio.h>
    int main (void)
    {
       printf ("%lu bytes\n", (unsigned long) ((size_t) -1));
       return 0;
    }
    Evidemment, il n'est pas question de créer un tel objet en mémoire automatique.

    On peut essayer en mémoire statique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    int main (void)
    {
       static int hist[255*255*255];
       printf ("%lu bytes\n", (unsigned long) sizeof hist);
       return 0;
    }
    ou en mémoire allouée.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    int main (void)
    {
       size_t size = 255 * 255 * 255;
       int *hist = malloc (sizeof * hist * size);
       if (hist != NULL)
       {
          printf ("%lu bytes allocated\n", (unsigned long) (sizeof *hist * size));
     
          /* ... */
          free (hist), hist = NULL;
       }
       return 0;
    }
    Les objets non linéaires (tableau de pointeurs, listes, arbres) peuvent évidemment être beaucoup plus gros.

  19. #19
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Oui ça rentre sur un int, mais pour être plus "abstrait", tu devrait utiliser "unsigned long" pour dire que tu veux absolument un entier sur 4 octets

  20. #20
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Par défaut
    Ok, je vous remercie pour toutes ces précisions.
    Je vais rester sur la méthode de la mémoire allouée.

    Merci encore.

    Edit :
    @Emmanuel Delahaye> Exact, le 255*2555*255 était bien une erreur de frappe de ma part.
    C'est 255*255*255.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Taille max d'un tableau
    Par selmani300 dans le forum C
    Réponses: 5
    Dernier message: 26/04/2009, 15h16
  2. taille Max de string dans un tableau
    Par maxos75 dans le forum ASP
    Réponses: 3
    Dernier message: 01/08/2008, 20h31
  3. creer un tableau sans lui imposer une taille max
    Par christianf dans le forum C#
    Réponses: 7
    Dernier message: 05/05/2008, 18h50
  4. Réponses: 11
    Dernier message: 18/11/2007, 17h41
  5. taille max tableau et modification
    Par belgaran dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 11/08/2006, 22h09

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