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 :

Probleme de cast


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut Probleme de cast
    Bonsoir
    J'ai besoin d'utiliser la fonction atan2, qui prend comme argument des double. J'essaye donc de caster mes int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int x, y;
    /*Initialisation de ces entiers
    ...
    */
    double dx = (double) x;
    double dy = (double) y;
    double angle = atan2(dy, dx);
    Et la, Bus error!
    Mes variables sont bien initialisées, aucun probleme jusqu'au cast et je ne vois pas pourquoi.
    Please help!

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Je ne vois rien d'anormal dans ce bout de code.
    Le problème vient certainement d'ailleurs. Montres un peu plus de code.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Donnees *d;
    Item co = d->tab[i]; /*le i vient d'une boucle for*/
    Gpl gp = d->g;
    int x = co.pos.x - gp.pos.x;
    int y = co.pos.y - gp.pos.y;
    double dx = (double) x;
    double dy = (double) y;
    double angle = atan2(dy, dx);
    printf("angle : %f \n", angle);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct {
    	Gpl g;
    	int Nb;
    	Item tab[];
            /*Item et Gpl sont des structures contenant les coordonnées (pos)
               sous forme de structure */
    } Donnees;
     
    typedef struct {
    	int x;
    	int y;
    } Coordonnees;

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Ben je sais pas si le code est en entier ou pas mais moi deja ya un truc qui me choque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Donnees *d;
    Item co = d->tab[i]; /*le i vient d'une boucle for*/
    Gpl gp = d->g;
    d pointe où ? Alors à moins que y'est du code manquant mais là pour moi je dirais segfault.

  5. #5
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par toto08
    ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Donnees *d;
    Item co = d->tab[i]; /*le i vient d'une boucle for*/
    Gpl gp = d->g;
    int x = co.pos.x - gp.pos.x;
    int y = co.pos.y - gp.pos.y;
    double dx = (double) x;
    double dy = (double) y;
    double angle = atan2(dy, dx);
    printf("angle : %f \n", angle);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct {
    	Gpl g;
    	int Nb;
    	Item tab[];
            /*Item et Gpl sont des structures contenant les coordonnées (pos)
               sous forme de structure */
    } Donnees;
     
    typedef struct {
    	int x;
    	int y;
    } Coordonnees;

    Il est initialisé où le pointeur "d" ?

    [EDIT] Grillé par le coureur du ciel [/EDIT]

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    Je suis allé un peu vite pour poster le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Deplacer(Donnees *d) {
        Item co = d->tab[i]; /*le i vient d'une boucle for*/
        Gpl gp = d->g;
        int x = co.pos.x - gp.pos.x;
        int y = co.pos.y - gp.pos.y;
        double dx = (double) x;
        double dy = (double) y;
        double angle = atan2(dy, dx);
        printf("angle : %f \n", angle);
    }

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    On ne va pas s'en sortir si tu nous montres du code incomplet à chaque fois...

    Fais une version de ton code reduit au strict minimum (et compilable) et tu nous le renvois. OK ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    Cette fois y'a tout. C'est une pov' méthode qui fait rien de plus pour l'instant que de calculer l'angle entre 2 points dont on connait les coordonnees.

  9. #9
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par toto08
    Cette fois y'a tout. C'est une pov' méthode qui fait rien de plus pour l'instant que de calculer l'angle entre 2 points dont on connait les coordonnees.
    Ben non il n'y a pas tout.... Et la boucle for....Et l'appel de la fonction "Deplacer"....Et........

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void Deplacer(Donnees *d) {
        int i;
        for(i=0; i<d->Nb; i++) {
            Item co = d->tab[i]; /*le i vient d'une boucle for*/
            Gpl gp = d->g;
            int x = co.pos.x - gp.pos.x;
            int y = co.pos.y - gp.pos.y;
            double dx = (double) x;
            double dy = (double) y;
            double angle = atan2(dy, dx);
            printf("angle : %f \n", angle);
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /* Callback associé a l'appui sur une touche */
    void Touche(Widget w, char *input, int up_or_down, void *data) {
    	Donnees *don = (Donnees *) data;
    	if (up_or_down == 1) {
                    /*on appuie sur une touche*/
    		const char *test = input;
    		Deplacer(don);
    	}
    }

  11. #11
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut je vois pas d'erreur!!!!!
    Les conversions du type int en double ou en float sont des conversions qui sont en principe explicite et qui ne necessite pas l'operateur cast. Ces types de conversion sont faites automatiquement par le compilateur.
    Alors je vois pas l'erreur!!! Est-ce l'erreur dont vous parlez est une erreur de compilation? d'execution? quel est sont type?

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    Ca compile bien et a l'execution, arrivé au cast, il se produit un "bus error", alors que tout s'est déroulé comme il le fallait jusque la.

  13. #13
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Pourrais tu nous montrer ton code dans son intégralité (sauf s'il est classé top secret) ?

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    Citation Envoyé par crocodilex
    Pourrais tu nous montrer ton code dans son intégralité (sauf s'il est classé top secret) ?
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    typedef struct {
    	Coordonnees pos;
    	vitesse v;
    } Item;
     
    typedef struct {
    	int x;
    	int y;
    } Coordonnees;
     
    typedef struct {
    	Gpl g;
    	int Nb;
    	Item tab[];
    } Donnees;
     
    typedef struct {
    	Coordonnees pos;
    	int NbVies;
    } Gpl;
     
    void Touche(Widget w, char *input, int up_or_down, void *data) {
    	Donnees *don = (Donnees *) data;
    	if (up_or_down == 1) {
    		const char *test = input;
    		if (strcmp(test, "z") == 0) {
    			Avancer(don);
    			redisplay(w, Largeur, Longueur, don);
    		}
    		Deplacer(don);
    	}
    }
     
    void Deplacer(Donnees *d) {
    	int i;
    	for (i=0; i<d->NbCochons; i++) {
    		Item co = d->tab[i];
    		Gpl gp = d->g;
    		int x = co.pos.x - gp.pos.x;
    		int y = co.pos.y - gp.pos.y;
    		double dx = (double)x;
    		double dy = (double)y;
    		double angle = atan2(dy, dx);
    		printf("angle : %f \n", angle);
    	}
    }
    Ya pas grand chose de plus que tout a l'heure, c'est vraiment tout ce qui concerne la méthode qui plante.

  15. #15
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par toto08
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    void Touche(Widget w, char *input, int up_or_down, void *data) {
    	Donnees *don = (Donnees *) data;
            [...]
    }
    Qui initialise "data" et comment ?

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 23
    Par défaut
    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
     
    int main(int argc, char **argv) {
     
    	Donnees *d;
    	d=malloc(sizeof(Donnees));
            /*on initialise d*/
    	InitDonnees(d);
    	init_display(argc, argv, d);
    	free(d);
    	return 0;
    }
    void init_display(int argc, char **argv, void *d) {
     
    	/* Creation et assemblage des widgets */
    	/* ......... */
     
    	GetStandardColors();
    	ShowDisplay();
     
    	/* On définit les fonctions pour les actions clavier/souris */
    	SetButtonDownCB(Grille, NULL);
    	SetButtonUpCB(Grille, NULL);
    	SetKeypressCB(Grille, Touche);
    	SetMouseMotionCB(Grille, NULL);
     
    }
    Cette fonction SetKeypressCB(Grille, Touche) definit un callback qui est appelé quand on appuie sur une touche du clavier et c'est la qu'est transmis data.

Discussions similaires

  1. Probleme de cast de string en int
    Par Oberown dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 26/04/2006, 11h48
  2. Réponses: 12
    Dernier message: 25/07/2005, 14h49
  3. [VB.NET][dataset][datagrid] probleme de Cast
    Par graphicsxp dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2005, 14h18
  4. Probleme de cast de parametres
    Par John Fullspeed dans le forum Langage
    Réponses: 3
    Dernier message: 14/10/2004, 08h43
  5. probleme de cast
    Par gaut dans le forum C++
    Réponses: 9
    Dernier message: 06/08/2004, 18h43

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