2

我收到关于以下函数的“无效使用无效表达式”错误:

void remove_data(char* memory, char* bitmap, int pos)
{
    int i;

    i = (int)test_bit(bitmap, pos-1);

    if(i != 0)
    {
        memory[pos-1] = NULL;
        toggle_bit(bitmap, pos-1);
    }
}

现在,从我在其他线程上读到的有关此类似问题的内容中,当程序员在函数中使用将生成输出的某些内容时,会弹出此错误。但是,我没有看到在我编写的代码中会导致什么。

编辑添加:

其中使用的切换位函数也是 void 类型并且不返回值。

void test_bit(char * bitmap, int pos)
{
    int bit;

    bit = bitmap[pos/8] & (1<<(pos%8));
    printf("%d\n", &bit);
}

我在 test_bit 中评论了 printf 行,但错误仍然存​​在。

4

4 回答 4

8

但是,我没有看到在我编写的代码中会导致什么。

我也是,因为我认为您没有发布相关代码。无论如何,我认为这可能是你的问题:

i = (int)test_bit(bitmap, pos-1);

请向我们出示 的签名test_bit。我猜它会返回void,或者您已经在某处转发并意外写道:

void test_bit(char*, int);

由于函数返回void(即什么都没有),因此您不能继续将返回值(什么都没有)转换int为您正在执行的操作,这没有任何意义并且是非法的。

编辑:您已经test_bit在实际上声明为 return的评论中进行了验证void,所以这是您的问题。

于 2012-10-08T16:58:10.780 回答
0

由于 test_bit 是无效的,您不能使用它的返回值(如i = (int)test_bit(bitmap, pos-1);)——没有返回值

于 2012-10-08T16:59:47.980 回答
0

你写了

 i = (int)test_bit(bitmap, pos-1);

为什么要有演员表?

当函数是时似乎有点愚蠢

void test_bit(char * bitmap, int pos)
{
    int bit;

    bit = bitmap[pos/8] & (1<<(pos%8));
    printf("%d\n", &bit);
}

你怎么能将 void 转换为整数?

于 2012-10-08T17:05:39.957 回答
0

明显 的解决方案:不要分配函数返回 void 的结果。

非显而易见的解决方案:不要嵌套函数调用,并且您不太可能会查看所有错误的位置,认为编译器已损坏。

#include <stdio.h> //:for: printf(...)

void YOUR_MISTAKE_ACTUALLY_HERE();
void  MyFunc( void );
void* WRAPPED_MyFunc( int, int, int );


int main( void ){
    printf("[BEG:main]\n");


    void* HW = NULL;
    HW = WRAPPED_MyFunc(  //:<---So you check this, but it looks fine.
        1
    ,   YOUR_MISTAKE_ACTUALLY_HERE()
    ,   3
    );; //:<--- compiler says "Invalid Use Of Void Expression" Here.

    if( HW ){ /** NOOP **/ };


    printf("[END:main]\n");
} 

    void YOUR_MISTAKE_ACTUALLY_HERE(){ }

    //:Pretend this function is fetched from DLL.
    //:Casting all DLL functions initially to void(*pfn)void
    //:in a lookup table, then re-casting later.
    void MyFunc( void ){

        return;

    }//[;]//

    typedef  
        void* 
        (* MyFunc_TYPEDEF)(            

            int a
        ,   int b
        ,   int c

        );

    void*
    WRAPPED_MyFunc(

        int a
    ,   int b
    ,   int c

    ){


               MyFunc_TYPEDEF
        fun =( MyFunc_TYPEDEF)
               MyFunc;

        void* ret=( fun(

            a
        ,   b
        ,   c

        ));

        return( 
            (void*)
            ret 
        );;

    }//:Func
于 2019-12-09T03:39:25.820 回答