Передать параметры функции в C - PullRequest
0 голосов
/ 19 сентября 2018

Я пишу функцию в C, чтобы открыть последовательный порт и прочитать данные флэш-памяти в микросхеме.Я хочу передать параметры последовательного порта этой функции и открыть COM 4.Я пытался использовать эти методы для вызова функции:

  1. ret = download_main(1,'-C'+ 4);

  2. ret = download_main(1,'-C4');

  3. char array_1[] = { "-C4"};
    ret = download_main(1, array_1);

  4. ret = download_main(1, "-C4"); и измените определение функции на int download_main(int argc, char *argv)
  5. char *args[] = { "-C4", NULL }; ret = download_main(1, args);

но все не смогли передать параметр этой функции и открыть COM4.

вызов функции

int main(int argc, char *argv[])
{
int ret;    

char* COMx = "com4";
FILE* fp;

printf("open com!\n");

/** Open Com */
if ((fp = fopen(COMx, "wb+")) == NULL) {
    printf("Open %s Failed!\n", COMx);
}

/** Send "Hello,world!" */
fwrite((char*)"Hello,world!", sizeof("Hello,world!"), 1, fp);


char *args[] = { "-C4", NULL };
ret = download_main(1, args);
return ret;
}

вызванную функцию:

int download_main(int argc, char *argv[])
{   
BOOL fSuccess;
TCHAR commPort[16];
TCHAR *numStr;
int len, i,ch;
int poweroff_param;
char *optstring = "C:c:r:F:f:P:w:b:B:R:A:l:h";
bininfo_node *bin_info = NULL;

opterr = 1;
if (argc < 3)
{
    usage();
    return 0;
}


optind = 0;
while((ch=getopt(argc,argv,optstring))!=-1)
{
    switch(ch)
    {
        case 'c':
            g_calibrate_switch = atoi(optarg);
            if(1 == g_calibrate_switch)
                printf("burn flash then entry calib mode\n");
            break;
        case 'C':
            numStr = optarg;
            len = _tcslen(numStr);
            for (i = 0; i < len; i++) 
            {
                if (!_istdigit(numStr[i])) 
                {
                    TRACE("Error: Invalid COM number: %s", numStr);
                    g_dldtool_exit_code = EXIT_CODE_COM_NUM_ERROR;
                    goto _exit;
                }
            }
            _stprintf_s(commPort, sizeof(commPort) / sizeof(TCHAR), "\\\\.\\COM%s", optarg);
            break;

В этой программе нет ошибки компиляции.Когда я отлаживаю эту программу, она продолжает выходить с кодом 0 и напоминает мне добавить параметры в функцию, не проходя через точку останова в функции download_main, как показано ниже:

enter image description here

1 Ответ

0 голосов
/ 19 сентября 2018

Поскольку вы, похоже, используете тот же механизм, что и main, вы должны правильно подготовить свои строки:

char *args[] = {"download_main", "-C4", NULL};
ret = download_main(2, args);

Обновление: Как указывал @rici, установка optind=0 перед сканированием неозначает, что первый аргумент передается getopt.Поэтому вы должны предоставить дополнительный первый аргумент.Обычно это имя программы, когда main вызывается со списком аргументов, но для вашего собственного вызова функции не имеет значения, что находится в первой строке.

...