Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Le Malloc en question

6 réponses
Avatar
levasseur vincent
Bonjour tout le monde,

Je cherche à initialiser un tableau en 2 dimenssion via une allocation
dynamique de la mémoire. L'utilisateur entrant le max en X et le max en Y
, j'obtiens un tableau de sommets au final.

J'ai déclaré un pointeur dans ma blibliotheque "VL.h" et je voudrais
donc dans une fonction type " void InitPointArray(vl_point *pointeur, int
max_x, int max_y) ; ", le type vl_point est une structure.

Suis-je dans la bonne voie ? Ou dois-je utiliser une autre fonction pour
creer ce tableau ?

Merci beaucoup

V.L.

6 réponses

Avatar
kilobug

Bonjour tout le monde,


Bonsoir

J'ai déclaré un pointeur dans ma blibliotheque "VL.h" et je voudrais
donc dans une fonction type " void InitPointArray(vl_point *pointeur, int
max_x, int max_y) ; ", le type vl_point est une structure.


Ta fonction doit renvoyer un pointeur (ou en modifier un) pour
communiquer le résultat de l'allocation. Pour modifier un pointeur, tu
as besoin d'un pointeur sur ce pointeur, puisque le passage
d'arguments se fait par valeur.

DOnc je te propose les deux prototypes uisvant:
void init_point_array(vl_point **ptr, int max_x, int max_y);
vl_point *init_point_array(int max_x, int max_y);

Je te laisse choisir ;)

V.L.


--
Gael Le Mignot "Kilobug" - - http://kilobug.free.fr
GSM : 06.71.47.18.22 (in France) ICQ UIN : 7299959
Fingerprint : 1F2C 9804 7505 79DF 95E6 7323 B66B F67B 7103 C5DA

Member of HurdFr: http://hurdfr.org - The GNU Hurd: http://hurd.gnu.org

Avatar
levasseur vincent
Merci beaucoup pour vos deux prompts réponses ! :)

Je pense que je vais utiliser la méthode tableau de tableau avec un
malloc à l'intérieur. :)

J'aurai cependant une petite question :

Dans le cas où j'ai une structure de ce type

struct point_complet {
float x;
float y;
float z;
float color[3];
}

Comment faire si on demande le nombre de points maximum à l'utilisateur,
et que l'on désire regrouper l'ensemble des points dans un tableau ?
En effet a-t-on le droit de faire

struct point_complet *tableau;
tableau = malloc(nombre_de_point * sizeof(point_complet)) ;?

En effet il me semble que je ne peux pas le faire ...

je pense que le meilleur moyen est de faire

tableau = malloc(nombre_de_point * 6 * sizeof(float)) ;

Dans tout les cas le mieux serait de faire un tableau de point et un
tableau pour la couleur (RGB) en utilisant toujours un tableau de tableau ;)

Mais j'avoue que ne gérer qu'un tableau de structures me tente vraiment.

VL


Le Wed, 24 Dec 2003 00:54:47 +0100, Marc Lasson a écrit :

levasseur vincent wrote:
Bonjour tout le monde,
Bonsoir,


Je cherche à initialiser un tableau en 2 dimenssion via une allocation
dynamique de la mémoire.


Est-ce que ca veut dire que tu alloues un tableau PUIS que tu
l'initialises ?

J'ai déclaré un pointeur


Tu as fait un "void *pointeur;" ?

dans ma blibliotheque "VL.h"


C'est un fichier d'entête.

et je voudrais donc dans une fonction type " void
InitPointArray(vl_point *pointeur, int
max_x, int max_y) ; ", le type vl_point est une structure.

Suis-je dans la bonne voie ? Ou dois-je utiliser une autre fonction pour
creer ce tableau ?

Merci beaucoup


Bon, je n'ai pas tout bien compris, je vais essayer de répondre au mieux.

Tout d'abord, tout dépends de comment tu implémentes ton tableau
dynamique à deux dimensions. En C, il éxiste un moyen fort commode,
c'est de faire un tableau de tableau.

J'appellerais "tableau" dynamique, un pointeur vers une zone de
mémoire contigüe.

ex un tableau de n int:
int *tableau = malloc (n * sizeof (int));
qu'on peut initialiser à 42 :
for (int i = 0;i < n;i ++)
tableau[i] = 42;

Un tableau de m tableau de n int ca nous donnerai donc:
int **tableau = malloc (m * sizeof (int *));
for (int i = 0;i < m; i ++)
{
tableau[i] = malloc (n * sizeof (int));
}

on peut egalement initialiser les m fois n cases à 42:
for (int i = 0;i < m;i ++)
{
for (int k = 0;k < n; k ++)
{
tableau[i][k] = 42;
}
}

Don si tu veux faire une fonction qui créé et initialise un tableau
de "vl" à deux dimensions elle devrai ressembler à ça:
vl **creer_tableau (int max_x, int max_y);

Mais il existe d'autres façons de faire.



Avatar
Marc Lasson
levasseur vincent wrote:
Bonjour tout le monde,
Bonsoir,


Je cherche à initialiser un tableau en 2 dimenssion via une allocation
dynamique de la mémoire.


Est-ce que ca veut dire que tu alloues un tableau PUIS que tu
l'initialises ?

J'ai déclaré un pointeur


Tu as fait un "void *pointeur;" ?

dans ma blibliotheque "VL.h"


C'est un fichier d'entête.

et je voudrais donc dans une fonction type " void
InitPointArray(vl_point *pointeur, int
max_x, int max_y) ; ", le type vl_point est une structure.

Suis-je dans la bonne voie ? Ou dois-je utiliser une autre fonction pour
creer ce tableau ?

Merci beaucoup


Bon, je n'ai pas tout bien compris, je vais essayer de répondre au mieux.

Tout d'abord, tout dépends de comment tu implémentes ton tableau
dynamique à deux dimensions. En C, il éxiste un moyen fort commode,
c'est de faire un tableau de tableau.

J'appellerais "tableau" dynamique, un pointeur vers une zone de
mémoire contigüe.

ex un tableau de n int:
int *tableau = malloc (n * sizeof (int));
qu'on peut initialiser à 42 :
for (int i = 0;i < n;i ++)
tableau[i] = 42;

Un tableau de m tableau de n int ca nous donnerai donc:
int **tableau = malloc (m * sizeof (int *));
for (int i = 0;i < m; i ++)
{
tableau[i] = malloc (n * sizeof (int));
}

on peut egalement initialiser les m fois n cases à 42:
for (int i = 0;i < m;i ++)
{
for (int k = 0;k < n; k ++)
{
tableau[i][k] = 42;
}
}

Don si tu veux faire une fonction qui créé et initialise un tableau
de "vl" à deux dimensions elle devrai ressembler à ça:
vl **creer_tableau (int max_x, int max_y);

Mais il existe d'autres façons de faire.

--
Marc.

Avatar
levasseur vincent
Bonjour,

Merci pour cette précision, qui me facilite les choses.

C'est assez difficile de bien choisir entre différents modes de
représentation :-/

Pour la petite histoire, je vous pose tout ces questions car
j'ai un projet en C/OpenGL à faire pour la fin de l'année.
En faite j'essaye de comprendre comment je fais représenter
une map en 3D.
C'est un peu HS alors je ne vais pas m'étendre içi :)

Quand tu dis : "Dans la vrai vie le malloc échoue", qu'est-ce qui semble
plus sur comme moyen ?

VL


Le Wed, 24 Dec 2003 16:04:02 +0100, Marc Lasson a écrit :

levasseur vincent wrote:

struct point_complet *tableau;
tableau = malloc(nombre_de_point * sizeof(point_complet)) ;?


"sizeof (struct point_complet)" te donnera la taille de "struct
point_complet".

et "sizeof *tableau" te donnera la taille du type que pointe tableau
(ie. un "struct point_compet".

ton malloc devient alors :
tableau = malloc (n * sizeof *tableau);
ou
tableau = malloc (n * sizeof (struct point_complet));

Le choix entre les deux reste une affaire de gout.

N'oublis pas que dans la vraie vie, les mallocs echouent.



Avatar
Marc Lasson
levasseur vincent wrote:

struct point_complet *tableau;
tableau = malloc(nombre_de_point * sizeof(point_complet)) ;?


"sizeof (struct point_complet)" te donnera la taille de "struct
point_complet".

et "sizeof *tableau" te donnera la taille du type que pointe tableau
(ie. un "struct point_compet".

ton malloc devient alors :
tableau = malloc (n * sizeof *tableau);
ou
tableau = malloc (n * sizeof (struct point_complet));

Le choix entre les deux reste une affaire de gout.

N'oublis pas que dans la vraie vie, les mallocs echouent.
--
Marc.

Avatar
Marc Lasson
levasseur vincent wrote:

Quand tu dis : "Dans la vrai vie le malloc échoue", qu'est-ce qui semble
plus sur comme moyen ?


Hey, je voulais pas dire de pas l'utiliser !
Il faut juste pas poublier de tester si le pointeur retouné n'est pas
NULL, c'est tout.

exemple pour allouer un tableau à deux dimensions;

int **creer_tableau (int x_max, int y_max)
{
int **retour;
retour = malloc (x_max * sizeof *retour);
if (retour)
{
for (int y = 0;y < y_max;y ++)
{
retour[y] = malloc (y_max * sizeof *retour);
if (!retour[y])
{
do {
y = y - 1;
free (retour[y]);
}while (y != 0);
return NULL;
}
}
}
return retour;
}

--
Marc.