将参数传递给C中的函数

时间:2018-09-19 06:42:53

标签: c getopt

我正在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 :(得分:1)

就像您使用的main一样,您必须正确准备字符串:

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

更新: 正如@rici指出的,在扫描之前设置optind=0并不意味着第一个参数由getopt传递。因此,您必须提供一个附加的第一个参数。通常,当使用参数列表调用main时,它拥有程序的名称,但是对于您自己的函数调用,第一个字符串中的内容无关紧要。