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

  FORUM HardWare.fr
  Programmation
  C

  Allocation de tableau dans une fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Allocation de tableau dans une fonction

n°1323191
Toea
Posté le 11-03-2006 à 02:15:55  profilanswer
 

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)

mood
Publicité
Posté le 11-03-2006 à 02:15:55  profilanswer
 

n°1323192
matafan
Posté le 11-03-2006 à 02:47:21  profilanswer
 

C'est quoi "num" ?

n°1323193
Pillow
'cos the trees won't talk
Posté le 11-03-2006 à 02:53:25  profilanswer
 

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

n°1323204
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 08:45:07  profilanswer
 

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/
n°1323208
Sve@r
Posté le 11-03-2006 à 09:25:45  profilanswer
 

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.
n°1323209
HUGULUGUS
Posté le 11-03-2006 à 09:29:48  profilanswer
 

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

n°1323210
++fab
victime du syndrome IH
Posté le 11-03-2006 à 09:34:17  profilanswer
 

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]

n°1323212
HUGULUGUS
Posté le 11-03-2006 à 09:37:18  profilanswer
 

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

n°1323214
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 09:48:27  profilanswer
 

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/
n°1323215
ritzle
Posté le 11-03-2006 à 09:48:33  profilanswer
 

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:

mood
Publicité
Posté le 11-03-2006 à 09:48:33  profilanswer
 

n°1323216
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 09:50:21  profilanswer
 

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/
n°1323217
HUGULUGUS
Posté le 11-03-2006 à 09:51:50  profilanswer
 

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...

n°1323218
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 09:52:55  profilanswer
 

++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/
n°1323219
HUGULUGUS
Posté le 11-03-2006 à 09:54:38  profilanswer
 

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

n°1323220
++fab
victime du syndrome IH
Posté le 11-03-2006 à 09:57:11  profilanswer
 


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

n°1323221
HUGULUGUS
Posté le 11-03-2006 à 09:58:31  profilanswer
 

Non

n°1323222
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 09:58:43  profilanswer
 

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/
n°1323223
HUGULUGUS
Posté le 11-03-2006 à 10:00:35  profilanswer
 

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

n°1323224
HUGULUGUS
Posté le 11-03-2006 à 10:03:33  profilanswer
 

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

n°1323226
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 10:06:18  profilanswer
 

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/
n°1323227
ritzle
Posté le 11-03-2006 à 10:07:15  profilanswer
 

:lol:

n°1323228
HUGULUGUS
Posté le 11-03-2006 à 10:08:31  profilanswer
 

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

n°1323229
Emmanuel D​elahaye
C is a sharp tool
Posté le 11-03-2006 à 10:10:09  profilanswer
 

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/
n°1323231
skelter
Posté le 11-03-2006 à 10:32:22  profilanswer
 

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 ?

n°1323426
Sve@r
Posté le 11-03-2006 à 19:35:27  profilanswer
 

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.
n°1323428
Sve@r
Posté le 11-03-2006 à 19:39:52  profilanswer
 


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.
n°1323653
Toea
Posté le 12-03-2006 à 14:00:33  profilanswer
 

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
n°1323654
Toea
Posté le 12-03-2006 à 14:07:04  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  Allocation de tableau dans une fonction

 

Sujets relatifs
Fonction Subtotal : placer une variable dans le paramètre TotalList[C++] Les différents types de pointeurs sur fonction ?
aide php! affichage dans un tableauModification de données dans un tableau à l'aide d'une macro
aide dans un tableau php[VBA] Excel : problème avec la fonction Print
allocation de mémoire alignéeJe cherche une fonction equivalente à foreach() ?
Suppression de fichiers en fonction d'une date.Problème d'allocation d'un tableau dans une fonction
Plus de sujets relatifs à : Allocation de tableau dans une fonction


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