Problem z extern struct

0

Witam wszystkich mam taki problem. Kompiluje złożony program w C i podczas kompilacji wyskakuje mi błąd:

array type has incomplete element type

a to są fragmenty z plików które odnoszą się do niego (tak mi się wydaje):
Kompilator pokazuje błąd tu:

//zawartość pliku struktura.h
extern struct menu_op openfiremenu[]; //tu pokazuje ten błąd

int CommandVer_func(void *pio);
int CommandStatus_func(void *pio);
int CommandStatusShort_func(void *pio);
//int CommandHelp_func(void **pio);
int CommandCtrlReg_func(void *pio);
int CommandStatReg_func(void *pio);
int CommandReset_func(void *pio);
int CommandHallValue_func(void *pio);
int CommandRegDump_func(void *pio);
int CommandMotSel_func(void *pio);

int CommandPsp_func(void *pio);
int CommandPp_func(void *pio);
int CommandPi_func(void *pio);
int CommandPlim_func(void *pio);
int CommandPmod_func(void *pio);

int CommandSff_func(void *pio);
int CommandSp_func(void *pio);
int CommandSi_func(void *pio);
int CommandSlim_func(void *pio);

int CommandCff_func(void *pio);
int CommandCp_func(void *pio);
int CommandCi_func(void *pio);
int CommandClim_func(void *pio);

int CommandGoto_func(void *pio);
int CommandTrajAcc_func(void *pio);
int CommandTrajSpd_func(void *pio);
int CommandTrajEnable_func(void *pio);

int CommandFdCtrlReg_func(void *pio);

Oto funkcjie menu_op i openfiremenu:

//menu_op
struct menu_op            
{
   char *   opt;           
   int (*func)(void * pio);
   char *   desc;   
};

//openfiremenu
struct menu_op openfiremenu[] = {
  "openfire", stooges, "OpenFire Menu",
  "ofv", CommandVer_func, "Displays version",
  "ofs", CommandStatus_func, "Displays status",
  "ofss", CommandStatusShort_func, "Displays short status (fewer parameters)",
  "ofctrl", CommandCtrlReg_func, "Write to MOTOR_CONTROL_REGISTER",
  "ofstat", CommandStatReg_func, "Read MOTOR_STATUS_REGISTER",
  "ofreset", CommandReset_func, "Reset OpenFire",
  "ofhall", CommandHallValue_func, "Read hall value",
  "ofregdump", CommandRegDump_func, "Dump motor registers",
  "ofmotsel", CommandMotSel_func, "Select motor to control",

  "ofpsp", CommandPsp_func, "Set pos set-point",
  "ofpp", CommandPp_func, "Set pos param P",
  "ofpi", CommandPi_func, "Set pos param I",
  "ofplim", CommandPlim_func, "Set pos error limit",
  "ofpmod", CommandPmod_func, "Set pos modulo",

  "ofsff", CommandSff_func, "Set speed feed-fwd",
  "ofsp", CommandSp_func, "Set speed param P",
  "ofsi", CommandSi_func, "Set speed param I",
  "ofslim", CommandSlim_func, "Set speed error limit",

  "ofcff", CommandCff_func, "Set cur feed-fwd",
  "ofcp", CommandCp_func, "Set cur param P",
  "ofci", CommandCi_func, "Set cur param I",
  "ofclim", CommandClim_func, "Set cur error limit",

  "ofgoto", CommandGoto_func, "Trajectory go to position",
  "oftacc", CommandTrajAcc_func, "Sets trajectory acceleration",
  "oftspd", CommandTrajSpd_func, "Sets trajectory max speed",
  "often", CommandTrajEnable_func, "Trajectory enable",

  "offdctrl", CommandFdCtrlReg_func, "Set FireDriver control register",
  
  NULL,
};

I teraz pytanie jak rozwiązać ten błąd?? Z góry dzięki za pomoc.

0

Musisz jasno określić liczbę elementów tej tablicy.

0

Wpisałem 27 i pojawiło się multum błędów w innym pliku;/
Nawet pokazało mi że jeden include jest błędny że pliku niby nie ma ale w kompilatorze jak klikam na niego to bez problemu mi go otwiera. Więc ten błąd chyba jest z czymś innym związany ;/

0

Ty w ogóle wiesz co piszesz? Bo to jest rzeczywiście "dość" złożone. Jeśli się mocno pogubiłeś w kodzie to koniec. Każdy rozwiązany error wywali ci kilka innych, aż w końcu wszystko wywrócisz do góry nogami.

0

Chodzi o to że ten program to gotowiec do sterowania silnikiem który dostałem z platformom, firma ma to w dupie że program nie chodzi. No po prostu masakra, znalazłem inne rozwiązanie mianowicie trza było includy przejrzeć bo niektórych brakowało a teraz wywala inne błędy i właśnie jeden z błąd z includem, którego nie ma, A JEST!
Już mnie szlak trafia z tym wszystkim ;/

0

Wpisałem 27 i pojawiło się multum błędów w innym pliku;/

Wpisałeś 27, choć ja naliczyłem 29 elementów :> Jeśli piszesz, że są jakieś błędy, to dobrze by było, gdybyś choć część tych błędów podał. Sama informacja, że jest jakiś błąd niewiele mówi.

0

chodzi o to że ten błąd już nie wyskakuje wyskakuje jeden że nie ma includa (który jest i w innych plikach nie pokazuje że go nie ma),i wyskakuje kilka błędów:
expected ')' before 'error_code'
Które odwołują się do:
plik.h

extern void alt_uCOSIIErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr);
extern void alt_NetworkErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr);
extern void alt_SSSErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr);

plik.c

void alt_uCOSIIErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr)
{
...
}
void alt_NetworkErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr)
{
...
}
void alt_SSSErrorHandler(INT8U error_code, void *expanded_diagnosis_ptr)
{
...
}

Błędy odwołują się do tych linii

0

Co robi przecinek po tym NULL'u na koncu tablicy ?

0

Nie ma on większego znaczenia;/
po usunięciu to samo. Poprzednie błędy były z mojej winy, gdyż zmieniłem linijke:
extern struct menu_op openfiremenu[];
na taką:
extern struct menu_op *openfiremenu[];

Przez moją nieuwagę;/ więc wróciłem do startowego i owy błąd czy to z 27 czy 29 elementami ciągle to samo:
array type has incomplete element type

;/

0

ludzie przecież to proste jak konstrukcja cepa:
W pliku nagłówkowym:

struct menu_op           
{
   char *   opt;           
   int (*func)(void * pio);
   char *   desc;   
};

extern menu_op openfiremenu[]; //pewnie jeszcze powinno byc const

W pliku cpp:

menu_op openfiremenu[]  = {  //pewnie jeszcze powinno byc const
  {"openfire", stooges, "OpenFire Menu"},
.... // i dalej wiadomo co

   {0, 0, 0} // zamiast tego NULL
};

0

no niby proste :P ale nie podziałało;/
struct menu_op jest w pliku nagłuwkowym ale innym, niż extern struct menu_op openfiremenu[];

Nawet wkleiłem struktóre menu_op do pliku nagłuwkowego gdzie jest extern struck, próbowałem również zmieniać nie wiele sposobów const struct ... itp itd ale ciągle to samo, albo błędy te z nawiasami co wcześniej wyskakiwały poprzez dodanie przed openfiremenu[] gwiazdki (łopatologicznie mówiąc).

Jak widać problem nie jest prosty ;/

0

Coś więcej naknociłeś.
U mnie (mingw) działa bez problemu.

pik nagłówkowy:

#ifndef MENU_OP_H
#define MENU_OP_H

struct menu_op
{
    const char *   opt;
    int (*func)(void *);
    const char *   desc;
};

extern menu_op openfiremenu[];

#endif // MENU_OP_H

plik cpp:

#include "menu_op.h"

int func1(void *)
{
    return 0;
}

int func2(void *)
{
    return 2;
}

struct menu_op openfiremenu[] = {
    {"openfire", func1, "OpenFire Menu"},
    {"openfire", func2, "OpenFire Menu"}
};
0

Nie wiem co robie źle :( ale mi nie chodzi. Oto kody z trzech plików o które sie rozchodzi:
menu.h

#ifndef MENU_H
#define  MENU_H   1

#include "in_utils.h"
struct menu_op                /* structure to describe each menu item */
{
   char *   opt;              /* the option name */
   int (*func)(void * pio);   /* routine name to execute the option */
   char *   desc;             /* description of the option */
};


#define  CBUFLEN     128            /* size of cbuf */
extern   char        cbuf[CBUFLEN]; /* user command line buffer */

#define  MAX_MENUS   25
extern   struct menu_op *menus[MAX_MENUS];      /* master menu list */
extern   char *versions[MAX_MENUS];             /* master version list */

/* menu routine prototypes: */
extern   int      install_menu(struct menu_op * newmenu);   /* add new menu */
extern   int      install_version(char * version);       /* add new version */
extern   char *   getcmd(void);           /* get cmdline into cbuf while spinning tasks */
extern   void     showmenu(void * pio, struct menu_op *);
extern   int      help(void * pio);       /* display menu prompt text */
extern   int      stooges(void * pio);    /* called when system breaks */
extern   int      do_command(void * pio); /* parse & perform command */
extern   char *   nextarg(char*);         /* get nexxt arg from a string */
extern   int      stlen(char*);           /* like strlen, but not exactly */
extern   int      stcmp(char*, char*);    /* like strcmp, but not exactly */
extern   int      setdebug (void * pio);
extern   int      arp_stats(void * pio);
extern   u_long   sysuptime(void);

char **parse_args(char *buf, int argc, int *pargc_index);

#endif   /* MENU_H */

of_cmd.h


#ifndef __OF_CMD_H
#define __OF_CMD_H

#define ARG_SIZE 256

extern struct menu_op openfiremenu[];

int CommandVer_func(void *pio);
int CommandStatus_func(void *pio);
int CommandStatusShort_func(void *pio);
//int CommandHelp_func(void **pio);
int CommandCtrlReg_func(void *pio);
int CommandStatReg_func(void *pio);
int CommandReset_func(void *pio);
int CommandHallValue_func(void *pio);
int CommandRegDump_func(void *pio);
int CommandMotSel_func(void *pio);

int CommandPsp_func(void *pio);
int CommandPp_func(void *pio);
int CommandPi_func(void *pio);
int CommandPlim_func(void *pio);
int CommandPmod_func(void *pio);

int CommandSff_func(void *pio);
int CommandSp_func(void *pio);
int CommandSi_func(void *pio);
int CommandSlim_func(void *pio);

int CommandCff_func(void *pio);
int CommandCp_func(void *pio);
int CommandCi_func(void *pio);
int CommandClim_func(void *pio);

int CommandGoto_func(void *pio);
int CommandTrajAcc_func(void *pio);
int CommandTrajSpd_func(void *pio);
int CommandTrajEnable_func(void *pio);

int CommandFdCtrlReg_func(void *pio);

#endif

of_cmd.c

...
...
#include "menu.h"

#include "of_cmd.h"
...
...

struct menu_op openfiremenu[] = {
		{"openfire", stooges, "OpenFire Menu"},
		{"ofv", CommandVer_func, "Wyświetla wersje"},
		{"ofs", CommandStatus_func, "Wyświetla status"},
		{"ofss", CommandStatusShort_func, "Wyświetla krótki status (kilka parametrów)"},
		{"ofctrl", CommandCtrlReg_func, "Zapisz do MOTOR_CONTROL_REGISTER"},
		{"ofstat", CommandStatReg_func, "Odczytaj MOTOR_STATUS_REGISTER"},
		{"ofreset", CommandReset_func, "Resetuj OpenFire"},
		{"ofhall", CommandHallValue_func, "Odczytaj wartość hall"},
		{"ofregdump", CommandRegDump_func, "Dump motor registers"},
		{"ofmotsel", CommandMotSel_func, "Wskaż silnik którym chcesz sterować"},

		{"ofpsp", CommandPsp_func, "Set pos set-point"},
		{"ofpp", CommandPp_func, "Set pos param P"},
		{"ofpi", CommandPi_func, "Set pos param I"},
		{"ofplim", CommandPlim_func, "Set pos error limit"},
		{"ofpmod", CommandPmod_func, "Set pos modulo"},

		{"ofsff", CommandSff_func, "Set speed feed-fwd"},
		{"ofsp", CommandSp_func, "Set speed param P"},
		{"ofsi", CommandSi_func, "Set speed param I"},
		{"ofslim", CommandSlim_func, "Set speed error limit"},

		{"ofcff", CommandCff_func, "Set cur feed-fwd"},
		{"ofcp", CommandCp_func, "Set cur param P"},
		{"ofci", CommandCi_func, "Set cur param I"},
		{"ofclim", CommandClim_func, "Set cur error limit"},

		{"ofgoto", CommandGoto_func, "Ustawia pozycje trajektorii"},
		{"oftacc", CommandTrajAcc_func, "Ustawia przyspieszenie trajektorii"},
		{"oftspd", CommandTrajSpd_func, "Ustawia max prędkość trajektorii"},
		{"often", CommandTrajEnable_func, "Trajektoria włączona"},

		{"offdctrl", CommandFdCtrlReg_func, "Ustaw rejestr kontrolny FireDriver'a"},
  
		{0, 0, 0}
};
...
...


Błąd który wyskakuje jest w of_cmd.h.
0

Wywal z of_cmd.c linię #include "menu.h", dodaj ją w of_cmd.h.

0

nic nie dało dodatkowo wyskoczył błąd że niby takiego pliku nie ma. a reszta ta sama z array....

Jakieś inne pomysły??
:(

0

Czy menu.h leży w tym samym katalogu co of_cmd.h?

0

nie ale jest wskazany jako include i inne pliki korzystające z niego nie mają problemu, a sam plik pojawia się poprzez otwarcie go przez program obsługujący kompilator (kompilator obsługuje poprzez NIOS II Software Build Tool for Eclipse).

0

nie ale jest wskazany jako include (...)

Rozumiem, że mówisz o katalogu ustawionym w opcjach projektu. Chodzi mi o opcję, gdzie ustawiasz ścieżki do katalogów z nagłówkami.

0

no tak nawet wrzuciłem plik osobno i to samo nawet gorzej bo ma on odwołania do innych plików itd. Teraz dodałem bezpośrednio wszystkie pliki do projektu a nie za pośrednictwem programu i jego funkcji dodającej Includy. No i nic się nie zmieniło ciągle ten sam błąd. :(

0

temat do zamknięcia stqwierdziłem, że kod napisze po swojemu korzystając tlyko z niektórych plików i funkcji z gotowca. Mimo wszystko dzięki wielkie za pomoc [browar]

1 użytkowników online, w tym zalogowanych: 0, gości: 1