Автор Гілка: Ніби й формальність, але на нерви діє.  (Прочитано 1846 раз)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Маєм такі стрічки:
comandos[0].codegen=(void*(*)())cg_simple_fileop;
на цю стрічку компілер ні мур-мур.
comandos[1].codegen=cg_simple_fileop;
за цю лає: warning: assignment from incompatible pointer type
опсс функції (описана в тому ж файлі, що і присвоєння):
void* cg_simple_fileop(char *str,int*bc_size,void*code,function_id fid);
Ну і опис структури:
struct names{int (*labgen)();
void *(*codegen)();char *name,*description;
function_id fid;
}comandos[NWORDS];
тобто і функція повертає void* і структура таку просить, що цьому бісовому gcc ще треба?
PS
прога ніби як працює, але всеодно не можу терпіти беззмістовні попередження  >:(
PPS
Тут є проблемою така поведінка, що якщо приглушити шум, як це написано вище - можна присвоювати пойнтера на дідько зна яку функцію, а воно і не пікне. Тобто втрачається можливість перевірки  :'( і починає в якості повідомлення про помилку видавати "Segmentation fault".
« Змінено: 2009-04-08 11:41:33 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відщеплена особистість

  • Гість
Виявляється, пойнтер на функцію треба оголошувати повністю з усіма аргументами:
typedef struct names {
  int (*labgen) ();
  void *(*codegen)(char*,int*,void*,function_id);
  char *name;
  function_id fid;
  char *description;
} NAMEFUNC;
От тоді і зникнуть безглузді матюки компілятора, ну і зросте надійність кодіння ;)