Allocation de tableau dans une fonction

Allocation de tableau dans une fonction - C - Programmation

Marsh Posté le 11-03-2006 à 02:15:55    

Bon, je lutte, j'ai recherché sur tout le net, et dans toute les langues, et je ne vois pas où je me trompe... Voici une version résumée de mon problème, quelqu'un pourrait me dire où est que je me plante ?
 
Le code:

Code :
  1. #include <tout_ce_quil_faut.h>
  2. main()
  3. {
  4.     void my_fct(int **, int);  /* ma fonction où y'a un truc qui marche mal */
  5.     int i;
  6.     int *tab = NULL;   /* Un tableau d'entiers */
  7.    
  8.     for(i=0,i<2,i++)
  9.     {
  10.         my_fct(&tab,i);     /* Je passe l'adresse de mon tableau comme paramètre de ma fonction, en plus de i*/
  11.         printf("pour i = %d, resultat = %d\n",i,tab);
  12.     }
  13. }
  14. void my_fct(int **p_tab, int nb)
  15. {
  16.     if ( (*p_tab = (int *) realloc(*p_tab,(nb+1)*sizeof(int))) == NULL )    /* Je fais de la place pour l'élément suivant dans tab par le bias de *p_tab */
  17.     {
  18.         printf("Y'a un truc qu'a pas marché au niveau de l'allocation..." );
  19.         exit(1);
  20.     }
  21.     *p_tab[num] = num*num+2;    /* par exemple...*/
  22. }


 
Le résultat: premier tour de boucle, ça marche bien, on a un "[i]pour i = 0, resultat = 2" (ou un autre résultat correct si on change la formule)
Deuxième tour de boucle, Segmentation fault au niveau de la ligne 23 alors qu'il n'y a pas eu d'erreur d'allocation de signalée...
Je pensais pourtant qu'en passant l'adresse du pointeur du tableau (&tab) dans un pointeur de pointeur entier (**p_tab), je pouvais travailler librement sur mon tableau dans la fonction, mais à priori...
 
Elle est où ma bourde s'il vous plait.. là, j'agonise devant mon pc...
 
Merci beaucoup à qui me répondra !
 
(Remarque: en faisant *p_tab = (int *) realloc(*p_tab,(nb+1)*sizeof(int)) sans passer par un pointeur temporaire, je sais que risque de perdre complètement mon pointeur originel si realloc échoue, mais ça simplifie le problème de s'en passer ici)
 
(Remarque 2: pour info, c'est compilé avec du gcc 3.2.3 sous unix)

Reply

Marsh Posté le 11-03-2006 à 02:15:55   

Reply

Marsh Posté le 11-03-2006 à 02:47:21    

C'est quoi "num" ?

Reply

Marsh Posté le 11-03-2006 à 02:53:25    

En C, [] est prioritaire par rapport à *.
 
Ta ligne 23 devrait être : (*p_tab)[num] = num*num+2;  
 
 
(et la prochaine fois, poste du code compilable...)

Reply

Marsh Posté le 11-03-2006 à 08:45:07    

Toea a écrit :

Bon, je lutte, j'ai recherché sur tout le net, et dans toute les langues, et je ne vois pas où je me trompe... Voici une version résumée de mon problème, quelqu'un pourrait me dire où est que je me plante ?


Il faut ecrire des choses simples...
 
http://mapage.noos.fr/emdel/notes.htm#malloc
http://mapage.noos.fr/emdel/notes.htm#realloc
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. static void my_fct(int **p_tab, int nb)
  4. {
  5.   /* Je fais de la place pour l'élément suivant dans tab par le bias de *p_tab */
  6.   int *p_new = realloc (*p_tab, (nb + 1) * sizeof * p_new);
  7.   if (p_new == NULL )
  8.   {
  9.      printf("Y'a un truc qu'a pas marché au niveau de l'allocation...\n" );
  10.      free (*p_tab);
  11.      *p_tab = NULL;
  12.   }
  13.   else
  14.   {
  15.      *p_tab = p_new;
  16.      (*p_tab)[nb] = nb + 1;    /* par exemple...*/
  17.   }
  18. }
  19. int main(void)
  20. {
  21.   int i;
  22.   /* Un tableau dynamique d'entiers non cree */
  23.   int *tab = NULL;
  24.   for (i = 0; i < 2; i++)
  25.   {
  26.      my_fct (&tab, i);
  27.      if (tab != NULL)
  28.      {
  29.         printf("pour i = %d, resultat = %d\n", i, tab[i]);
  30.      }
  31.   }
  32.   return 0;
  33. }


D'autre part, je conseille de mémoriser la taille et donc de gérer le tableau dynamique avec un objet  
 

Code :
  1. struct tab_dyn_<T>
  2. {
  3.   size_t size; /* EDIT */
  4.   <T> *p;
  5. };

Message cité 2 fois
Message édité par Emmanuel Delahaye le 11-03-2006 à 09:48:46

---------------
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 11-03-2006 à 09:25:45    

Emmanuel Delahaye a écrit :

Code :
  1. struct tab_dyn_<T>
  2. {
  3.   size_t *size;
  4.   <T> *p;
  5. };



 
Euh, pourquoi un pointeur de type "size_t" et non une simple variable pour stocker la taille de "p" ???  :p

Message cité 1 fois
Message édité par Sve@r le 11-03-2006 à 09:26:06

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

Marsh Posté le 11-03-2006 à 09:29:48    

Bonjour,
 
Puis-je faire une incursion dans votre discution (sujet programmation TCL, décodage d'une expression réguliére) . ?
Merci

Reply

Marsh Posté le 11-03-2006 à 09:34:17    

Emmanuel Delahaye a écrit :


Code :
  1. struct tab_dyn_<T>
  2. {
  3.    size_t *size;
  4.    <T> *p;
  5. };




 
un besoin de généricité ? de stocker la taille du tableau "avec" le tableau ?
Ce problème a sa solution  [:thalis] Le C++  [:thalis]

Reply

Marsh Posté le 11-03-2006 à 09:37:18    

:jap: Bonjour,
 
Puis-je faire une incursion dans votre discussion (sujet programmation TCL, décodage d'une expression régulière) . ?  
Merci

Reply

Marsh Posté le 11-03-2006 à 09:48:27    

Sve@r a écrit :

Euh, pourquoi un pointeur de type "size_t" et non une simple variable pour stocker la taille de "p" ???  :p


Brain fart! Je corrige.
 


---------------
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 11-03-2006 à 09:48:33    

HUGULUGUS a écrit :

:jap: Bonjour,
 
Puis-je faire une incursion dans votre discussion (sujet programmation TCL, décodage d'une expression régulière) . ?  
Merci


c'est quoi ca ?  :sweat:

Reply

Marsh Posté le 11-03-2006 à 09:48:33   

Reply

Marsh Posté le 11-03-2006 à 09:50:21    

HUGULUGUS a écrit :

Puis-je faire une incursion dans votre discussion (sujet programmation TCL, décodage d'une expression régulière) . ?


Non. Crée un nouveau sujet, et dans le bon forum (ici, c'est langage C).


---------------
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 11-03-2006 à 09:51:50    

Les expressions réguliéres sont utilisées en programmation comme "filtre" sur une chaîne de programmation.
On les retrouve en C, C++, TCL , Pyton ...
J'ai simplement besoin d'aide pour le décodage d'une chaîne...

Reply

Marsh Posté le 11-03-2006 à 09:52:55    

++fab a écrit :

Ce problème a sa solution  [:thalis] Le C++  [:thalis]


TROLL ALERT


---------------
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 11-03-2006 à 09:54:38    

Puisqu'il est utilisé en C++, pouvez-vous m'aider a la comprendre ?

Reply

Marsh Posté le 11-03-2006 à 09:57:11    


Apparemment, tu n'a pas compris le ton du message ...

Reply

Marsh Posté le 11-03-2006 à 09:58:31    

Non

Reply

Marsh Posté le 11-03-2006 à 09:58:43    

HUGULUGUS a écrit :

Puisqu'il est utilisé en C++, pouvez-vous m'aider a la comprendre ?


T'es bouché ou quoi ? Ici c'est le forum C. pas C++.  
 
Et n'insiste pas. Je viens de faire réparer mon trollomètre et il a ses vapeurs, le pauvre...
 
http://webpages.charter.net/rdsknsfan/Troll-O-Meter.gif


Message édité par Emmanuel Delahaye le 11-03-2006 à 09:59:29

---------------
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 11-03-2006 à 10:00:35    

Désolé, j'ai l'habitude de dépanner les gens, c'est mon boulot, on n'a pas la même conception du service;
By au forum, c'est triste
Hugues

Reply

Marsh Posté le 11-03-2006 à 10:03:33    

De plus, vous ne savez pas lire:
 
On les retrouve en C, C++, TCL , Pyton ...  

Reply

Marsh Posté le 11-03-2006 à 10:06:18    

HUGULUGUS a écrit :

Désolé, j'ai l'habitude de dépanner les gens, c'est mon boulot, on n'a pas la même conception du service;
By au forum, c'est triste
Hugues


Commence par lire les regles du forum au lieu de débarquer au milieu d'un conversation...
 
Et tes leçons de morale à deux balles sur l'aide et le service, tu te les gardes, parce qu'ici, aider les gens on ne fait que ça. Et bénévolement, je te le rappelle...


Message édité par Emmanuel Delahaye le 11-03-2006 à 10:09:43

---------------
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 11-03-2006 à 10:07:15    

:lol:

Reply

Marsh Posté le 11-03-2006 à 10:08:31    

Je suis parti... chercher de l'aide ailleurs.
 
Hugues

Reply

Marsh Posté le 11-03-2006 à 10:10:09    

HUGULUGUS a écrit :

Je suis parti... chercher de l'aide ailleurs.


Sur le bon forum, peut être !
 


---------------
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 11-03-2006 à 10:32:22    

quelqu'un à déja vu un équivalent de la STL mais en C, une bibliothèque de conteneurs générique avec itérateurs et algorithmes génériques ?

Reply

Marsh Posté le 11-03-2006 à 19:35:27    

Emmanuel Delahaye a écrit :

Brain fart! Je corrige.


 
Pas la peine, ça marche quand-même avec un pointeur. Faut juste l'allouer de "1 *sizeof(size_t)" avant de s'en servir et ne pas oublier de le "freeer" ensuite
On peut aussi utiliser ce pointeur pour stocker une taille au lieu d'une adresse. Faut juste le caster quand on veut s'en servir  :p  :p


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

Marsh Posté le 11-03-2006 à 19:39:52    


Et ca te coutait quoi d'ouvrir un nouveau topic plutôt que d'intervenir ici ???
 

HUGULUGUS a écrit :

By au forum,  
Hugues


 
Bon, aussi vite il est venu aussi vite il est reparti. Tu nous manqueras... :sweat: (euh, en fait non  :sol: )


Message édité par Sve@r le 11-03-2006 à 19:40:57

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

Marsh Posté le 12-03-2006 à 14:00:33    

Ah !! Merci beaucoup... En plus, il me semble m'être déjà fait avoir avec cette histoire de [] prioritaire sur *.. ah, ça va mieux ! (et désolé pour le nom compilable, c'est vrai que je ne l'ai pas testé du tout...)
 
Merci Emmanuel Delahaye pour les autres conseils. Mais j'avais précisé dans mon message que je ne passais pas par un pointeur temporaire pour "simplifier" mon problème, ou du moins sa présentation. Et question de débutant: à quoi ça sert de mémoriser la taille et donc de gérer le tableau dynamique avec un objet ?


Message édité par Toea le 12-03-2006 à 14:01:49
Reply

Marsh Posté le 12-03-2006 à 14:07:04    

Ok, en réfléchissant deux secondes, j'ai compris l'intéret de la structure...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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