“&=”C错误中的操作

“&=”C错误中的操作,c,pointers,bit-manipulation,C,Pointers,Bit Manipulation,我有一个tam=1000的数组,我必须检查是否接收到所有元素 bool ok = true; size_t i; size_t tam=1000; for (i = 0; i < tam; i++){ ok &= vector_obtener(vec_vol, i, &valor); if (i!=valor) //this if was something i added to check why it wasn't working.

我有一个tam=1000的数组,我必须检查是否接收到所有元素

bool ok = true;
size_t i;
size_t tam=1000;
for (i = 0; i < tam; i++){
    ok &= vector_obtener(vec_vol, i, &valor);
    if (i!=valor)      //this if was something i added to check why it wasn't working.
        printf("En i=%zu y valor=%i \n",i,valor);
    ok &= (valor == i);
}
print_test("all good", ok);
以下是打印测试:

void print_test(char* name, bool result){
    printf("%s: %s\n", name, result? "OK" : "ERROR");
}
编辑:确定添加。当进入打印测试时,ok应该为真


对不起,如果我不太清楚,英语不是我的母语。如果您不理解某些内容,我将尝试用另一种方式来解释。

因为在循环结束时打印ok变量之前,您要更新ok变量2000次,所以很难说出错误发生的确切位置。要诊断问题,应在每次更新ok变量时检查其值

for (i = 0; i < tam; i++)
{
    ok &= vector_obtener(vec_vol, i, &valor);
    if ( !ok )
        printf("vector_obtener failed at i=%zu\n", i);

    ok &= (valor == i);
    if ( !ok )
        printf("En i=%zu y valor=%i \n",i,valor);
}


如果i==0,则会失败。如果你盯着代码看得太久,那么你似乎在试图确保数组的每个元素vec_vol都是用它的索引初始化的。如果此假设正确,则此代码应执行以下操作:

bool ok = true;
size_t i;

if(NULL != vec_vol)
{
    for (i = 0; i < vec_vol->tam; i++)
    {
        if(vec_vol->datos[pos] != i)
        {
            ok = false;
            break;
        }
    }
}

if(ok)
{
    print_test("all good", ok);
}

如果我没有理解您代码的意图,请忽略这一点。

到底是什么问题?有错误吗?如果是,它是什么?显示ok的声明及其初始化。如果我=valor正在检查数据中的位置是否与该位置中的数据值不同,我认为这种情况很少发生。如何初始化变量ok以及您希望用它检查什么if?Minor:printfEn i=%zu y valor=%i\n,i,valor;应该使用En i=%d y valor=%i\n如果*勇气归假;:如果*valor==0,则返回false,确定&=valor==i;:如果i==0,那么valor==0必须为false,所以在打印时ok总是false;。
if(!*valor)
    return false;
ok &= (valor == i);
bool ok = true;
size_t i;

if(NULL != vec_vol)
{
    for (i = 0; i < vec_vol->tam; i++)
    {
        if(vec_vol->datos[pos] != i)
        {
            ok = false;
            break;
        }
    }
}

if(ok)
{
    print_test("all good", ok);
}