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

GTK+ avec C & C++ Discussion :

Gestion de GtkImage - problème de types


Sujet :

GTK+ avec C & C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Par défaut Gestion de GtkImage - problème de types
    Bonjour,

    je fais face à un problème que je pense facilement résolvable.. Malheureusement, j'ai beau retourner le problème dans tous les sens, je ne trouve pas la solution.

    En gros, voici ce que j'effectue :

    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
    GtkImage  *temp = NULL; //Pour stocker une adresse d'image temporaire (voir plus bas)
    
    //allocation dynamique en fonction de la taille, pour un tableau a 2 dimensions
    GtkImage ** images = malloc(LINES*sizeof(GtkImage));
    for(i = 0; i < COLUMNS; ++i)
    {
        images[i] = malloc(COLUMNS*sizeof(GtkImage));
    } //tableau dynamique à deux dimensions pour stocker les adresses des images
    
    //remplissage d'un GtkTable...
    
    for(i=0;i<COLUMNS;i++)
    {
    	for(j=0;j<LINES;j++) //code utilise pour remplir un GtkTable d'images
    	{                          //j'aimerais sauver les adresses des images dans le tableau images[][]
                gtk_table_attach (imageTable, temp=gtk_image_new_from_file("./yellow.png"), i, i+1, COLUMNS-j-1, COLUMNS-j, 0, 0, 2, 2);
                images[i][j]=*temp;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //puis j'aimerais pouvoir agir sur ces images, via la fonction :
    gtk_image_set_from_file (images[1][2], "./red.png"); //cad modifier l'image qui est stockée dans images[1][2]
    //mais j'ai un problème sur les types :
    incompatible type for argument 1 of ‘gtk_image_set_from_file’
    Je suis coince à ce niveau : je ne peux pas utiliser les adresse des images stockees dans mon tableau images à deux dimensions, pour pouvoir les modifier.
    Si quelqu'un pouvait m'aider ? Ca doit certainement sauter au yeux.. ou bien avoir été vécu par quelqu'un...

    Merci d'avance pour votre aide.

    PS : je free bien le tableau dynamique a la fin (donc l'erreur ne vient pas de la).

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Bonjour,

    il semble bien que tu ne maîtrises pas les tableaux de pointeurs... J'avoue que ce n'est pas forcément de la tarte. Mais je ne vois pas pourquoi tu te compliques la vie, rares sont les cas où il est conseillé de les utiliser. Utilise un GPtrArray (tableau dynamique de pointeurs à une seule dimension) qui te permettra de stocker tes pointeurs sans mal.

    Évite dans tous les cas les tableaux multi-dimensionnels, et utilise des tableaux à une seule dimension, qui génèrent du code plus lisible, et qui sont plus performants:
    Par exemple, utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau [ligne * N_COLONNES + colonne]
    (où N_COLONNES est le nombre de colonnes dans une ligne), plutôt que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau [ligne] [colonne]
    Tu peux même faire une macro si tu veux rendre le calcul d'indice plus transparent.

    Je vais tout de même faire quelques remarques sur le code que tu as posté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkImage ** images = malloc(LINES*sizeof(GtkImage));
    Il y a déja un problème ici: tu veux faire un tableau de tableau de pointeurs, mais tu utilises sizeof (GtkImage), au lieu de sizeof (GtkImage *).

    Ensuite, GtkImage *toto est un pointeur vers un GtkImage.
    GtkImage **toto est donc un pointeur vers un pointeur vers un GtkImage, et te permet de stocker un tableau de pointeurs... Et pas un tableau de tableaux de pointeurs. Si je ne dis pas de bêtises, la bonne déclaration serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkImage *** images = malloc(LINES*sizeof(GtkImage**));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0; i < COLUMNS; ++i)
    {
        images[i] = malloc(COLUMNS*sizeof(GtkImage));
    }
    Là c'est pareil, tu te gourres complètement... images a autant d'éléments que le nombre de lignes... Donc c'est sur le nombre de lignes qu'il faut itérer, pas sur le nombre de colonnes...
    Et dans chaque case du tableau, tu stockes l'adresse d'un tableau de pointeurs de GtkImage, donc idem, erreur sur le type dans le sizeof.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (i = 0; i < LINES; ++i)
    {
        images[i] = malloc(COLUMNS*sizeof(GtkImage*));
    }
    Bref, révise ton bouquin de C sur ces points bien précis, car là ça n'a pas grand chose à voir avec GTK+...

    Et pour finir, si COLUMNS et LINES sont des constantes définies à la compilation (je le suppose au fait qu'ils sont en majuscule), pourquoi diable créer des tableaux alloués dynamiquement avec malloc ? Si tu veux à tout prix faire du multidimensionnel, et que les tailles sont connues à l'avance, utilise plutôt des tableaux alloués dans la pile...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GtkImage *image[LINES][COLUMNS];

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Pour faire un peu plus clair, un petit schéma:


    Les lignes sont représentées : chaque case verte correspond à un pointeur vers un GtkImage (donc, un GtkImage *). Le nombre de case vertes dans une ligne est le nombre de colonnes. Chacune des lignes est donc un tableau d'éléments "case verte", c'est à dire un "case verte"*, c'est à dire un GtkImage**, contenant N_COLONNES éléments.

    Le tableau vertical est celui qui contient les pointeurs vers les lignes (représentés par les cases rouges). Les lignes sont des GtkImage **, et on stocke dans chaque case rouge cette ligne. Chaque case rouge contient par conséquent un GtkImage**.

    Ton tableau "images" stocke quant à lui ce tableau vertical, qui est un tableau de GtkImage**, et c'est donc une GtkImage***.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 3
    Par défaut
    Je te remercie pour ta réponse et ta belle explication.
    Il est clair que je débute en C (ca fait 4 jours). Venant de pur POO (Java) les pointeurs de pointeurs de pointeurs ca devient vite étourdissant.

    Ta première remarque est tout à fait judicieuse. Je n'ai pas pris le problème par le bon bout, et depuis le début, j'essayais de stocker des adresses d'images dans un tableau d'images. J'aurais dû, comme tu l'as signalé, utiliser trois *, pour :

    GtkImage *** images = malloc(LINES*sizeof(GtkImage**))

    (Quand je pense que j'ai passé 3 heures la dessus sans revérifier ma première déclaration... On ne m'y reprendra plus)

    Pour ce qui est du sizeof je m'en apercois maintenant, c'était absurde de demander un espace valable pour des GtkImages alors que je ne stocke que des pointeurs... Donc voila, j'ai bien noté .

    Pour ce qui est des LINES et COLUMNS ce sont des define que j'ai faites donc pas trop grave.. Je dois effectivement revoir l'ordre des COLUMNS et LINES dans les instructions.

    J'ai finalement choisi la dernière proposition que tu as notée, soit ne pas passer par un tableau dynamique.. (j'avais d'abord commencé par là, mais n'y arrivant j'en avais conclu que ca n'était pas la bonne méthode.. effectivement, je testais avec : GtkImage image[LINES][COLUMNS]; donc même problème qu'au début.)

    J'ai donc fait ceci : GtkImage *image[LINES][COLUMNS]; et tout fonctionne très bien, et surtout simplement.. Je pensais que je devenais fou, mais une fois encore, la logique l'emporte .

    Merci pour tes explications !

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Cool, content que tu aies pu t'en sortir. Dans tous les cas, je te recommande de voir comment lire les déclarations C, et aussi comment se représenter le fonctionnement des pointeurs. Tu as même la variante en Java.

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

Discussions similaires

  1. Gestion club sportif (problème de relations )
    Par jemaflo dans le forum Access
    Réponses: 3
    Dernier message: 03/10/2005, 23h00
  2. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  3. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 20h23
  4. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  5. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 11h04

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