Rechercher : dans
Par :

Retourner plusieurs variable par une fonction

Dernière réponse le 14 jun 2009 à 20:04:39 abdess111, le 21 fév 2008 à 13:03:33 
 Signaler ce message aux modérateurs

Slt tt le monde
jai un probleme c'set que je veux retourner plusieurs valeurs par une fonction et j'arrive pos a reussir,je sais ke peut etre je dois utiliser un tableau(plutoto pointeur)mais quand jexecute le programme il me retourne juste la premier valeur du tableau voila un ptit exemple
#include<stdio.h>
#include<stdlib.h>
int test()
{
int *p;
p=malloc(4*sizeof(int));
*(p+0)=1;
*(p+1)=2;
*(p+2)=3;
*(p+3)=4;
return *p;
}
main()
{
int *tab,i;
tab=malloc(4*sizeof(int));
*tab=test();
for(i=0;i<4;i++)
printf("%d \n",*(tab+i));
}
voila ce programme me donne juste la premier valeur du tableau(la valeur 1)et pour les autres valeurs il me donne des adraisses.
svp jai besoin d'aide merci de maider

Configuration: Windows XP
Firefox 2.0.0.11

Meilleures réponses pour « retourner plusieurs variable par une fonction » dans :
Javascript - Les variables Voir Le concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. En Javascript, les noms de variables peuvent être aussi long que l'on désire,...
[VBA] Fonction qui retourne la couleur active d'une MFC VoirCette fonction retourne la valeur du format actif d'une mise en forme conditionnelle. Avec la fonction de la démo, deux valeurs peuvent êtres retournées. Mode = 0 : retourne la valeur de Interior.ColorIndex Mode = 1 : retourne la valeur de...
Trier un tableau sans utiliser la fonction sort VoirTrier un tableau sans utiliser la fonction sort D'abord on initialise une variable $max avec la 1ère valeur de tableau. Ensuite on va faire une boucle tant que le tableau contient encore des éléments. C'est avec la fonction splice qui a le rôle...
Quelques fonctions utiles VoirCette astuce vous montrera comment utiliser quelques fonctions très utiles en PHP: Retourne la longueur de la chaîne Utilisation Résultat Passe tous les caractères en minuscules. Utilisation Résultat Passe tous les caractères en...
Perl - Les fonctions VoirLa notion de fonction et de procédure On appelle procédure un sous-programme qui permet d'effectuer un ensemble d'instruction par simple appel de la procédure dans le corps du programme principal. Les procédure permettent d'exécuter dans plusieurs...
Les objets en langage C++ VoirLa création d'objets En C++, il existe deux façons de créer des objets, c'est-à-dire d'instancier une classe : de façon statique de façon dynamique La création statique La création statique d'objets consiste à créer un objet en lui affectant un...
VBScript - Les fonctions de date et de temps VoirLes fonctions de date et de temps Fonction Description Date Retourne la date du système DateAdd(interval, number, date) Ajoute un intervalle de temps (interval) à une...

1

mamiemando, le 21 fév 2008 à 13:47:03
  • +2

Ton programme corrigé :

#include <stdio.h>
#include <stdlib.h>

int *test(){
    int *p;
    p = malloc(4*sizeof(int));
    p[0] = 1;
    p[1] = 2;
    p[2] = 3;
    p[3] = 4;
    return p;
}

int main(){
    int *tab;
    int i;
    tab = malloc(4*sizeof(int));
    tab = test();
    for(i=0;i<4;i++) printf("%d\n",tab[i]);
    free(tab);
    return 0;
}

Bonne chance

Répondre à mamiemando

2

abdess111, le 21 fév 2008 à 13:54:28

Merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii­iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii merci bcp
mnt je peux continuer mon programme :-)

Répondre à abdess111

3

mamiemando, le 21 fév 2008 à 14:02:33

Héhé bon courage ;-)

Répondre à mamiemando

5

Char Snipeur, le 21 fév 2008 à 14:44:26

Salut.
Sinon, pour retourner plusieurs variable, tu peux aussi utiliser une structure.
Tu peux aussi retrouner des types différents, comme par exemple :

void* fct()
    {
    void *p;
    p=malloc(sizeof(int)+sizeof(double));
    *(int*)p=3;
    *(double*)((int*)p+1)=3.002;
    return p;
    }
-> 3h, j'ai rien compris à ton problème.
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

6

Char Snipeur, le 21 fév 2008 à 15:03:20

Voici un autre exemple, avec une structure pour exemple :

void* fct()
    {
    void *p;
    p=malloc(sizeof(int)*2+sizeof(double));
    *(int*)p=3;
    *(int*)(long(p)+sizeof(int))=5;
    *(double*)(long(p)+2*sizeof(int))=3.002;
    return p;
    }
int main()
{
    void *a;//=malloc(sizeof(int)+sizeof(double));  
    struct lastruct {int a;int c;double b;} *ess;
    a=fct();
    printf("a1 %d a2 %f\n",*(int*)a,*(double*)(long(a)+2*sizeof(int)));
    ess=(lastruct*)fct();
    printf("a1 %d a2 %e\n",ess->a,ess->b);
    scanf("%d",a);
    return 0;
}

Mais il faut faire attention à ce type de manipulation, car ça dépend de l'implémentation du compilateur utiliser. En particulier, les structures sont régies par un alignement des données assez complexe. Par exemple, si j'enleve la variable c de lastruct, la structure aura toujours la même taille en mémoire, le compilateur (gcc) créeant un espace vide entre a et b.
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

7

mamiemando, le 21 fév 2008 à 19:56:11

Dans le genre gore c'est pas mal :) Pourquoi tu ne retournes pas simplement directement la structure (ce qui t'évitera en plus d'oublier de faire un free).

Répondre à mamiemando

8

Char Snipeur, le 22 fév 2008 à 08:31:18

La simple envie de faire du gore ;) pour l'exemple. Mais dans un programme utile je passerai par les structures, ça mévite en plus d'oublier les free.
Salutation ! Quand on sait pas, on touche pas !JBT
Char Snipeur

Répondre à Char Snipeur

9

_mawashi, le 12 jun 2009 à 11:42:16

Salut à tous,

J'ai un doute tout d'un coup et j'aimerais être sûr de ce que je fais. Lorsqu'on déclare une variable dans un sous-programme, la mémoire qui lui est associée est libérée à la fin de l'exécution de ce sous-programme c'est bien ça ? Dans mon exemple, c'est un peu comme au dessus, je retourne un pointeur pour lequel j'ai fait un malloc.
Ma question est de savoir si le fait de finir l'exécution (de test() dans l'exemple ci'dessus) et donc de retourner le pointeur libèrera bien l'espace mémoire pris par le malloc sans avoir à faire de free ? D'après le bout de code de mamiemando ça a l'air d'être le cas mais j'aimerais en être sûr.

Merci d'avance ;)

Répondre à _mawashi

10

loupius, le 12 jun 2009 à 12:51:31

Oui et non.
Oui à la première question: une variable déclarée dans un sous-programme est libérée à la fin de l'exécution du sous-programme.
Non à la seconde question: l'espace alloué par malloc n'est pas libéré.
Explication:
Le pointeur declaré dans le sous-programme est une variable locale (dont l'adresse est dans la 'pile' (stack)); la valeur de ce pointeur est modifiée par 'malloc'; la valeur de ce pointeur est désormais une adresse de zone mémoire (qui est dans le 'tas' (heap)).
Lors de la terminaison du sous-programme, la pile est remise dans l'état précédant l'appel à ce sous-programme; en conséquence le pointeur est perdu... mais la zone mémoire antérieurement désignée par le pointeur reste allouée, et comme on a perdu l'adresse de cette zone, on se trouve avec une fuite mémoire.
Donc il y a deux solutions pour traiter les allocations dans un sous-programme:
- libération de l'espace mémoire par la fonction 'free',
- retourner le pointeur à la fonction appelante qui aura la responsabilité de la libération.
Voilà, c'est tout simple quand on a compris le mécanisme.
Bonne continuation.

Répondre à loupius

11

Char Snipeur, le 12 jun 2009 à 15:15:13

Salut.
La règle est simple : à chaque malloc() doit correspondre un free().
Les exceptions sont rares. Salutation ! (il faut bien que vous compreniez que j'ai TOUJ­OURS raison)
Char Snipeur

Répondre à Char Snipeur

12

_mawashi, le 12 jun 2009 à 20:20:31

Merci à tous les deux pour vos réponses.
Je me doutais bien que c'était comme ça, au moins maintenant je suis sûr.
Par contre par rapport aux solutions proposées par loupius, je ne sais pas comment les appliquer dans mon (qui est quasi identique à celui de ce thread).
Pour la première solution,dans notre cas, comment peut on libérer p tout en voulant le retourner ?
Après je sais pas si je vois pas non plus comment l'appelant peut le faire à moins de connaitre la variable, ce qui fait perdre tout l'intérêt à mon programme :(

Répondre à _mawashi

13

mamiemando, le 13 jun 2009 à 03:13:00

Pour la première solution,dans notre cas, comment peut on libérer p tout en voulant le retourner ?

Ca n'a pas de sens. Il faut faire le free après avoir fini d'utiliser le bloc mémoire à l'adresse p et ensuite faire un free(p).

Après je sais pas si je vois pas non plus comment l'appelant peut le faire à moins de connaitre la variable, ce qui fait perdre tout l'intérêt à mon programme :(

Je n'ai pas compris ce que tu cherchais à faire.

Répondre à mamiemando

14

_mawashi, le 14 jun 2009 à 17:50:04

Désolé mais je n'avais pas bien compris ton exemple (Mamiemando). En fait, pour moi tu ne libérais pas p mais tu libères bien l'espace par le free(tab) si j'ai (finalement) bien compris (l'adresse du pointeur ayant été retournée).

Répondre à _mawashi

15

 mamiemando, le 14 jun 2009 à 20:04:39

Oui c'est ça. À la sortie de test la variable locale p est désallouée (mais ce n'est qu'une adresse, et ça ne désalloue pas l'espace mémoire qu'elle pointe). Comme je retourne l'adresse dans ma fonction, je récupère dans main cette adresse. Une fois que je n'ai plus besoin de ce bloc mémoire je peux le désallouer avec un free.

Qui dit malloc dit free...

Répondre à mamiemando
Collection CommentÇaMarche.net