void指针发出警告是否正常?

时间:2017-03-25 01:26:43

标签: c pointers

我正在做一个学校项目,我会离开我的地方以获得更好的成绩 有了这样说,我正在尝试使用void指针和类型转换,以使我的程序尽可能通用我投入的任何类型的场景。

我做了一些代码并且它会做它应该做的所有事情,但是当我重建所有内容时它会给我一些警告,但是当我编译它时没有警告。

旁注:我知道我正在向指针返回一个整数,但是我不能返回一个本地指针,否则它不会给我我需要的结果。

#define VERDADEIRO 1
#define FALSO 0
void * removido(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,REMOVIDO) != 0)
    {
    return FALSO;
    }
    else
    {
    return VERDADEIRO;
    }
}
void * vazio(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,CHAVENULA)!= 0)
    {
    return FALSO;
    }
    else
    {
        return VERDADEIRO;
    }
}

int listar(info * tab)
{
int i,c=0,j;

for(i=0;i<HASHTAM;i++)
{
    if((int *)removido(tab,i) ==FALSO && (int *)vazio(tab,i)==FALSO)
    {
    printf("Nome: %s",tab[i].nome);
    printf("NIF: %d\n",tab[i].NIF);
    printf("Morada: %s",tab[i].morada);
    printf("Telefone: %d\n",tab[i].telefone);
    printf("Codigo Postal: %d - %d\n",tab[i].codigopostal/1000,tab[i].codigopostal%1000);
    printf("Data de nasicmento: %d - %d - %d\n",tab[i].datanascimento%100,(tab[i].datanascimento%10000)/100,tab[i].datanascimento/10000);
    printf("Associado: %s\n",tab[i].infoassociado.associado);
    if(associado(tab,i)==VERDADEIRO)
    {
        for(j=0;j<10;j++)
        {
            printf("Cota de %d anos atras - Estado: %c\n",j+1,tab[i].infoassociado.cotas[j]);
        }
    }
    c++;
    }
}

警告是指针和整数之间的比较,返回使得指针来自整数而没有强制转换。

1 个答案:

答案 0 :(得分:1)

不,他们不正常。他们告诉您,您正在错误地使用指针。 FALSOVERDADEIRO不是指针。

返回true和false的函数不能很好地利用void指针或一般的指针。你也不必定义自己的真假值。而是使用stdbool.h中的布尔truefalse。 (注意:这是在C99中添加的,一些教授坚持C90标准。)

#include <stdbool.h>

bool removido(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,REMOVIDO) != 0) {
        return false;
    }
    else {
        return true;
    }
}

bool vazio(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,CHAVENULA)!= 0) {
        return false;
    }
    else {
        return true;
    }
}

然后你可以使用普通的布尔检查来检查返回值是真还是假。

if( !removido(tab,i) && !vazio(tab,i) ) {
   ...
}

请注意,双重否定会使代码难以理解。如果检查相等性并返回true,则更简单。

bool vazio(info* tab,int pos)
{
    if(strcmp(tab[pos].nome,CHAVENULA)== 0) {
        return true;
    }
    else {
        return false;
    }
}

为了真正简化代码,你可以利用strcmp(...) == 0返回一个布尔值(技术上它返回0或1可以用作布尔值)并将这些函数减少到一行。

bool removido(info* tab,int pos)
{
    return strcmp(tab[pos].nome,REMOVIDO) == 0;
}