persona pensamiento narrativa luhmann heterorreferencia ejercicio ejemplos autorreferente autorreferencialidad autorreferencial autorreferencia arte c struct const self-reference

pensamiento - Estructuras autorreferenciales de Const



pensamiento autorreferencial (3)

Estoy escribiendo en C.

Definí un nuevo tipo (noFunc_menuEntry) que está hecho de una estructura autorreferencial.

struct noFunc_menuEntry_tag { const char *text; struct noFunc_menuEntry_tag *up_entry; struct noFunc_menuEntry_tag *down_entry; struct noFunc_menuEntry_tag *back_entry; struct noFunc_menuEntry_tag *enter_entry; }; typedef struct noFunc_menuEntry_tag noFunc_menuEntry;

Necesito definir una serie de variables como esta:

menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6};

y así.

Entonces necesito separar la declaración y la defición de la variable, porque cada variable depende de otras variables. En un archivo de cabecera, he escrito la declaración

noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6;

etc ..., y en un archivo .c en una función, he inicializado las variables:

void menu_init(void) { menuEntry_1.text = title; menuEntry_1.up_entry = &menuEntry_2 }

y así sucesivamente para los otros miembros y variables.

Sin embargo, quiero que mis variables sean const :

const noFunc_menuEntry menuEntry_1, menuEntry_2, menuEntry_3, menuEntry_4, menuEntry_5, menuEntry_6;

Así que mi pregunta es sobre la declaración seteo y la definición de las variables const del tipo que he definido. ¿Como lo puedo hacer? ¿Estoy haciendo algo mal?

Naturalmente, si simplemente agrego const en la declaración, el compilador me informa un error cuando inicializo las variables (estoy tratando de escribir variables de solo lectura).


Podría usar una matriz , ya que una gran cantidad de item_i implica que puede ser necesario.

typedef struct noFunc_menuEntry_tag { const char *text; const struct noFunc_menuEntry_tag *up_entry; const struct noFunc_menuEntry_tag *down_entry; const struct noFunc_menuEntry_tag *back_entry; const struct noFunc_menuEntry_tag *enter_entry; } noFunc_menuEntry; int main(void) { const noFunc_menuEntry menuEntry[4] = { {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, {"", &menuEntry[0], &menuEntry[1], &menuEntry[2], &menuEntry[3]}, }; return 0; }


Si desea que estas variables sean const , entonces debe hacer la inicialización sin la función.

Pero primero, manejemos la const en la definición de tipo:

typedef struct noFunc_menuEntry_tag noFunc_menuEntry; struct noFunc_menuEntry_tag { const char *text; const noFunc_menuEntry *up_entry; const noFunc_menuEntry *down_entry; const noFunc_menuEntry *back_entry; const noFunc_menuEntry *enter_entry; };

Luego las declaraciones para el archivo de encabezado:

extern const noFunc_menuEntry menuEntry_1; extern const noFunc_menuEntry menuEntry_2; ...

Y finalmente la definición y la inicialización en el archivo fuente:

const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; const noFunc_menuEntry menuEntry_2 = {title_2, &menuEntry_3, &menuEntry_1, &menuEntry_1, &menuEntry_6}; ...


Use extern const en la declaración en el encabezado. extern solo declarará la variable para usar en el programa, sin asignar memoria. Luego proceda a definirlo en el const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on principal const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on const noFunc_menuEntry menuEntry_1 = {title_1, &menuEntry_2, &menuEntry_4, &menuEntry_1, &menuEntry_5}; .. so on