Initialisation de structure statique en C

J'ai un type struct comme indiqué ci-dessous:

typedef struct position{
    float X;
    float Y;
    float Z;
    float A;
} position;

typedef struct move{
    position initial_position;
    double feedrate;
    long speed;
    int g_code;
} move;

J'essaie de statiquement l'initialiser, mais je n'ai pas trouvé le moyen de le faire. Est-ce possible?

21
demandé sur Mateusz Piotrowski 2011-10-07 22:09:28

3 réponses

Cela devrait fonctionner comme ceci:

move x = { { 1, 2, 3, 4}, 5.8, 1000, 21 };

Les initialiseurs d'accolades pour les structures et les tableaux peuvent être imbriqués.

30
répondu Kerrek SB 2011-10-07 18:14:27

C n'a pas la notion d'objet membre statique d'une structure / classe comme C++ ... en C, le mot clé static sur les déclarations de structures et de fonctions est simplement utilisé pour définir que cet objet n'est visible que par le module de code courant lors de la compilation. Donc, vos tentatives de code actuelles en utilisant le mot-clé static ne fonctionneront pas. De plus, vous ne pouvez pas initialiser les éléments de données de structure au point de déclaration comme vous l'avez fait. Au lieu de cela, vous pouvez faire ce qui suit en utilisant désigné les initialiseurs:

static struct {
    position initial_position;
    double feedrate;
    long speed;
    int g_code;
} move = { .initial_position.X = 1.2,
           .initial_position.Y = 1.3,
           .initial_position.Z = 2.4,
           .initial_position.A = 5.6,
           .feedrate = 3.4, 
           .speed = 12, 
           .g_code = 100};

Bien sûr, l'initialisation d'une structure anonyme comme celle-ci ne vous permettrait pas de créer plus d'une version du type de structure sans taper spécifiquement une autre version, mais si c'est tout ce que vous vouliez, alors il devrait faire le travail.

16
répondu Jason 2011-10-07 18:35:11
#include <stdio.h>

struct A {
    int a;
    int b;
};

struct B {
    struct A a;
    int b;
};

static struct B a = {{5,3}, 2};

int main(int argc, char **argv) {
    printf("A.a: %d\n", a.a.a);
    return 0;
}

Résultat:

$ ./ test

A. a: 5

8
répondu akappa 2011-10-07 18:12:38