警告:赋值从整数中生成没有强制转换的指针[默认启用]

时间:2012-04-06 18:32:49

标签: c pointers

当我尝试使用带有-Wall标志的linux上的gcc版本4.6.3编译此代码时,我收到了以下两个警告:

  1. 它指向cmd[1]=cmd2send;

      

    警告:赋值来自整数的指针,没有强制转换[默认启用]

  2. 它指向变量static unsigned char *cmd[65]

      

    警告:变量'cmd'已设置但未使用[-Wunused-but-set-variable]。

  3. 是什么引起了这些警告?以及如何避免它们?

      int CommandHandler(unsigned char cmd2send)
        {
            static unsigned char *cmd[65];
    
            // *make sure device is open*
            if(handle==NULL) // handle defined in transceiver.h
            {
                puts("CommandHandler::Cant handle command");
                // try to open device again
                if(OpenMyDev()!=0)
                return -1;
                // if no return then retry is fine
                puts("retry SUCCEEDED!, device is open");
            }
    
            // *send command to firmware*
            cmd[0]=0x0;
            cmd[1]=cmd2send;
            .......
            return 0;
    
        }
    

    在这里,我也收到了可变电压警告#2:

    float Get_Temperature(void)
    {
        //unsigned char RecvByte=0;
        //int byte[4];
    
        int i;
    
        float voltage=0;
        float resistance=0;
        float temperature=0;
        float SamplesAVG=0;
    
        unsigned int Samples=0;
    
        unsigned char* rvc;
        unsigned char mydata[65];
    
    
        for(i=0;i<=10;i++)
        {
            //Transimit Start Of Frame
            mydata[0]=0;
            mydata[1]=GET_TEMPERATURE;
    
            if(Write2MyDev(mydata)<0)  {return -1;}
    
            rvc=ReadMyDev(0);
    
            SamplesAVG+=(rvc[0]<<24)+(rvc[1]<<16)+(rvc[2]<<8)+rvc[3];
            usleep(100*1000);
        }
    
        Samples=SamplesAVG/10;
        printf("TO PRINT VAL:%d\n",Samples);
        puts("------------");
    
        voltage = (Samples * 5.0)/1023.0; // 0..1203= 1024 values
        resistance = 10000.0/ (1023.0/Samples);
        ...
        return retval;
    }
    

2 个答案:

答案 0 :(得分:4)

cmd2sendunsigned char,您将cmd[1]的值设置为char *char *是一个指针,unsigned char被视为一个整数,所以你在没有强制转换的情况下从cmd[1]创建指针integer

您可能想要一个字符数组char cmd[65]而不是char *的数组

此外,由于您为cmd创建并分配了值,但您从未使用它,因此您也会收到警告。

答案 1 :(得分:3)

static unsigned char *cmd[65];
....
cmd[1] = cmd2send; /* cmd is an array of pointers so cmd[1] is a pointer. */

好的,所以cmd是一个256个指针的数组。将char分配给cmd[1]会产生第一个警告。

编译器还注意到您实际上并未在任何地方使用cmd ,因此会生成第二个警告。