Structure en c

Résolu
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012 - 1 juin 2011 à 22:33
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012 - 3 juin 2011 à 17:36
Bonjour,

j'aurais voulu m'enleve un doute sur les structures en c.

Disons que je definis une structure
struct bidule
{
int bibi;
char bobo [200];
};


puis un pointeur sur ma structure

bidule *chose


lorsque je fais appel a chose.bibi, c'est bien un pointeur sur int, non, jusque la pas d'erreur ?
Mais si je veux imprimer la valeur du int qui est a l'adresse pointe par mon chose.bibi, qu'est ce que je dois rentre ? La question peut paraitre conne, mais j'ai ecrit un prog et quand je lui demande de me renvoyer la valeur, j'ai l'impression qu'il me renvoie une adresse (et c'est pas qu'une impression. Je tiens a preciser que je ne mets pas &chose.bibi). C'est pour ca que j'en suis venu a me demander quel est le type de chose.bibi par exemple.

merci d'avance

11 réponses

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 juin 2011 à 15:31
Bonjour,
quand tu écris :
lectureInt(fichier, li[0].nombre);

et bien li[0].nombre est un int, pas un int*

tu dois faire :

lectureInt(fichier, & ( li[0].nombre) );
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 juin 2011 à 00:50
Soit la structure "bidule", alors pour accéder à la valeur contenu dans "bibi":
bidule chose1;
=> chose1.bibi;

bidule* chose2;
=> (*chose2).bibi ou chose2->bibi


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
2 juin 2011 à 00:51
Bien évidemment, on considère que chose2 est alloué: bidule* chose2 = malloc(1 * sizeof (bidule))

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
2 juin 2011 à 08:14
Merci beaucoup pour la reponse, je vais la tester des que possible. J'avais essaye (*chose.bibi) ou encore (*(chose.bibi)) mais ca n'allait pas.

Par ailleurs, j'aurais voulu savoir si on peut connaitre le nombre de lignes dans un fichier sans le parcourir au prealable deja une fois.

J'aimerais allouer de la place (x fois ma structure) mais x variant, pour l'instant, il m'a semble qu'un malloc suffisament grand avec eventuellement realloc au besoin etait le mieux. Mais si je peux allouer d'entree le bon espace memoire et m'eviter un eventuel realloc, ce serait mieux.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
2 juin 2011 à 10:27
Malheureusement, j'en suis au meme niveau, ca n'a pas marche.

Voici ce que je fais :

deja une structure

struct titre
{
    int nombre;
    char naz[200];
    char nav[200];
 };


puis dans mon main

struct titre *li;

    li = (struct titre *)malloc(1*sizeof(*li));

    lectureInt(fichier, li[0].nombre);
    lecture(fichier, li[0].naz);
    printf("blblb : %d \n %s \n", li[0].nombre, li[0].naz);


ou le lectureInt ressemble a ca

#include <stdio.h>
#include "conversionAsciiNombre.h"

void lectureInt(FILE *fichier, int *nom)
{
    int l;

    *nom=0;
    printf("%d\n",(*nom));
    while( (l=fgetc(fichier)) != 9 )
    {
        *nom=((*nom)*10)+conversionAsciiNombre(l);
        printf("%d \t", (*nom));
    }

}


et le lecture a ca

#include <stdio.h>


void lecture(FILE *fichier, char *nom)
{
    int l;
    int j=0;

    while( (l=fgetc(fichier)) != 10 )
    {
       *(nom+j)=l;
       j++;
    }
    *(nom+j)=0;

}


Le fichier contient un nombre, un tab puis plusieurs noms a la suite separes par des espaces.
Je recupere bien ce que je veux dans mon lecture et a priori aussi dans lectureInt (j'ai mis un print dans cette fonction pour controler et ca renvoie bien ce que je veux).

Je dois a priori me tromper au niveau du type des elements de ma structure, mais je n'arrive pas a trouver ce qui ne va pas et pourquoi il renvoie ce que je veux avec les char et pas avec mon int (je recupere ce que je veux mais je n'affiche pas ce que je veux, et ca m'embete).
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
3 juin 2011 à 16:22
Merci pour cette reponse, effectivement ca marche.

Mais je dois dire que la j'ai du mal a comprendre et d'ailleurs a la compilation, il me renvoie un warning (maintenant j'ai un warning et il renvoie ce que je veux, avant pas de warning mais pas ce que je veux).

Dans ma fonction je demande un pointeur sur un File et un pointeur sur un int. Or avec cette reponse, je lui renvoie l'adresse de mon int.

Ma fonction lecture fonctionne correctement et je n'ai pas de warning. En revanche, si je remplace par &(li[0].naz), ca marche encore mais avec un gros warning. Pourquoi ????????????

#include <stdio.h>


void lecture(FILE *fichier, char *nom)
{
    int l;
    int j=0;

    while( (l=fgetc(fichier)) != 10 )
    {
       *(nom+j)=l;
       j++;
    }
    *(nom+j)=0;

}
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 juin 2011 à 16:29
c'est quoi le warning ?
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 juin 2011 à 16:29
int nombre; => entier
char naz[200]; => pointeur (équivaut à char* naz en terme de type)

nombre => int
&nombre => int*
&&nombre => int**

naz => char*
&naz => char**
&&naz => char***

li[0].nombre => int
&li[0].nombre => int*
&&li[0].nombre => int**

li[0].naz => char*
&li[0].naz => char**
&&li[0].naz => char***

Donc:
lectureInt(fichier, &li[0].nombre);
lecture(fichier, li[0].naz);

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
3 juin 2011 à 17:18
Le warning c'est ca :

passing argument 2 of 'lectureInt' makes integer from pointer without a cast

dans mon lectureInt.h : expected 'int' but argument is of type 'int *'

Maintenant, je remercie capitaine pingu pour le resume au passage, de ce que je sais, l'operateur & applique a une variable delivre l'adresse de celle-ci.

Est-ce que lorsque l'on fait &variable, pour la machine ca revient a lui declarer implicitement un pointeur vers 'type de ma variable' qui repere cette variable, du genre :
type i;
type *p;
p = &i;


En gros ce que je comprends par "donne moi l'adresse de i", c'est plutot "donne moi la valeur de mon pointeur p qui pointe sur ma variable i".
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
3 juin 2011 à 17:32
Est-ce que lorsque l'on fait &variable, pour la machine ca revient a lui declarer implicitement un pointeur vers 'type de ma variable' qui repere cette variable

Ça ne créer pas de variable, mais ça donne effectivement l'adresse de ta variable. Pour la compréhension, l'exemple que tu as donné est juste. Il y a bien un type intermédiaire, mais pas de variable de créer.

En gros:
lectureInt(fichier, &li[0].nombre); 

Est équivalent à:
int* i = &li[0].nombre;
lectureInt(fichier, i);

Sauf que dans le deuxième exemple, on créer une variable intermédiaire (pas de variable supplémentaire de crééer dans le premier exemple).

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vercd7am Messages postés 34 Date d'inscription samedi 17 juillet 2010 Statut Membre Dernière intervention 14 mai 2012
3 juin 2011 à 17:36
Merci beaucoup pour ces reponses.
0
Rejoignez-nous