Retour d'une fonction [DEBUTANT]

Retour d'une fonction [DEBUTANT] - C - Programmation

Marsh Posté le 26-01-2005 à 10:02:34    

Bonjour,
Je cherche à faire en C une fonction qui me renvoie plusieurs valeurs?
Avez vous une idée comment je peux faire ?
 
En fait c'est le calcul des mensualités d'un remboursement, et la fonction doit pouvoir renvoyer l'ensemble des valeurs des remboursements.
 
Merci d'avance.
A+


Message édité par sylvainleleu le 26-01-2005 à 12:46:56
Reply

Marsh Posté le 26-01-2005 à 10:02:34   

Reply

Marsh Posté le 26-01-2005 à 10:12:15    

tu peux pas. Achète un K&R :)
 


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 26-01-2005 à 10:12:32    

renvoit une structure / une liste chainée si tu ne connais pas a l'avance le nombre d'éléments
 
(ou passe la par adresse à la fonction)

Reply

Marsh Posté le 26-01-2005 à 10:23:31    

Je connais le nombre d'éléments.
Sinon c'est quoi un K&R ?

Reply

Marsh Posté le 26-01-2005 à 10:32:47    

un K&R c'est kernigan et ritchie. LE bouquin à avoir pour commencer.
 
[:benou_grilled]


Message édité par black_lord le 26-01-2005 à 10:33:03

---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 26-01-2005 à 11:58:56    


 
int tab[5];
 
void clear(char *p);
 
 :pt1cable:

Reply

Marsh Posté le 26-01-2005 à 13:04:27    

BlackGoddess a écrit :

int tab[5];
 
void clear(char *p);
 
 :pt1cable:


Ah! Y'en a au moins un qui suit!
 
Merci, corrigé.
 


---------------
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 26-01-2005 à 14:53:23    

Merci bcp pour vos réponses.
Voici le résultat de mes essais :

Code :
  1. int const MAXPERIODES=1200;
  2. float Tableau_des_versements[5][MAXPERIODES];
  3. int calcul_du_tableau_des_versements ( float *t, float M, float T, float D )
  4. {
  5.    int i,j;
  6.    for (i=0;i<5;i++)
  7.    {
  8.     for (j=0;j<MAXPERIODES;j++)
  9.     {
  10.      t[i][j]=0;
  11.     }
  12.    }
  13. }


Cela ne fonctionne pas .. Où est ce que je me suis trompé ?


Message édité par sylvainleleu le 26-01-2005 à 15:13:52
Reply

Marsh Posté le 26-01-2005 à 15:03:11    

Il me fait une erreur " la valeur indicée n'est ni un tableau ni un pointeur" à la compilation... je ne comprends pas pourquoi il attend un tableau ou un pointeur comme indice :??:

Reply

Marsh Posté le 26-01-2005 à 15:03:11   

Reply

Marsh Posté le 26-01-2005 à 15:48:04    

l'exemple du site n'est pas tres clair a ce sujet ... un pointeur peut etre accédé comme un tableau a une dimension, c'est ce qu'utilise l'exemple ... cela ne fonctionne pas avec un tableau a 2 dimensions par contre
 
float *t => tu peux ecrire t[x], mais pas t[x][y]

Reply

Marsh Posté le 26-01-2005 à 16:04:16    

Alors comment puis-je passer un tableau à 2 dimensions comme paramètre à une fonction ?

Reply

Marsh Posté le 26-01-2005 à 16:22:03    

j'espère que je dis pas une connerie mais **t :)
 
(je suis jamais sur de moi en C)


Message édité par black_lord le 26-01-2005 à 16:22:28

---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 26-01-2005 à 16:43:05    

float **t;
 
l'appelant doit l'allouer correctement :  

Code :
  1. t = malloc(X*sizeof(float*));
  2. for(int i=0; i<X; i++)
  3.   t[i] = malloc(Y*sizeof(float));

Reply

Marsh Posté le 26-01-2005 à 16:45:46    

il y a peut-etre une ecriture pour passer en paramètre un tableau à 2 dimensions ... sinon une structure peut t'aider :
 

Code :
  1. struct donnees
  2. {
  3.   float t[X][Y];
  4. };
  5. void f(struct donnees *param);

Reply

Marsh Posté le 26-01-2005 à 17:36:18    

black_lord a écrit :

j'espère que je dis pas une connerie mais **t :)


Non.


Message édité par Emmanuel Delahaye le 26-01-2005 à 17:39:16

---------------
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 26-01-2005 à 17:38:54    

BlackGoddess a écrit :

il y a peut-etre une ecriture pour passer en paramètre un tableau à 2 dimensions ...



void f(int x[X][Y]);
 
void f(int x[][Y]);



---------------
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 27-01-2005 à 13:48:31    

Un truc qui se fait en traitement d'image :
au lieu de déclarer un tableau à 2 dimensions, tu utilise un tableau à une seule dimension mais donc tu connais le nombre de lignes et nombre de colonnes.
 
Par exemple :
 

Code :
  1. //définition de la taille du tableau :
  2. #define NB_LIN=640;
  3. #define NB_COL=480;
  4. // ta fonction :
  5. int calcul_du_tableau_des_versements ( float *t )
  6. {
  7.                 int i,j;
  8.                 for (i=0;i<NB_LIN;i++)
  9.                 {
  10.                     for (j=0;j<NB_COL;j++)
  11.                     {
  12.                       //traitement de la cellule (i,j) du tableau                   
  13.                        t[i*NB_COL+j]=0;
  14.                     }
  15.                 }
  16. return 0;
  17. }
  18. int main(void)
  19. {
  20. float case;
  21. // allocation du tableau
  22. float * t = (float *)malloc(NB_LIN*NB_COL*sizeof(float));
  23. //appel de ta fonction  
  24. calcul_du_tableau_des_versements ( float *t );
  25. //acces à la case i=12, j=14 du tableau
  26. case=t[12*NB_COL+14];
  27. return 0;
  28. }


Message édité par allawos le 27-01-2005 à 13:49:53
Reply

Marsh Posté le 27-01-2005 à 14:15:32    

Je veux bien mais il y a un problème dans ton raisonnement :
Si je prends les cases[6;3] et [3;7] elles pointent toutes les 2 vers la case t[5280] donc cela ne fonctionne pas dsl
A+

Reply

Marsh Posté le 27-01-2005 à 14:34:56    

hein ? Je pense que tu te plantes ...
 
Si tu vois le tableau d'une seule dimension, en fait, tu as chaque ligne, les unes à la suite des autres (chaque ligne ayant une taille de NB_COL).
 
donc pour accéder au début de la ligne i, t'es d'accord, que tu avance dans ton tableau à une dimension, de i*NB_COL.
 
Ensuite, pour accéder à la colonne j, ben t'ajoute j ... d'ou i*NB_COL+j.
 
Je vois pas comment tu as raisonné ... ???
 
pour NB_COL=480
 
case(6,3)=tab[6*NB_COL+3]=tab[6*480+3]=tab[2883]
case(3,7)=tab[3*NB_COL+7]=tab[3*480+7]=tab[1447]
 
... tu vois ?

Reply

Marsh Posté le 27-01-2005 à 14:36:37    

Sorry j'ai fait t[6*640+3*480]
Mea culpa ...

Reply

Marsh Posté le 27-01-2005 à 14:40:15    


t'es sur ?


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 27-01-2005 à 15:12:54    

int calcul_du_tableau_des_versements(float (*t)[MAXPERIODES]);
Les parenthèses sont nécessaires à cause de la priorité des opérateurs :
- float *t[N] : déclare N pointeurs sur des float
- float (*t)[N] : déclare 1 pointeur sur un tableau de float avec N colonnes
 
Devant la lourdeur de la syntaxe, et pour prendre de meilleurs habitudes, il vaut mieux passer par une structure :

Code :
  1. typedef struct
  2. {
  3. float per[MAXPERIODES];
  4. } versement;
  5. versement Tableau_des_versements[5];
  6. int calcul_du_tableau_des_versements(versement *tab)
  7. {
  8. int i,j;
  9. for(i=0;i<5;i++)
  10.     for(j=0;j<MAXPERIODES;j++)
  11.         tab[i].per[j]=0;
  12. }

Reply

Marsh Posté le 27-01-2005 à 15:20:59    


Un T ** en parametre, c'est ok pour un tableau de pointeurs. Ca permet de simuler un tableau à 2 dimensions (utilisation de [i][j]), mais le tableau en question n'est pas linéaire. Il pourrait même avoir des lignes vides (NULL).
 
Pour un vrai tableau à deux dimensions, je le répète, le paramètre doit être de la forme 'T p[X][Y]' ou 'T p[][Y]'
 
Ca peut aussi être pointeur sur tableau : 'T (*p)[X][Y]' (je ne suis pas sûr de la syntaxe), mais ça complique le code et la maintenance... Par contre, la taille réelle est transportée...


Message édité par Emmanuel Delahaye le 27-01-2005 à 15:25:05

---------------
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 27-01-2005 à 15:22:31    

ok :jap:


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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