Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1146 connectés 

  FORUM HardWare.fr
  Programmation
  C

  encore les allocations de mémoire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

encore les allocations de mémoire

n°1014812
cassiopee7​5
Posté le 16-03-2005 à 16:13:58  profilanswer
 

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?
 

mood
Publicité
Posté le 16-03-2005 à 16:13:58  profilanswer
 

n°1014833
cassiopee7​5
Posté le 16-03-2005 à 16:21:16  profilanswer
 

NB: je travaille en C

n°1014837
gilou
Modérateur
Modzilla
Posté le 16-03-2005 à 16:23:18  profilanswer
 

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é!  --
n°1014843
cassiopee7​5
Posté le 16-03-2005 à 16:25:20  profilanswer
 

oui pardon pour les topics  :pt1cable:

n°1014961
leneuf22
Posté le 16-03-2005 à 17:45:20  profilanswer
 

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é

n°1015546
Sve@r
Posté le 17-03-2005 à 02:24:59  profilanswer
 

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.
n°1015557
plofplof
Posté le 17-03-2005 à 06:48:33  profilanswer
 

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);


 
++

n°1015568
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2005 à 08:00:15  profilanswer
 

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/
n°1015701
plofplof
Posté le 17-03-2005 à 10:56:16  profilanswer
 

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.
 
‰¥Ô¥„

n°1015741
Joel F
Real men use unique_ptr
Posté le 17-03-2005 à 11:24:05  profilanswer
 

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

mood
Publicité
Posté le 17-03-2005 à 11:24:05  profilanswer
 

n°1015856
db__
spécialiste de l'à peu près
Posté le 17-03-2005 à 12:38:55  profilanswer
 

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

n°1015895
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2005 à 13:22:44  profilanswer
 

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/
n°1015898
Emmanuel D​elahaye
C is a sharp tool
Posté le 17-03-2005 à 13:25:44  profilanswer
 

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/
n°1016462
plofplof
Posté le 17-03-2005 à 19:03:23  profilanswer
 

warning :)

n°1016493
matafan
Posté le 17-03-2005 à 20:06:10  profilanswer
 

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.

n°1016756
Sve@r
Posté le 17-03-2005 à 22:49:46  profilanswer
 

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.
n°1016762
chrisbk
-
Posté le 17-03-2005 à 22:51:58  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  encore les allocations de mémoire

 

Sujets relatifs
IPC memoire partagee[C++] Allocations mémoire pour stl::map
probleme allocation memoireAccess 2000 :Mémoire libre insuffisante pour mettre à jour l'affichage
Garder le résultat d'une requete en mémoire avec PHP Part 2 [Résolu]Ecrire un conteneur STL dans une mémoire partagée
Garder le résultat d'une requete en mémoire avec PHPUtilisation mémoire importante
Chargement d'un programme en mémoireDétection d'allocations mémoire
Plus de sujets relatifs à : encore les allocations de mémoire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR