2017-03-25 11 views
-1

私は学校のプロジェクトをやっていますが、私は優秀な学年を得るために私の外に出ています
私はボイドポインタとタイプキャストを使ってできるだけ一般的なシナリオのタイプはそれに投げる。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++; 
    } 
} 

警告は、ポインタと整数の比較であり、戻り値はキャストなしの整数からポインタを作成します。

+6

どこでも 'void *'を使用しても、コードは「可能な限り一般的」にはなりません。特に、関数が真または偽を返すことを意図している場合は、それを追跡するのが難しくなります。私はあなたの先生であれば、あなたのグレードから、ブールタイプを使用していないため、私は差し引くでしょう。 – StoryTeller

+5

宣言した関数のどちらも、特定の型を明示的に返すので、 'void *'型である必要はありません。できるだけ一般的に*しようとする試みは間違っています。 *このコードをできるだけ不明瞭にしましょう。なぜなら、「ジェネリック」と言うことができるからです。 –

+0

私の先生は、昨年から彼の学生がすべての「空あり*」の番組を作ったところでプレゼンテーションをしていました。彼はそれについて夢中になり、私はブールリターンを使用してこれを簡単に行うことができることを理解しています。 – PeSousa

答えて

1

いいえ、正常ではありません。彼らはあなたが間違ってポインタを使用していることを伝えています。 FALSOVERDADEIROはポインタではありません。

真と偽を返す関数は、一般的には無効なvoidポインタまたはポインタを使用することはできません。あなた自身の真偽値を定義する必要もありません。代わりに、ブール値truefalsestdbool.hから使用してください。 (注:これは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はブール値を返すという利点を活用(技術的にはboolean型として使用することができます0または1を返す)と、1行にこれらの機能を減らすことができます。

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

私はあなたが言うことを得ていますが、私たちの先生は、Types.cのすべてではなく、私のハッシュのように、可能な限り異なる "ビジネス"で使えるようにするために、これは学校のプロジェクトだけなので、ちょっとばかげているのですが、私はルールを作っていません。 – PeSousa

+4

@PeSousa - タイプをハードコーディングできない場合は 'void *'を使用しますが、何かを保持するマップを書くときのように。ブール値**を返すことは、型をハードコーディングしない場合には当てはまりません。 – StoryTeller

+0

@StoryTellerありがとうございました – PeSousa

関連する問題