[C] Initialisation d'un tableau constant

Initialisation d'un tableau constant [C] - C - Programmation

Marsh Posté le 08-04-2009 à 15:12:10    

Bonjour à tous.
 
Me remettant au C avec une certaine difficulté, j'ai décidé de tenté d'écrire du code propre, c'est-à-dire, entre autre, d'utiliser les const.
 
De ce que j'ai compris, le const avec un passage par valeur marche très bien puisque le passage par valeur est similaire à une initialisation de l'élément en question.
On initialise la variable locale constante de la fonction avec la variable passée en paramètre (qui n'est pas nécessairement const, elle)
 
Mon problème est que, gérant des gros objets et des tableau, je ne fais pas de passage par valeur mais des passages par référence.
Du coup, j'arrive pas à homogénéiser mon code et j'ai des warning (voire des erreur) un peu partout de non correspondance de mes types.
 
Alors, avez vous une solution pour écrire une fonction qui initialise un tableau d'objets qui seront constants suite à cette initialisation ?
Et l'allocation de ce tableau ? Je peux la faire avant ou il faut que ce soit dans la fonction d'inialisation ?
Comment fonctionne exactement cette allocation ?

Code :
  1. tab = g_new(Objet const, n);
  2. tab = malloc(Objet const*, sizeof(Objet const)*n); //quasiéquivalent, si je ne m'abuse

Merci pour vos éclairages.

Reply

Marsh Posté le 08-04-2009 à 15:12:10   

Reply

Marsh Posté le 08-04-2009 à 16:09:05    

Un petit éclairage :  
 
Le const est indépendant de la réservation d'espace mémoire. Le mettre dans les paramètres qui sont dans un malloc n'a pas de sens.
 
La fonction malloc() s'utilise en C.
 
Les objets s'utilisent en C++. L'allocation mémoire en C++ est réalisée avec new. Si on utilise malloc(), cela peut marcher dans certains cas particuliers, mais il vaut mieux éviter et utiliser new à la place.

Reply

Marsh Posté le 08-04-2009 à 16:37:23    

Le const c'est une erreur ici: si tu marques un objet nouvellement alloué const, tu ne pourras rien à faire, sauf à re-caster pour péter le const.
 
 
Les fonctions g_ de glib et les macros g_new* sont des allocateurs mémoires différents à libérer avec g_free. L'avantage c'est par exemple qu'il n'y a pas de vérification à faire sur la valeur de retour, ça ne renvoie jamais NULL.

Reply

Marsh Posté le 08-04-2009 à 17:14:31    

Merci pour les précisions sur l'allocation, j'y vois plus clair.
Sinon, je parle d'objet (parce que je suis fan d'objets) mais je suis contrainte au c (et non C++) donc ce sont bien évidement des structures.
 
Alors, en voulant reposer la question proprement, je suis arrivée à une solution.
En fait, mon problème venant de ma structure générale de code en 4 phases :  
1/ allocation de la structure
2/ fonction void initiant la structure passée par référence
3/ utilisation de la structure en const
4/ libération de mémoire.
 
J'ai réuni les deux première phases dans une fonction qui fait l'allocation et l'initiation et retourne un Objet const * sur mon tableau.
Je sais pas si c'est mieux, mais mon compilateur n'affiche plus de warning...
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed