【问题标题】:Array has incomplete element type 'bool' [duplicate]数组具有不完整的元素类型'bool' [重复]
【发布时间】:2021-05-31 19:15:43
【问题描述】:

是的,这是错误,我不知道如何解决:test.c:5:12: 错误:数组的元素类型不完整 'bool []'

这是更大代码的一部分,但包含所有相关内容。

#include <stdio.h>
#include <cs50.h>

int candidate_count = 3;
bool locked[][] = {locked[0][1] = false, locked[0][2] = false, locked[1][0] = false, locked[1][2] = false, locked[2][0] = false, locked[2][1] = false};


int main(void)
{
    int lockedCount = 0;
    for(int i = 0; i < candidate_count; i++)
        for(int j = 0; j < candidate_count; j++) {
            if(locked[i][j] == false) {
                locked[i][j] = true;
                printf("locked %i vs %i\n", i, j);
            }
            if(i == candidate_count - 2) {
                for(int k = 0; k < candidate_count; k++)
                    if(locked[k][j] == true) {
                        lockedCount += 1;
                        printf("locked %i vs %i\n", i, k);
                    }
                if(lockedCount == 0) {
                    printf("didn't %i vs %i\n", i, j);
                    break;
                }
                else {
                    locked[i][j] = true;
                    printf("locked %i vs %i\n", i, j);
                }
            }
        }
}

【问题讨论】:

    标签: c multidimensional-array initialization boolean cs50


    【解决方案1】:

    这些声明和初始化一个数组

    bool locked[][] = {locked[0][1] = false, locked[0][2] = false, locked[1][0] = false, locked[1][2] = false, locked[2][0] = false, locked[2][1] = false};
    

    至少是不正确的,因为数组类型bool[] 的元素是不完整的类型。

    你需要写例如像

    bool locked[][3] = 
    {
        { [1] = false, [2] = false },
        { [0] = false, [2] = false }, 
        { [0] = false, [1] = false }
    };
    

    或者喜欢

    bool locked[][3] = 
    {
        [0] = { [1] = false, [2] = false },
        [1] = { [0] = false, [2] = false }, 
        [2] = { [0] = false, [1] = false }
    };
    

    其实这些声明和初始化等价于

    bool locked[3][3] = 
    {
        false
    };
    

    因为声明中数组的所有元素都由零初始化,即宏false..的值。

    或者由于数组具有静态存储持续时间,因此默认情况下它由零初始化。所以你甚至可以写

    bool locked[3][3];
    

    您忘记包含标题&lt;stdbool.h&gt;。最好明确包含所需的标头。

    这是一个演示程序。

    #include <stdio.h>
    #include <stdbool.h>
    
    bool locked[][3] = 
    {
        { [1] = false, [2] = false },
        { [0] = false, [2] = false }, 
        { [0] = false, [1] = false }
    };
    
    int main(void) 
    {
        // your code goes here
        return 0;
    }
    

    【讨论】:

    • 感谢您的解决方案!但是你能像我五岁一样向我解释一下,在这种情况下,“不完整类型”到底是什么意思?
    • @ILoveYeezis C编译器无法推导出“多维”数组的大小,声明数组的数组时只能省略第一个“维”。
    • @ILoveYeezis 你声明了一个二维数组。二维数组的元素类型是 bool[]。也就是说 bool[] 类型的对象的大小是未知的。例如,如果您尝试编写 printf( "%zu\n", sizeof( bool[] ) );编译器会发出类似的错误。
    • 作为一个全局变量locked0s初始化,因此整个初始化列表是不必要的。 bool locked[3][3]; 做同样的事情,所有条目都是false
    • @ILoveYeezis 我的回答中显示了所有方法。例如,您可以编写 [1] = { [0] = true }
    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多