int *tree = heap->tree; int *pos = heap->pos; float *p = heap->p;
3 Réponses :
Que diriez-vous d'utiliser un point "". ?
Comme puis utilisez p>
Cela ne fonctionne que si vous avez une structure, pas un pointeur à la structure. . code> et
-> code> 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 code> ne fait pas une abréviation pour
heap code> là-bas, il déclare une seule instance de la structure nommée
h code>, qui n'est pas la même chose.
Vous pouvez initialiser une structure à l'aide de Initialiseur désigné de C99 Syntaxe:
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.
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 _
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
Désolé, c n'a pas de raccourcis pour cela.
Votre actuel
initheap code> 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 code> est confus, même à Pascal.
Connexes: Stackoverflow.com/questions / 2279180 / ...
Vous pouvez renommer la variable.
Void MellInit (Struct Heap * H, ... Code>
Notez que la ligne
capacité = capacité; code> indique uniquement l'un des problèmes qui se poseraient si le
avec la clause code> était disponible - est-ce une capacité de raccourci pour
Heap-> Capacité Capacité; Code> ou
Capacité = Heap-> Capacité; Code> ou
Heap-> Capacité = Heap-> Capacité; Code> ou Capacité> Capacité; code>? La réponse est qu'un compilateur ne pouvait pas dire - le code devrait être changé, peut-être que l'argument était
Cap code> au lieu de
capacité code>. 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