0
votes

C Comment accéder aux éléments de structure sans utiliser -> à plusieurs reprises?

int *tree = heap->tree;
int *pos = heap->pos;
float *p = heap->p;

8 commentaires

Désolé, c n'a pas de raccourcis pour cela.


Votre actuel initheap est parfaitement parfait, lisible et idiomatique à moi.


Oh c'est triste :( @nateEldredge Ça a l'air bien jusqu'à quelque chose comme quelque chose comme un tas -> arbre [Heap-> pos [i]]


Si vous voulez pascal, vous pouvez l'utiliser. Un avec la clause est confus, même à Pascal.


Connexes: Stackoverflow.com/questions / 2279180 / ...


Vous pouvez renommer la variable. Void MellInit (Struct Heap * H, ...


Notez que la ligne capacité = capacité; indique uniquement l'un des problèmes qui se poseraient si le avec la clause était disponible - est-ce une capacité de raccourci pour Heap-> Capacité Capacité; ou Capacité = Heap-> Capacité; ou Heap-> Capacité = Heap-> Capacité; ou Capacité; ? La réponse est qu'un compilateur ne pouvait pas dire - le code devrait être changé, peut-être que l'argument était Cap au lieu de capacité . Il se désordonne très rapidement!


Cette réponse est pour C # mais les mêmes raisons s'appliquent à d'autres langues: Stackoverflow.com/a/601163/2193968


3 Réponses :


-3
votes

Que diriez-vous d'utiliser un point "". ? Comme xxx

puis utilisez xxx


1 commentaires

Cela ne fonctionne que si vous avez une structure, pas un pointeur à la structure. . et -> ne sont pas interchangeables. Dans une méthode d'initialisateur, vous aurez toujours un pointeur; Vous ne pouvez pas initialiser la structure de l'appelant si elles le transmettent par la valeur après tout. H ne fait pas une abréviation pour heap là-bas, il déclare une seule instance de la structure nommée h , qui n'est pas la même chose.



7
votes

Vous pouvez initialiser une structure à l'aide de Initialiseur désigné de C99 Syntaxe: xxx


4 commentaires

Ceci est probablement le plus proche de ce que recherche. Mais je pense que c'est moins idiomatique. Cela signifie également que toute la structure sera initialisée (avec des zéros pour les membres que vous ne mentionnez pas), qui peut gaver des cycles de la CPU s'il n'y avait pas besoin d'initialisation.


@nate: C'est certainement une partie de mon idiome :-). Il est vrai qu'il existe une cohorte de programmeurs qui hésitent à utiliser des "nouvelles" caractéristiques (c'est-à-dire de 20 ans seulement), mais il y a beaucoup d'autres qui font. Oui, cela initialise l'objet entier, vous ne pouvez donc pas l'utiliser pour des mises à jour partielles. Personnellement, je pense qu'il est bon d'initialiser des structures entières; Cela coûte peu et c'est beaucoup plus sûr. Dans le cas d'un membre qui est sur le point d'être défini sur une valeur différente, le compilateur peut être capable d'optimiser quand même. Mais évidemment, tout le monde doit utiliser son propre jugement.


Cela peut-il être fait avec des fonctions autres que l'initialisateur? J'ai ajouté une autre fonction dans la question.


@Huy: Vous pouvez l'utiliser comme vous le voyez. Rappelez-vous juste qu'un objet entier est construit; Vous ne pouvez pas l'utiliser pour mettre à jour quelques membres. Comme le dit Nate, vous n'avez pas à mentionner chaque membre (bien que je le fais souvent), car ceux que vous n'avez pas explicitement nommé seront zéro-initialisés.



1
votes

Qu'en est-il des bonnes vieilles macros?

struct Heap {
    int capacity;
    int heapSize;
    int *tree;     // the heap binary tree
    int *pos;       // pos[i] is the position of values[i] in items
    float *p;  // priority value of each heap element
};

#define _(x) heap->x
void initHeap(struct Heap *heap, int capacity) {
    _(capacity) = capacity;
    _(heapSize) = 0;
    _(tree) = malloc(sizeof(int)*(capacity+1));
    _(pos) = malloc(sizeof(int)*(capacity+1));
    _(p) = malloc(sizeof(float)*(capacity+1));
}
/* More struct Heap related functions */
#undef _


1 commentaires

Hey C'est en fait: D Le commentaire ci-dessus ne fonctionne que comme pour l'initialisateur. Également, capacité + 1 parce que mes magasins de mise en œuvre dans 1-> N, avec l'arbre [0] comme élément spécial