web-dev-qa-db-fra.com

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é de moyen de le faire. Est-ce possible?

21
Peretz

Cela devrait fonctionner comme ceci:

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

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

31
Kerrek SB

C n'a pas la notion d'un 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 cet objet comme étant uniquement visible par le module de code actuel lors de la compilation. Par conséquent, vos tentatives de code actuelles à l'aide du 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 initialiseurs désignés :

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 en taper spécifiquement une autre version, mais si c'est tout ce que vous vouliez, alors cela devrait faire le travail.

18
Jason
#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
akappa