Pointeur vers une struct à l'intérieur d'une structure (struct); Comment accéder sans erreurs?
Autant que je sache, si l'élément à l'intérieur d'une structure est un pointeur, vous l'appelez avec ->
, si c'est une valeur normale, il est utilisé .
.
ici mon typedefs:
typedef struct
{
char name[50];
int quantity;
}ing;
typedef struct
{
char name[50];
ing *n;
int price, n_ing, max_producity;
}prod;
puis-je déclarer un prod a;
et je allouer a->n=malloc(n*sizeof(ing));
.
Mais lorsque j'essaie d'accéder à a.n->name
il me donne l'erreur.
Tous les 4 combinaisons me donne l'erreur "error: invalid argument de type de '->' (, 'de prod' (ou 'ing'))" ou "erreur: indice de la valeur n'est ni tableau, ni pointeur, ni vecteur".
Pourquoi?
int ret_max_producity(prod a, ing n, int dim_n)
{
int max_prod=32100, i;
for(i=0; i<a.n_ing; i++)
{
/* here!->*/if((n[find_ing(n, a.n[i]->name, dim_n)].quantity)/(a.n->quantity)<max_prod)
{
/* here!->*/ max_prod=(n[find_ing(n ,a.n[i]->name, dim_n)].quantity/a.n->quantity);
}
}
if(max_prod==32100)
{
printf("ERROR WHILE FINDING MAX PRODUCITY FOR PRODUCT %s, ABORTING", a.name);
system("pause");
exit(EXIT_FAILURE);
}
return max_prod;
}
int find_ing(ing v, char *s, int dim)
{
int i;
for(i=0; i<dim; i++)
{
if(strcmp(s, v.name)==0)
{
return i;
}
}
printf("\n\nERROR WHILE FINDING INGREDIENT %s IN VECTOR, ABORTING...", s);
system("pause");
exit(EXIT_FAILURE);
}
- Il serait intéressant de lire un tutoriel sur le C les opérateurs, ce qui est le plus certainement couvert dans n'importe quel débutant-niveau de langue tutoriel.
- Ce n'est pas que si l'élément à l'INTÉRIEUR de la structure est un pointeur que vous utilisez
->
c'est quand le symbole lui-MÊME est un pointeur de variable que vous utilisez '-> " Quand le symbole est de type struct foo puis vous utilisez un '.'
Vous devez vous connecter pour publier un commentaire.
As far as I know, if the item inside a structure is a pointer, you call it with ->, if it's a normal value it is used ..
Non, le
.
opérateur est utilisé pour accéder aux membres d'une structure, la->
opérateur est une coupe courte pour déréférencer et.
, de sorte que vous utilisez, si vous avez un pointeur de votre structure. Donc:Dans le sens le plus élémentaire, pour accéder à une structure de membres vous faites cela:
D'accéder à la structure des membres si vous déclarez un pointeur de votre structure, vous effectuez cette opération:
"prod a; and I allocate a->n=malloc(n*sizeof(ing));. But when I try to access to a->n->name it gives me error"
Si vous êtes à la déclaration d'une structure comme ça, alors, la raison c'est de vous donner une erreur est parce que vous essayez de déférence quelque chose qui n'est pas un pointeur.
serait correct.
MODIFIER
Après avoir vu ton code, je vois quel est ton problème:
Le problème est que vous êtes en train de faire plus de déférence que vous ne le pensez. Le
[i]
est en train de faire un complément et de déréférencement puis le->
est en train de faire un autre niveau.Voici un petit exemple de la façon dont il devrait ressembler à:
EDIT 2
Voici la ligne en question:
Voici ce qu'elle aurait été:
MODIFIER 3
Totalement négligé l'évidence. Vous êtes le passage d'un seul
ing
struct à cette fonction appeléen
:Mais alors, à votre vérifier si vous essayez d'accéder à cette structure comme un tableau:
Vous ne pas disposez d'un tableau de
ing
structures dans len
variable, vous n'avez qu'une seuleing
variable. Il est donc crier à vous pour le traitement de cette unique structure comme un tableau de structures.a.n[i].name
parce que vous êtes à l'aide de la[]
indice, mais vous utiliseza.n->quanity
car il n'y a pas de[]
indice là. Got it?n
de typeing
à votre fonction et vous essayez d'accéder à l'[]
comme si c'était un tableau. Vous ont et le tableau nommén
dans lea
variable, mais lan
que vous avez passé à la fonction est différente et n'est pas un tableau. 🙂 Puis-je vous suggérer quelques noms descriptifs pour les variables? Il aurait aidé à trouver plus rapidement.Si vous déclarez une prod un, et pas une prod * un, alors vous avez besoin pour accéder à la membres par un.n. Puisque n est un pointeur, il devrait être un.n->nom.
-> n'est utilisé que si vous avez un pointeur vers une structure. . est utilisé lorsque vous avez une instance d'une structure.
prod a;
un.n = malloc(sizeof(ing *)); //Pourquoi êtes-vous en multipliant ce nombre par n? ne pas le faire.
un.n = adresse de l'instance de ing que vous avez fait. un.n = &ing structure.
un.n->tout ce que = vous pouvez Maintenant accéder à Cette valeur
Edit:
Se débarrasser du type defs. Il faut lire
Il devrait être bon. Vous êtes à l'aide de typedef dans le mauvais sens je crois.
Vous avez aussi besoin de transmettre, il int adresses de ces deux structures, et ensuite obtenir un pointeur en dehors d'eux. Si votre déclaration de fonction doit se lire:
et lors de l'appel de ret_max_productivity, il devraient avoir: