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 :

Comportement étrange d'un pointeur de pointeur de pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 27
    Par défaut Comportement étrange d'un pointeur de pointeur de pointeur
    Bonjour,

    Je fais face à un comportement étrange, que je ne comprends pas.
    Je souhaite créer un tableau dynamique à 3 dimensions de la structure suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct point
    {
       float x, y, z, value;
    };
    Je cré un tableau de la taille suivante : [14][14][7]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct point ***pts_base_field;
     
    pts_base_field=(float***) malloc (sizeof(float**) * 14 );
     
    for (i=0; i<=14; i++)
    	pts_base_field[i]=(float**) malloc (sizeof(float*) * 14 );
     
     
    for (i=0; i<=14; i++)
    	for (j=0; j<=14; j++)
    		pts_base_field[i][j]=(float*) malloc (sizeof(float) * 7 );
    Le problème, c'est que je peux accéder aux valeurs situées aux indices suivants :
    pts_base_field[14][14][9]


    Comment se fait-il ? Je ne vois pas où est le problème...
    Je vous remercie pour votre aide !

    Bonne journée !

    ++

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Si tu créés un tableau [14][14][7], la dernière cellule de ce tableau a pour indice [13][13][6]. Les indices commence à 0 en C.

    Si tu tentes d'accéder à [14][14][7], tu es en dehors du tableau et tu fais n'importe quoi (récupération de valeur aléatoire ou bien crash du programme).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 27
    Par défaut
    Merci pour ta réponse, je suis sur la bonne voie.

    Comment puis-je vérifier la taille de mon tableau ? J'ai de gros doutes sur les tailles des différentes dimensions.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    C'est une des grosses limitations du C, tu ne peux pas demander à un tableau sa dimension.

    Soit le programme la connait (une variable, un define ou autre), soit le tableau est embarqué dans une structure un petit peu intelligente qui connait la taille du tableau qu'elle contient.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 27
    Par défaut
    Merci pour l'info :-)

    J'ai un problème avec mes malloc je crois.
    Voici la création :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pts_base_field=(float***) malloc (sizeof(float**) * (15) );
     
    for (i=0; i<15; i++)
    	pts_base_field[i]=(float**) malloc (sizeof(float*) * (15) );
     
    for (i=0; i<15; i++)
    	for (j=0; j<15; j++)
    		pts_base_field[i][j]=(float*) malloc (sizeof(float) * (8) );
    Ensuite, pour tester, je rempli le tableau de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    for (i=0; i<15; i++)
    {
    	for (j=0; j<15; j++)
    	{
    		for (k=0; k<15; k++)
    		{
    			pts_base_field[i][j][k].x=i;
    			pts_base_field[i][j][k].y=j;
    			pts_base_field[i][j][k].z=k;
    		}
    	}
    }
    A la fin, si je consulte la variable "pts_base_field[0][0][6]", elle contient :
    x = 0
    y = 1
    z = 0

    Alors qu'elle devrait avoir :
    x = 0
    y = 0
    z = 6

    Le tableau m'a l'air tordu, non ?

  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 : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Un tableau a plusieurs dimensions correspond toujours en mémoire à un seul bloc contigu. Pour allouer dynamiquement un tableau de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Type array[sx][sy][sz];
    Il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array = mallo(sx * sy * sz * sizeof(Type));
    Et ainsi tu pourra l'accéder avec une syntaxe du type :

Discussions similaires

  1. problème pointeur comportement étrange
    Par all666 dans le forum Langage
    Réponses: 3
    Dernier message: 10/03/2015, 09h56
  2. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  3. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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