C → Можно ли ссылаться на структуру из себя?

Я программист Java и новичок в структуре стиля C, у меня есть структура, содержащая функцию, которая содержит случай переключения:

typedef struct
{
 char name;
 void myFunction()
 {
 switch(?)
 {
 case "y": break;
 default: break;
 }
 }
}AXIS;

Мне было интересно, есть ли у меня способ "?" передается моему коммутатору как AXIS.name для любого имени, которое я назначаю.

Например, если у меня есть

AXIS Y={"y"}

Я хочу, чтобы Y.myFunction() вызывал случай y.

Я был бы признателен за любую помощь в этом вопросе, спасибо.

2 ответа

У вашего кода несколько проблем:

  • char name - это один символ, а не строка.
  • Вы не можете иметь функции struct member в C.
  • switch не работает со строками.

Пусть сначала зафиксирует структуру:

typedef struct
{
 char name[10]; // Maximum allowed string is 9 characters.
} AXIS;

Тогда функция:

void myFunction(AXIS * self) { // You need to pass the object pointer explicitly
 if(strcmp(self->name, "y") == 0) { // Compare string with strcmp
 // String was equal to "y"
 }
}

И, наконец, звонок:

int main(void) {
 AXIS y = {"y"};
 myFunction(&y); // Give address of an object to function
 return 0;
}


Если вы делаете C, просто поместите указатель на функцию в эту структуру, а при инициализации установите правильный:

void function_y(){...}
void function_z(){...}

typedef struct{
 void (*myFunction)();
} AXIS;

AXIS a = {function_y};

Если имя изменяется со временем, определите enum чтобы перечислять все возможные значения, которые может принимать name, вместо использования char. Затем вам нужно будет добавить параметр к myfunction функции, чтобы получить значение по name:

typedef enum {
 Y,
 Z
} AxisName;

typedef struct AXIS {
 AxisName name;
 void (*myFunction)(AXIS *);
} AXIS;

void AXISfunction(AXIS *axis){
 switch (axis->name){
 case Y:
 /*... */ 
}

AXIS a = {Y,AXISfunction};

void foo(){
 a.myFunction(&a);
}

(это в основном бедный человек ООП в С).

В C++ вы можете следовать тому же принципу (используя enum), но вам не нужен этот дополнительный параметр, и вам не нужно использовать указатель функции:

struct AXIS {
 AxisName name;
 void myFunction(){
 switch(name){
 case Y: //...
 //... 
 }
 }
};

Конечно, вы можете использовать наследование и перегрузку (например, на Java), чтобы избежать использования коммутаторов.

licensed under cc by-sa 3.0 with attribution.