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

GTK+ avec C & C++ Discussion :

initialisation de champ de structure


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut initialisation de champ de structure
    bonjour,

    Pour l'instant j' ai cette structure et cette initialisation qui marchent 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
    typedef struct
    {
        char callsign[8];
        char actype[5];
        char departure[5];
        char arrival[5];
        double rfl;
        double pfl;
        double xfl;
        double afl;
        double cfl;
        s_waypoint *route;
    } s_plane;
    s_plane *fleet[30];
     
    typedef struct {
        char wp_nom[6];
        double wp_x;
        double wp_y;
        GooCanvasItem *wp_cercle;
        GooCanvasItem *wp_label;
    } s_waypoint;
    s_waypoint *waypoints;
    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
    void plane_constructor(s_plane *plane, int nb_fixes, ...) {
        (*plane).route = malloc(nb_fixes*sizeof(*(*plane).route));
        int i=0, j=0;
        va_list ap;
        va_start(ap, nb_fixes);
        for( i=0 ; i<nb_fixes ; i++) {
            strcpy((*plane).route[i].wp_nom, va_arg(ap, char *));
            for (j=0; j<nb_wp; j++) {
                if (strcmp((*plane).route[i].wp_nom, waypoints[j].wp_nom) == 0) {
                    (*plane).route[i].wp_x = waypoints[j].wp_x;
                    (*plane).route[i].wp_y = waypoints[j].wp_y;
                    (*plane).route[i].wp_cercle = NULL;
                    (*plane).route[i].wp_label = NULL;
                    break;
                }
            }
        }
        va_end(ap);
    }
    Puis dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    s_plane avion1 = { "SWR422", "B777", "LSGG", "SKBO", 360.0, 360.0, 360.0, 360.0, 360.0};
      plane_constructor(&avion1, 5, "MTL2", "MTL", "GRENA", "LTP", "RAPID");
      fleet[0] = &avion1;
    Maintenant je voudrais tout initialiser en une ligne et j'avais prévu le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plane_constructor(fleet[0], "SWR422", "B777", "LSGG", "SKBO", 360.0, 360.0, 360.0, 360.0, 360.0, 5, "MTL2", "MTL", "GRENA", "LTP", "RAPID");
    et le constructeur :
    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 plane_constructor(s_plane *plane, char callsign[8], char actype[5], char departure[5], char arrival[5],
                           double rfl, double pfl, double xfl, double afl, double cfl, int nb_fixes, ...)
    {
     
        strcpy(plane->callsign, callsign);
        strcpy(plane->actype, actype);
        strcpy(plane->departure, departure);
        strcpy(plane->arrival, arrival);
        plane->rfl = rfl;
        plane->pfl = pfl;
        plane->xfl = xfl;
        plane->afl = afl;
        plane->cfl = cfl;
     
        (*plane).route = malloc(nb_fixes*sizeof(*(*plane).route));
        int i=0, j=0;
        va_list ap;
        va_start(ap, nb_fixes);
        for( i=0 ; i<nb_fixes ; i++) {
            strcpy((*plane).route[i].wp_nom, va_arg(ap, char *));
            for (j=0; j<nb_wp; j++) {
                if (strcmp((*plane).route[i].wp_nom, waypoints[j].wp_nom) == 0) {
                    (*plane).route[i].wp_x = waypoints[j].wp_x;
                    (*plane).route[i].wp_y = waypoints[j].wp_y;
                    (*plane).route[i].wp_cercle = NULL;
                    (*plane).route[i].wp_label = NULL;
                    break;
                }
            }
        }
        va_end(ap);
    }
    Pas de pb à la compil mais j'ai un plantage à l'éxécution du plane_constructor dès la première ligne.

    une idée ?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    Ton problème vient du fait que fleet[0] est un pointeur non initialisé.
    Donc le passant à plane_constructor(fleet[0], "SWR422", "B777", "LSGG", "SKBO", 360.0, 360.0, 360.0, ...),
    Sur la ligne strcpy(plane->callsign, callsign);

    Une solution est de remplacer la déclaration de s_plane *fleet[30]; en s_plane fleet[30];.
    Et l'appel au constructeur devient plane_constructor(&(fleet[0]), "SWR422", "B777", "LSGG", "SKBO", 360.0, 360.0, 360.0, ...).

    A+

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    bonjour,

    merci bien !
    Je n'y aurais jamais pensé tout seul.
    C'est que ça prend du temps pour se mettre dans la philosophie du C...

    Génial, ce soir je vais pouvoir bien avancer.

    Sinon et si on initialisait le pointer à NULL au départ ça irait pas ?
    Est-il préférable de mettre les parenthèses &fleet[0] ou &(fleet[0]) ?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Re

    Citation Envoyé par rollbich Voir le message
    Sinon et si on initialisait le pointer à NULL au départ ça irait pas ?
    Le problème est qu'il faut allouer la mémoire à fleet[0] avant de le passer au constructeur plane_constructor(...).
    Alors que fleet[0]==NULL ou fleet[0]== n'importe quoi, ça ne corrigera pas le problème.
    La seule façon pour que plane->callsign ne plante pas, c'est que derrière le pointeur plane il y ait la mémoire correspond au type s_plane.
    Sinon

    Citation Envoyé par rollbich Voir le message
    Est-il préférable de mettre les parenthèses &fleet[0] ou &(fleet[0]) ?
    C'est juste pour être sûr au niveau des priorités entre opérateurs.
    Mais si tu déclare s_plane fleet[30]; tu peux même écrire juste fleet.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web en Loisir
    Inscrit en
    Janvier 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web en Loisir

    Informations forums :
    Inscription : Janvier 2006
    Messages : 129
    Par défaut
    Ok merci et bonne soirée.


  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Merci, a toi aussi.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/11/2007, 09h14
  2. Réponses: 2
    Dernier message: 18/12/2006, 18h03
  3. Initialiser un champ texte avec une fonction javascript
    Par Agoye dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/06/2006, 11h26
  4. Initialiser les champs texte d'un formulaire
    Par ludobado dans le forum Access
    Réponses: 2
    Dernier message: 25/04/2006, 16h01
  5. Réponses: 5
    Dernier message: 17/05/2005, 09h34

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