#1 2016-10-27 09:02:52

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,446

error: 'flow_cmd_*************' undeclared here (not in a function )

всем привет,   есть проблема которую не знаю как решать,
у гугла бы спросил, да как правильно   вопрос поставить непонятно

есть у меня описание структуры

typedef struct {
    char * CMD;
    TE_TYPE_CONFIG_CMD COMMAND;
    TFunctionStatus (*flow_)(unsigned long ID);
} TD_TEXT_CMD;

например так
const TD_TEXT_CMD TEXT_CMD [ ]  =
{
{ "HELLO"                ,COMMAND_HELLO,                     flow_command_hello },
...
}
после добавление 4 новых команд
ошибка компиляции

50: error: 'flow_cmd_hello'  undeclared here (not in a function)
51: error: 'flow_cmd_*************'  undeclared here (not in a function)
52: error: 'flow_cmd_*************'  undeclared here (not in a function)
53: error: 'flow_cmd_*************'  undeclared here (not in a function)

все работает(ло) , но с некоторых времен добавление новых    функций  , напрмер:
новая функция flow_command_hello которую добавил к > 50 командам  не компилится, показывает  ошибку  - не видит тут ( в данном случае здеся (иных слов нет) )  функцию, которая отлично видится и вызывается без каких либо варнингов ,

итого - новые команды работают, только  если только ручками вызываю их обработку

ключи
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -Wall -ffunction-sections -g -O0 -c -DSTM32F103VET6 -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER -D__ASSEMBLY__ -DSTM32F103VE -D

по сути,
что то не учел, если кто знает причину - маякните плс

sizeof(TEXT_CMD)   936b , уменьшение кол. ячеек в TEXT_CMD не помогает.
просто не работает добавление новых функций в данную структуру

add
flow_command_hello  расположена в файле со структурой, так же не вызывает никаких вопросов у GNU Tools ARM Embedded  4.9 2015q1
add
папку "дебажную" удалял.

add
CooCox CoIDE
Version: 1.7.8
Build id: 20150206-3334-1557
CooCox CoIDE is a free software product.

Редактировался NoName (2016-10-27 13:12:40)

#2 2016-10-27 15:47:12

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,446

Re: error: 'flow_cmd_*************' undeclared here (not in a function )

через "попу" решается так

TFunctionStatus  flow_cmd_hello ( unsigned long ID );

const TD_TEXT_CMD TEXT_CMD [ ]  =
{
{ "HELLO"                ,COMMAND_HELLO,                     flow_command_hello },
...
}

сама же функция в нужном файле, но неприятный осадок остался.

#3 2016-11-08 01:29:09

Saddamko
Участник
Зарегистрирован: 2016-10-20
Сообщений: 23

Re: error: 'flow_cmd_*************' undeclared here (not in a function )

Непонял, что такое

TFunctionStatus  flow_cmd_hello


А все остальное работает:

typedef int TE_TYPE_CONFIG_CMD ;

typedef struct {
   char *CMD;
   TE_TYPE_CONFIG_CMD COMMAND;
   float TFunctionStatus;
   //    TFunctionStatus (*flow_)(unsigned long ID);
}TD_TEXT_CMD;

float flow_command_hello1,flow_command_hello2,flow_command_hello3,flow_command_hello4,flow_command_hello5,flow_command_hello6;

int COMMAND_HELLO1=1;
int COMMAND_HELLO2=2;
int COMMAND_HELLO3=3;
int COMMAND_HELLO4=4;
int COMMAND_HELLO5=5;
int COMMAND_HELLO6=6;


const TD_TEXT_CMD TEXT_CMD[]  =
{
{"HELLO1"                ,COMMAND_HELLO1,                     flow_command_hello1 },
{"HELLO2"                ,COMMAND_HELLO2,                     flow_command_hello2 },
{"HELLO3"                ,COMMAND_HELLO3,                     flow_command_hello3 },
{"HELLO4"                ,COMMAND_HELLO4,                     flow_command_hello4 },
{"HELLO5"                ,COMMAND_HELLO5,                     flow_command_hello5 },
{"HELLO6"                ,COMMAND_HELLO6,                     flow_command_hello6 }
};


void setup() {
  // put your setup code here, to run once:
  int i;
  Serial.begin(9600);

  for (i=0; i<6; i++)
  {
  Serial.print(TEXT_CMD[i].CMD);Serial.print("=");Serial.println(TEXT_CMD[i].COMMAND);
  }
  
}

void loop() {
  // put your main code here, to run repeatedly:

}

#4 2016-11-08 10:16:26

NoName
Customer
Из Київ
Зарегистрирован: 2014-07-08
Сообщений: 1,446

Re: error: 'flow_cmd_*************' undeclared here (not in a function )

привет, с этим рекомендую разобраться
пример от ESP8266

at_funcationType at_fun[at_cmdNum]={
  {NULL, 0, NULL, NULL, NULL, at_exeCmdNull},
  {"E", 1, NULL, NULL, at_setupCmdE, NULL},
  {"+RST", 4, NULL, NULL, NULL, at_exeCmdRst},
  {"+GMR", 4, NULL, NULL, NULL, at_exeCmdGmr},
  {"+GSLP", 5, NULL, NULL, at_setupCmdGslp, NULL},
  {"+IPR", 4, NULL, NULL, at_setupCmdIpr, NULL},
...
}
где 

typedef struct
{
	char *at_cmdName;
	int8_t at_cmdLen;
  void (*at_testCmd)(uint8_t id);
  void (*at_queryCmd)(uint8_t id);
  void (*at_setupCmd)(uint8_t id, char *pPara);
  void (*at_exeCmd)(uint8_t id);
}at_funcationType;

использование at_funcationType at_fun[at_cmdNum]
в одной структуре описали все доступные вызовы, и условия вызова.

я храню возможность вызова как крайний метод для уменьшения кода,
когда нет смысла урезать код пользуюсь как возможность быстрого перехода на необходимую функцию
CNTR + мышкой клик на имени функции, нереально удобно ))) 

в среде ардуино не работает (((
но я где то встречал можно прикрутить компилятор к более удобной оболочке, с сохранением  всем "моментов" ардуино.   

пример

void ICACHE_FLASH_ATTR
at_cmdProcess(uint8_t *pAtRcvData)
{
  char tempStr[32];

  int16_t cmdId;
  int8_t cmdLen;
  uint16_t i;

  cmdLen = at_getCmdLen(pAtRcvData);
  if(cmdLen != -1)
  {
    cmdId = at_cmdSearch(cmdLen, pAtRcvData);
  }
  else 
  {
  	cmdId = -1;
  }
  if(cmdId != -1)
  {
//    os_printf("cmd id: %d\r\n", cmdId);
    pAtRcvData += cmdLen;
    if(*pAtRcvData == '\r')
    {
      if(at_fun[cmdId].at_exeCmd)
      {
        at_fun[cmdId].at_exeCmd(cmdId);
      }
      else
      {
        at_backError;
      }
    }
    else if(*pAtRcvData == '?' && (pAtRcvData[1] == '\r'))
    {
      if(at_fun[cmdId].at_queryCmd)
      {
        at_fun[cmdId].at_queryCmd(cmdId);
      }
      else
      {
        at_backError;
      }
    }
    else if((*pAtRcvData == '=') && (pAtRcvData[1] == '?') && (pAtRcvData[2] == '\r'))
    {
      if(at_fun[cmdId].at_testCmd)
      {
        at_fun[cmdId].at_testCmd(cmdId);
      }
      else
      {
        at_backError;
      }
    }
    else
    if(((*pAtRcvData >= '0') && (*pAtRcvData <= '9'))||(*pAtRcvData == '='))
    {
      if(at_fun[cmdId].at_setupCmd)
      {
        at_fun[cmdId].at_setupCmd(cmdId, pAtRcvData);
      }
      else
      {
//        uart0_sendStr("no this fun\r\n"); //Relax, it's just a code.
        at_backError;
      }
    }
    else
    {
      at_backError;
    }
  }
  else 
  {
  	at_backError;
  }
}

AT+IPR=0
нашли "+IPR"
{"+IPR", 4, NULL, NULL, at_setupCmdIpr, NULL},

"+IPR=" удовлетворяет (*pAtRcvData == '='))

функия  at_setupCmdIpr не NULL?
вызвали ее 
at_fun[cmdId].at_setupCmd(cmdId, pAtRcvData);
 
if(at_fun[cmdId].at_setupCmd)
{
        at_fun[cmdId].at_setupCmd(cmdId, pAtRcvData);
}

в целом  по коду ESP8266 неоднозначное мнение у меня,
но самое главное - разраб молодец, мне его стиль наверное просто не привычен. 


таких фичь при использовании Си  много, если что найдете интересное - скидывайте )

Быстрое сообщение

Введите сообщение и нажмите Отправить

Подвал раздела