encore les allocations de mémoire

encore les allocations de mémoire - C - Programmation

Marsh Posté le 16-03-2005 à 16:13:58    

bon, celle là, c'est la dernier question promis!! :D  
 
alors, j'ai en fait un tableau NxM avec M connu mais N variable. Dans ce cas là, comment je fais pour l'allocation mémoire? Quelle est la syntaxe avec malloc?
 

Reply

Marsh Posté le 16-03-2005 à 16:13:58   

Reply

Marsh Posté le 16-03-2005 à 16:21:16    

NB: je travaille en C

Reply

Marsh Posté le 16-03-2005 à 16:23:18    

Ca pourrait etre (selon les problemes, il y a des solutions plus ou moins adaptées)
1) Tu alloues un tableau de M pointeur
2) Tu alloues a chacun des M pointeurs un tableau de N (variable) données.
3) tu cesses de creer tout un tas de topics redondants et tu poste dans le meme sinon les [:jpa] seront tes amis...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 16-03-2005 à 16:25:20    

oui pardon pour les topics  :pt1cable:

Reply

Marsh Posté le 16-03-2005 à 17:45:20    

Ou sinon :
http://forum.hardware.fr/forum2.ph [...] 853&cat=10
 
Enfin faut avoir un compilo qui supporte bien cette méthode, et c'est pas assuré

Reply

Marsh Posté le 17-03-2005 à 02:24:59    

cassiopee75 a écrit :

oui pardon pour les topics  :pt1cable:


 
Tu dis "M connu" donc je présume qu'il est fixé à l'avance.
Tu dis pas de quoi est fait ton tableau alors je vais dire "float" pour l'exemple
Exemple pour M=10

Code :
  1. float *tab[10];             // Tableau de 10 pointeurs sur float
  2. int i;                      // Indice de boucle
  3. int n;                      // Variable "N"
  4. // Allocation des 10 pointeurs
  5. for (i=0; i < 10; i++)
  6.     tab[i]=(float*)malloc(n * sizeof(float));
  7. // Travail sur ta matrice: tab[x][y]=ce que tu veux
  8. // Avec "x" variant de 0 à 9 et "y" variant de 0 à (n - 1)
  9. // Libération des 10 pointeurs
  10. for (i=0; i < 10; i++)
  11.     free(tab[i]);


 
L'utilisation d'un "#define" est recommandée ici à la place de "10". Comme ça, si "M" change, tu changes le #define et tu recompiles. Certains préfèrent le "const". C'est au choix.


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-03-2005 à 06:48:33    

Heyo.
 
Le tableau n'est pas dynamic.
Voici ce que je ferai.
 

Code :
  1. #define DEFAULT_NIANIA 10
  2. float *tab;
  3. int     tab_size = DEFAULT_NIANIA;
  4. int     i;
  5. float *ptr;
  6. tab = (float **)malloc(tab_size*sizeof(float));
  7. // Pour acceder aux variable
  8. ptr = tab;
  9. for(i=0; i<tab_size; i++) {
  10.     (*ptr) = 0.32453454;
  11.     ptr += sizeof(float);
  12. }
  13. free(tab);


 
++

Reply

Marsh Posté le 17-03-2005 à 08:00:15    

plofplof a écrit :


Code :
  1. #define DEFAULT_NIANIA 10
  2. float *tab;
  3. int     tab_size = DEFAULT_NIANIA;
  4. int     i;
  5. float *ptr;
  6. tab = (float **)malloc(tab_size*sizeof(float));
  7. // Pour acceder aux variable
  8. ptr = tab;
  9. for(i=0; i<tab_size; i++) {
  10.     (*ptr) = 0.32453454;
  11.     ptr += sizeof(float);
  12. }
  13. free(tab);




Pourquoi ce cast bizarre ? Mieux vaut ne rien mettre que mettre un cast faux...


   float *tab = malloc (tab_size * sizeof *tab);
 
   if (tab != NULL)
   {
       /* ... */
 
      free (tab), tab = NULL;
   }


Et ce que tu proposes est un tableau à une dimension, pas à 2 dimensions...
 
En ce qui concerne l'accès, je me contenterais de  


for(i=0; i<tab_size; i++) {
    tab[i] = 0.32453454;
}


en effet, ptr étant de type float,  

   ptr += sizeof(float);


ne fait pas ce que tu crois. Les propriétes de l'arithmétique des pointeurs permettent

   ptr += 1;


ou  

   ptr++;



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-03-2005 à 10:56:16    

Citation :


Pourquoi ce cast bizarre ? Mieux vaut ne rien mettre que mettre un cast faux...

 
 
Pkoi ? As-tu deja compiler en -Wall ? :)
 
Ce cast est necessaire pour que le compilo ne crize po.
 
‰¥Ô¥„

Reply

Marsh Posté le 17-03-2005 à 11:24:05    

plofplof a écrit :

Citation :


Pourquoi ce cast bizarre ? Mieux vaut ne rien mettre que mettre un cast faux...

 
 
Pkoi ? As-tu deja compiler en -Wall ? :)
 
Ce cast est necessaire pour que le compilo ne crize po.
 
‰¥Ô¥„


 
Ton compilateur est nul alors :o
on ne cast jamais la sortie d'un malloc

Reply

Marsh Posté le 17-03-2005 à 11:24:05   

Reply

Marsh Posté le 17-03-2005 à 12:38:55    

Bonjour

Citation :

Pkoi ? As-tu deja compiler en -Wall ? :)  
 
Ce cast est necessaire pour que le compilo ne crize po.  
 
Ton compilateur est nul alors :o  
on ne cast jamais la sortie d'un malloc  


Quelle est la source de cette interdiction ?
j'utilise gcc sans -wall et le cast de sortie de malloc pour ne pas avoir de série de clignotants (warning)
le cast sur pointeur ne sert de toute façon qu'à passer outre les contrôles de type.
Cordialement

Reply

Marsh Posté le 17-03-2005 à 13:22:44    

plofplof a écrit :

Citation :


Pourquoi ce cast bizarre ? Mieux vaut ne rien mettre que mettre un cast faux...

 
 
Pkoi ? As-tu deja compiler en -Wall ? :)


Oui!

Citation :

Ce cast est necessaire pour que le compilo ne crize po.


J'ai pas ce problème. Il suffit de fournir le bon prototype en incluant <stdlib.h>. En C, la conversion void* <-> T* est implicite dans les deux sens. Ce n'est pas forcément vrai dans d'autres langages...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-03-2005 à 13:25:44    

db__ a écrit :

Bonjour

Citation :

Pkoi ? As-tu deja compiler en -Wall ? :)  
 
Ce cast est necessaire pour que le compilo ne crize po.  
 
Ton compilateur est nul alors :o  
on ne cast jamais la sortie d'un malloc  


Quelle est la source de cette interdiction ?


Je ne pense pas qu'il y ait d'interdiction. Le consensus est plutôt de dire que le cast est inutile (voir les FAQ de clc et de fclc). Personnellement, je ne met pas de cast.

Citation :


j'utilise gcc sans -wall et le cast de sortie de malloc pour ne pas avoir de série de clignotants (warning)
le cast sur pointeur ne sert de toute façon qu'à passer outre les contrôles de type.


Il n'y a pas de contrôle avec void* en C.
 
Montre moi un exemple de code qui fait des warnings.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-03-2005 à 19:03:23    

warning :)

Reply

Marsh Posté le 17-03-2005 à 20:06:10    

db__ a écrit :

Bonjour

Citation :

Pkoi ? As-tu deja compiler en -Wall ? :)  
 
Ce cast est necessaire pour que le compilo ne crize po.  
 
Ton compilateur est nul alors :o  
on ne cast jamais la sortie d'un malloc  


Quelle est la source de cette interdiction ?
j'utilise gcc sans -wall et le cast de sortie de malloc pour ne pas avoir de série de clignotants (warning)
le cast sur pointeur ne sert de toute façon qu'à passer outre les contrôles de type.
Cordialement


 
Tu as des warnings parce que tu n'as pas inclu stdlib.h. Le compilo suppose donc que malloc, comme n'importe quelle fonction non declaree, renvoit un int. Mettre un cast pour virer le warning n'est evidemment pas la bonne solution.
 
Cordialement.

Reply

Marsh Posté le 17-03-2005 à 22:49:46    

plofplof a écrit :

Le tableau n'est pas dynamic.


Cassiopée demande un tableau avec "M" connu donc on peut utiliser un tableau statique
 

plofplof a écrit :

Voici ce que je ferai.

float *tab;
tab = (float **)malloc(tab_size*sizeof(float));



tu déclares un ptr en "float *" et tu lui donnes un "float **"
 

plofplof a écrit :


// Pour acceder aux variable

ptr = tab;
for(i=0; i<tab_size; i++) {
    (*ptr) = 0.32453454;
    ptr += sizeof(float);
}



Si tu as deux indices reliés entre eux par un lien logique, tu peux les faire progresser tous deux en même temps dans le "for". encore faut-il savoir décaler les pointeurs... (ptr++ fonctionne puiqu'il pointe sur un "float", le C converti tout seul en "ptr+=sizeof(float)" )

for(i=0, ptr=tab; i<tab_size; i++, ptr++)
    (*ptr) = 0.32453454;
}


 
Mais ton post ne répond pas au problème initial qui était d'allouer une matrice. Toi, tu alloues (mal) un simple tableau à une dimension


Message édité par Sve@r le 17-03-2005 à 22:55:20

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 17-03-2005 à 22:51:58    

db__ a écrit :


le cast sur pointeur ne sert de toute façon qu'à passer outre les contrôles de type.
Cordialement


 
(en C oui, je me permets de signaler qu'en c++ non, a tout hasard)


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Sujets relatifs:

Leave a Replay

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