2017-05-29 1 views
0

Ich möchte einen Wert vergleichen, übergeben Sie mit void *, wer char/short/long type mit einem konstanten langen Typ sein kann. Aber dieser Code hat nicht funktioniert. Ich verstehe nicht.Vergleichen Sie einen Wert mit void *

void compar (void* p_value) { 
    if (*p_value > CONST_MAX) { 
     *p_value = CONST_MAX; 

    } else if(*p_value<CONST_MIN) { 
     *p_value = CONST_MIN; 
    } 
} 

thx.

+2

Sie müssen es zuerst umsetzen - was ist der Typ/die Bedeutung von 'CONST_MAX'? – cat

+0

Wie viele Bytes sollte der Compiler schreiben? – stark

+1

Ein Wert, auf den "void *" zeigt, hat keinen bestimmten Typ. Wie würde der Compiler den Wert behandeln, wenn Sie den Zeiger dereferenzieren? –

Antwort

3

Sie können den Typ einer Variablen in der Sprache C ohne die Erweiterung gcc oder den C11-Standard nicht kennen (weitere Informationen unter this link). Übrigens wird diese Art von Problem oft gelöst, indem ein anderes Argument mit dem Typ der Variablen übergeben wird.

4

Es wäre besser, Ihre Funktion Signatur zu ändern:,

#define TYPE_INT 1 
#define TYPE_LONG 2 

void compar (void* p_value, int type){ 

dann von der Art BASD warf das „Ding“ übergeben (oder das, was zeigte auf) auf die Art und vergleichen.

1

A void* ist ein Zeiger auf etwas. Die Vergleichsoperatoren müssen wissen, was Sie vergleichen, bevor sie in etwas Sinnvolles für den Prozessor verarbeitet werden können.

Es gibt mehrere Ansätze, die es für Sie lösen könnten.
1) Verwenden von Makros (so vergleicht er es inline - kein void *)
2) Führen Sie den Typ in dem Vergleich fn
3) Schreiben Sie verschiedene Funktionen für jeden Vergleichstyp
4) Guss alles zu einem (int), bevor du es an deine Funktion übergibst und die void pointers komplett vergisst. Dafür sind sie nicht da.

0

Wenn dieser Codeblock Teil eines größeren Codes ist, in dem Sie diese Methode zum Vergleichen aufgerufen haben, sollte das kein Problem sein, denn wenn Sie diesen Codeblock aufrufen, sollte er auch den Datentyp p_value übergeben. Aber wie es ist, p_value hat ist ???? und so wird es nicht richtig kompilieren.

Verwandte Themen