IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

appeler une fonction dans une autre


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut appeler une fonction dans une autre
    Bonjour,
    J'ai commencé à apprendre les pointeur il y a une semaine, et me voila devant une impasse...
    Voilà j'ai crée plusieurs fonction. L'une fais une multiplication d'une matrice, l'autre la transposé d'une matrice. L'une comme l'autre sont des procédure(elles ne renvoient rien) tous ce fais grace aux pointeurs.
    La transposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    void transpose(int t1[NBLMAX][NBCMAX], int *ligne1, int *colonne1){
     
        int l = 0;
        int c = 0;
        int k = 0;
    for (l=0;l<=*ligne1;l++)
     {
        for (c=0;c<=*colonne1;c++)
        {
            t1[c][l] = t1[l][c];
        }
     }
     
        k = *ligne1;
        *ligne1 = *colonne1;
        *colonne1 = k;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int Multiplication(int t1[NBLMAX][NBCMAX],int t2[NBLMAX][NBCMAX], int t3[NBLMAX][NBCMAX], int *l1, int *c1,int *l2,int *c2,int *l3,int *c3){
    Je voudrais utiliser la transposé dans la multiplication.
    Pour cela il me faudrais (à l'interieur de ma fonction multiplication) envoyer
    int *l1, int *c1,int *l2,int *c2 (qui sont des pointeur vers des valeurs de mon main) vers ma fonction transposé.
    Or voilà tous mes essais tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            transpose (t1, **l1, **c1);
            transpose (t2, **l2, **c2);
    Ne donne pas le bon résultat
    Comment faire passer un pointeur d'une fonction à une autre?
    J'espere avoir été clair (pas sur...)
    Merci de votre aide,
    Neo

  2. #2
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void transpose(int t1[NBLMAX][NBCMAX], int *ligne1, int *colonne1)
    Deja, ceci pose un très gros probleme. Si la matrice n'est pas carré, tu aura un SegFault (ou rien en apparence mais c'est pire).

    Je te conseille d'utiliser une structure pour syntetiser ta matrice. Je te conseille aussi de faire de l'allocation dynamique pour parer au probleme ci dessus. Si tu ne connais pas les structure, je te conseillerai de les apprendre avant les pointeurs, si tu ne connais pas l'allocation dynamique, je te conseil de ne gerer que les matrice carré pour le moment.

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pour cela il me faudrais (à l'interieur de ma fonction multiplication) envoyer
    int *l1, int *c1,int *l2,int *c2 (qui sont des pointeur vers des valeurs de mon main) vers ma fonction transposé.
    Comme ta fonction a reçu la valeur de ces adresses, il suffit simplement de les transmettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void transpose(int t1[NBLMAX][NBCMAX], int *ligne1, int *colonne1);
     
    int Multiplication(int t1[NBLMAX][NBCMAX],int t2[NBLMAX][NBCMAX], int t3[NBLMAX][NBCMAX], int *l1, int *c1,int *l2,int *c2,int *l3,int *c3){
    ....
            transpose (t1, l1, c1);
            transpose (t2, l2, c2);
    ....

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par Neotaxi Voir le message
    La transposé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (l=0;l<=*ligne1;l++)
     {
        for (c=0;c<=*colonne1;c++)
        {
            t1[c][l] = t1[l][c];
        }
     }
    Si *ligne1 et *colonne1 sont respectivement le nombre de ligne et le nombre de colonne, alors les limites de chacune des itérations ci-dessus ne sont pas bonnes.

    De plus, même dans le cas d'une matrice carrée, ton algorithme de calcul de la transposé n'est pas bon. Au final, tu ne fais que recopier la matrice triangulaire supérieure dans celle inférieure. Il te faut une variable temporaire supplémentaire et tu verras que tu peux résoudre ton problème en ne parcourant que la moitié de la matrice. Et aussi que les éléments sur la diagonale ne bouge pas

    Dans le cas d'une matrice rectangulaire, et comme le dit SoftEvans, les dimensions de ton tableau initial vont changer...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Merci de vos réponse j'ai enfin fini mon projet, il fonctionne dans tout les cas.
    J'ai utiliser la méthode de diogene, voici le code:

    La transopsé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    void transpose(int t1[NBLMAX][NBCMAX], int *ligne1, int *colonne1){
     
        int l = 0;
        int c = 0;
        int k = 0;
        int t2[100][100];
     
    for (l=0;l<=*ligne1;l++)
     {
        for (c=0;c<=*colonne1;c++)
        {
            t2[c][l] = t1[l][c];
        }
     }
     
         l = 0;
         c = 0;
     
        while (l <*ligne1){
            c = 0;
            while(c < *colonne1){
                t1[c][l] = t2[c][l];
                c = c+1;
            }
            l=l+1;
        }
            k = *ligne1;
        *ligne1 = *colonne1;
        *colonne1 = k;
     
    }
    Et voici son appel dans la fonction multiplication:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            transpose (t1, l1, c1);
            transpose (t2, l2, c2);
    transpose ne fais ici que modifier le tableau, je ne récupère pas l1,c1,l2,c2

    Bref, c'est surement pas LA solution parfaite mais elle me suffit,
    Merci à tous!
    Neo

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ceci n'empêche que les objections présentées plus haut sur le cas des matrices non carrées subsistent.

    D'ailleurs, si tu essayes avec des matrices rectangulaires, le code va planter ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (l=0;l<=*ligne1;l++)
     {
        for (c=0;c<=*colonne1;c++)
        {
            t2[c][l] = t1[l][c];
        }
     }
    Parce que à un moment ou à un autre tu vas lire ou écrire en dehors du tableau.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 47
    Par défaut
    Citation Envoyé par diogene Voir le message
    Ceci n'empêche que les objections présentées plus haut sur le cas des matrices non carrées subsistent.

    D'ailleurs, si tu essayes avec des matrices rectangulaires, le code va planter ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (l=0;l<=*ligne1;l++)
     {
        for (c=0;c<=*colonne1;c++)
        {
            t2[c][l] = t1[l][c];
        }
     }
    Parce que à un moment ou à un autre tu vas lire ou écrire en dehors du tableau.
    Mes tableaux ont des tailles de 100 sur 100 pour éviter les bug. Ligne1 et colonne1 ne servent qu'à limiter ce tableau mais ne le redimensionne pas.
    Je sais qu'il y a des solutions pour redimensionner un tableau mais je n'en suis pas encore là.

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 317
    Par défaut
    Citation Envoyé par Neotaxi Voir le message
    Je sais qu'il y a des solutions pour redimensionner un tableau mais je n'en suis pas encore là.
    Je ne peux que te conseiller de travailler l'algorithmique en parallèle de ton apprentissage du C

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  2. Appel de variables d'une fonction dans une autre fonction
    Par black cat747 dans le forum Interfaces Graphiques
    Réponses: 13
    Dernier message: 11/05/2010, 15h34
  3. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  4. Réponses: 1
    Dernier message: 25/10/2007, 18h04
  5. Appel d'une fonction dans une iframe sur un autre domaine
    Par morikann dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 16/06/2007, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo