我正在做一个学校项目,我会离开我的地方以获得更好的成绩 有了这样说,我正在尝试使用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++;
}
}
警告是指针和整数之间的比较,返回使得指针来自整数而没有强制转换。
答案 0 :(得分:1)
不,他们不正常。他们告诉您,您正在错误地使用指针。 FALSO
和VERDADEIRO
不是指针。
返回true和false的函数不能很好地利用void指针或一般的指针。你也不必定义自己的真假值。而是使用stdbool.h中的布尔true
和false
。 (注意:这是在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;
}