0

根据供应商提供的文档,API 返回的状态码可以是以下任何一种。

FTC_INVALID_HANDLE 
FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER 
FTC_INVALID_NUMBER_CONTROL_BITS 
FTC_NULL_WRITE_CONTROL_BUFFER_POINTER 
FTC_INVALID_NUMBER_CONTROL_BYTES 
FTC_NUMBER_CONTROL_BYTES_TOO_SMALL 
FTC_INVALID_NUMBER_WRITE_DATA_BITS 
FTC_NULL_WRITE_DATA_BUFFER_POINTER 
FTC_INVALID_NUMBER_WRITE_DATA_BYTES 
FTC_NUMBER_WRITE_DATA_BYTES_TOO_SMALL 
FTC_NULL_WAIT_DATA_WRITE_BUFFER_POINTER 
FTC_NULL_OUTPUT_PINS_BUFFER_POINTER 
FTC_INVALID_INIT_CLOCK_PIN_STATE 
FTC_INVALID_FT2232D_CHIP_SELECT_PIN 
FTC_INVALID_FT2232D_DATA_WRITE_COMPLETE_PIN 
FTC_DATA_WRITE_COMPLETE_TIMEOUT 
FTC_INVALID_CONFIGURATION_HIGHER_GPIO_PIN 
FTC_FAILED_TO_COMPLETE_COMMAND 
FTC_IO_ERROR 

在头文件中我发现了这个:

typedef ULONG FTC_STATUS;

我想打印这些字符串。我如何在这里使用 printf ?

FTC_STATUS Status;

printf("%...", Status);  //need help here
4

3 回答 3

3

如果状态是一个从零开始并为每个状态加一的数字(即FTC_INVALID_HANDLE零、FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER一等),那么您可以将所有字符串放在一个数组中,并使用状态代码作为该数组的索引。

像这样的东西:

const char *status_codes[] = {
    "FTC_INVALID_HANDLE",
    "FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER",
    /* etc. */
};

printf("Status is %s\n", status_codes[status]);

如果这不能完成,那么您可以创建一个包含状态代码和字符串的结构,然后将它们放入一个数组中。然后在这个数组中搜索状态码,直到找到它,并使用结构中的字符串。

像这样的东西:

struct
{
    FTC_STATUS status;
    const char *name;
} status_name_map[] = {
    { FTC_INVALID_HANDLE, "FTC_INVALID_HANDLE" },
    { FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER, "FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER" },
    /* etc. */
}

/* Function to map a status to a name */
const char *find_status_name(FTC_STATUS status)
{
    for (int i = 0; i < sizeof(status_name_map) / sizeof(status_name_map[0]); i++)
    {
        if (status == status_name_map[i].status)
            return status_name_map[i].name;
    }

    /* Status not found */
    return "<unknown>";
}

/* ... */

printf("Status is %s\n", find_status_name(status));

还有第三种方法,使用switch语句而不是手动搜索结构数组(感谢LtWorf)。

像这样:

/* Function to map a status to a name */
const char *find_status_name(FTC_STATUS status)
{
    switch (status)
    {
    case FTC_INVALID_HANDLE:
        return "FTC_INVALID_HANDLE";

    case FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER:
        return "FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER";

    /* etc. */

    default:
        /* Status not found */
        return "<unknown>";
    }
}

第二种和第三种方式更安全,第二种方式更慢并且使用更多内存。第三种方式应该既快又使用最少的内存(但更多的代码)。

于 2013-05-23T12:34:22.910 回答
2

为此,您必须定义一个包含字符串的数组。

如果我必须定义这些东西,我更喜欢以下内容以保持正确的顺序:

#define FOOLIST(x) \
    x(ABC) \
    x(DEF) \
    x(GHI) \
    x(JKL) \

#define FOOenum(x) FOO_ ## x,

enum FOO { FOOLIST(FOOenum), FOO_max }


#define FOOname(x) "FOO_" # x,
char * FOOnames[] = {
    FOOLIST(FOOname), NULL
}

这样我只需要在一个地方添加/删除/更改某些东西,所有相关的地方都会自动更改。

于 2013-05-23T12:41:22.410 回答
1
    char ch[MAXVALUE];
    switch(STATU_CODE_RETURNED_BY_API)
    {
        case FTC_INVALID_HANDLE :
            strcpy(ch,"FTC_INVALID_HANDLE");
            break;
        case FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER :
            strcpy(ch,"FTC_NULL_INITIAL_CONDITION_BUFFER_POINTER");
            break;
        case FTC_INVALID_NUMBER_CONTROL_BITS :
        .
        .
        .
        .

    }

打印时使用 ch....

于 2013-05-23T12:41:47.020 回答