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 :

pourquoi ce prog plante ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut pourquoi ce prog plante ?
    Bonsoir,

    Ce programme devrait simplement calculer la première coordonnée de la colonne égale au produit de la matrice "matriceA" par la colonne "colonneA" :

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    void pproduit(float **matrice, float *colonne);
     
    int main(int argc, char *argv[])
    {
      float matriceA[2][2], matriceB[2][2];
      float colonneA[2], colonneB[2];
     
      matriceA[0][0]=0.839;
      matriceA[0][1]=-0.303;
      matriceA[1][0]=0.383;
      matriceA[1][1]=0.924;
     
      colonneA[0]=0.232;
      colonneA[1]=-0.08;
     
      pproduit(matriceA, colonneA);
     
      system("PAUSE");	
      return 0;
    }
     
    void pproduit(float **matrice, float *colonne)
    {      
           float prod;
           prod=matrice[0][0] * colonne[0] + matrice[0][1] * colonne[1];
    }
    Quand je l'éxecute il y a un plantage "ce programme va être arrêté..."

    J'utilise DEV-C++ sous Windows98.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par stokastik
    Bonsoir,

    Ce programme devrait simplement calculer la première coordonnée de la colonne égale au produit de la matrice "matriceA" par la colonne "colonneA" :



    Quand je l'éxecute il y a un plantage "ce programme va être arrêté..."

    J'utilise DEV-C++ sous Windows98.
    Utilise la balise code plutôt que citation pour du code...

    Un tableau de tableau ne se transforme pas un pointeur de pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    float pproduit(float (*matrice)[2] , float *colonne)
    {
      return matrice[0][0] * colonne[0] + matrice[0][1] * colonne[1];
    }
    devrait être plus proche de ce que tu veux.

    Note que par défaut il vaut mieux utiliser des double que des float.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Utilise la balise code plutôt que citation pour du code...
    Ok ça y est j'ai enfin trouvé cette balise


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float pproduit(float (*matrice)[2] , float *colonne)
    Donc le problème était dans ma façon de déclarer l'argument matrice ? J'ai lu dans un cours qu'il fallait écrire **matrice pour un tableau bidimensionnel... j'ai peut-être mal compris.

    Merci, ça a l'air de marcher

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    float **matrice, c'est pour un tableau de pointeurs (pouvant pointer vers des tableaux) : Ce n'est pas exactement un tableau bidimensionnel.

    Edit: Petite rectification (vous pouvez toujours voir l'erreur dans le post en dessous).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    float **matrice, c'est pour un tableau de tableaux :
    Non pour un tableau de pointeur.
    Pour un tableau de tableau:
    Car un tableau est remplacé par un pointeur du type des éléments du tableau pointant sur le premier élément du tableau.
    Donc un tableau de 10 tableaux est remplacé par un "pointeur sur tableau de 10 éléments" pointant sur le premier sous tableau.
    Formateur expert .Net/C#/WPF/EF Certifié MCP disponible sur Paris, province et pays limitrophes (enseignement en français uniquement).
    Mon blog : pragmateek.com

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Ok merci.

    Cependant je ne parviens toujours pas à faire ce que je veux : je voudrais que mon prog fasse le produit de la matrice par la colonne. Ceci ne marche pas :

    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
    33
    #include <stdio.h>
    #include <stdlib.h>
     
    void pproduit(float (*matrice)[2], float *colonne);
     
    int main(int argc, char *argv[])
    {
      float matriceA[2][2];
      float colonneA[2];
     
      matriceA[0][0]=0.839;
      matriceA[0][1]=-0.303;
      matriceA[1][0]=0.383;
      matriceA[1][1]=0.924;
     
      colonneA[0]=0.232;
      colonneA[1]=-0.08;
     
      pproduit(matriceA, colonneA);
     
      system("PAUSE");	
      return 0;
    }
     
    void pproduit(float (*matrice)[2], float *colonne)
    {      
           float* produit=NULL;
           float prod1, prod2;
           prod1=matrice[0][0] * colonne[0] + matrice[0][1] * colonne[1];
           prod2=matrice[1][0]*colonne[0]+matrice[1][1]*colonne[1];
           produit[0]=prod1;
           produit[1]=prod2; 
    }
    On ne peut pas créer le tableau que j'appelle "produit" de cette façon ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Avec ces quelques modifs la compilation se passe bien :

    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
    33
    34
    35
    36
    37
     #include <stdio.h>
    #include <stdlib.h>
     
    void pproduit(float *produit, float (*matrice)[2], float *colonne);
     
    int main(int argc, char *argv[])
    {
      float matriceA[2][2];
      float colonneA[2];
     
      matriceA[0][0]=0.839;
      matriceA[0][1]=-0.303;
      matriceA[1][0]=0.383;
      matriceA[1][1]=0.924;
     
      colonneA[0]=0.232;
      colonneA[1]=-0.08;
     
      float* produit;
     
      pproduit(produit, matriceA, colonneA);
     
      printf("%ld \n", produit[0]);
      printf("%ld \n", produit[1]);
     
      system("PAUSE");	
      return 0;
    }
     
    void pproduit(float *produit, float (*matrice)[2], float *colonne)
    {      
           float prod1, prod2;
           prod1=matrice[0][0] * colonne[0] + matrice[0][1] * colonne[1];
           prod2=matrice[1][0]*colonne[0]+matrice[1][1]*colonne[1];
           produit[0]=prod1;
           produit[1]=prod2; 
    }
    Mais ce n'est pas le bon résultat qui s'affiche...

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par seriousme
    Non pour un tableau de pointeur.
    Et encore, à la base, float **un_nom, ca défini un pointeur de pointeur...

    A la base, un pointeur de pointeur devrait etre réservé aux arguments fonctions ou de procédures si l'on veut qu'elles (les fonctions ou les procédures) soient en mesure de modifier physiquement le pointeur (par exemple, faire une réallocation dynamique, si tant est que ce soit possible dans le contexte)

    C'est à dire que le contenu de cette "variable" est l'adresse mémoire à laquelle on trouvera... l'adresse mémoire réelle ou se trouve un réel (dans l'exemple donné)

    Pour définir un tableau de pointeurs, c'est plutot
    qu'il faut utiliser...

    Si je suis tout à fait d'accord que, quand on définit
    on définit de facto tab comme un pointeur sur l'élément 0 du tableau, définir
    ne revient pas pour la cause à définir un tableau, il ne faut pas confondre

    aussi bien tab (et je ne parle pas ici de tab[], mais bel et bien de tab sans les crochets) que ptr sont des pointeurs, et, finalement, tout ce qu'il savent, cest:
    1- l'adresse à laquelle trouver la valeur "réelle" (enfin, il faudra quand meme initialiser ptr pour qu'il le sache )
    2- la place en mémoire qu'il devra prendre en compte quand il lira la données (sizeof(float)) dans l'exemple.

    N'oubliez jamais non plus que, de manière générale, déclarer une mat[2][2] ne revient à rien d'autre que de déclarer une mat[4], et que l'on peut alors très bien accéder aux différentes valeurs sous la forme de mat[ligne*colone+colone]...

    Meme si l'on "perd un peu de vue" les deux dimentions de la matrice, ca facilite énormément la programmation
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Quelqu'un peut me dire ce qui va pas dans mon code ?

    Bon en fait entretemps j'ai compris qu'il fallait mettre printf("%f ", produit[0]) et pas printf("%ld ", produit[0]), mais ma façon de faire ne doit pas convenir puisque mon prog plante dès que j'y rajoute un truc

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Où est-ce que tu as alloué de l'espace pour ce tableau ?

    Jc

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Ben j'ai essayé un malloc mais ça plantait. Mais en fait j'ai fait autrement maintenant et en faisant cet autrement je crois que j'ai compris comment j'aurais du faire avant

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

Discussions similaires

  1. [Conception] Pourquoi ce code plante ?
    Par bilou95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 09/10/2007, 10h52
  2. Réponses: 8
    Dernier message: 14/06/2007, 10h39
  3. pourquoi un free plante le programme?
    Par gronaze dans le forum C
    Réponses: 7
    Dernier message: 20/03/2006, 16h18
  4. [WiFi] pourquoi mon routeur plante en P2P ?
    Par Magnus dans le forum Hardware
    Réponses: 12
    Dernier message: 19/02/2006, 14h59
  5. GCC - Mon prog plante quand j'active -O1
    Par YéTeeh dans le forum Linux
    Réponses: 4
    Dernier message: 02/08/2005, 15h22

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