2016-08-16 2 views
0

ich einen Funktionszeiger haben, die eine Enumeration ist
Meine Enum gibtWie die Basisadresse für einen Funktionszeiger zugewiesen wird, der enum zurückgibt?

typedef enum {  
    FIRST,  
    SECOND, 
    THIRD 
} STATUS; 

Im Code jemand eine Basisadresse zuweisen als

STATUS (*start_port)(void *,void *)= 0x80000001; 

Aber es wirft die Warnungen versucht hat

"Initialisierung macht Zeiger aus Ganzzahl ohne Besetzung"

und auch

"ISO C90 verbietet gemischte Erklärungen und Code [-Wdeclaration-after-Anweisung]"

Ich trennt die Erklärung setzte

STATUS (*start_port)(void *,void *); 

Dann versuchte zu Weisen Sie die Adresse dem Funktionszeiger folgendermaßen zu:

start_port = (unsigned int *)0x80000001; 

korrigiert es die gemischte Erklärung Warnung aber ein neuer Fehler kam

„Zuordnung von inkompatiblen Zeigertyp“

Ich möchte wissen, wie man richtig einen Funktionszeiger auf eine feste Kasten eingeben (konstante) Basisadresse, wenn der Rückgabewert eine Aufzählung ist.

+2

So ist der Code für die Funktion, die Sie anrufen möchten, ist tatsächlich an der Adresse '0x80000001'? –

+1

Die Variable 'start_port' ist ein Zeiger auf eine Funktion. Sie müssen den Wert auf den richtigen Typ anwenden. –

+1

Re. die Warnung c90: Verwenden Sie den Standard C, der C11 ist, oder zumindest den modernen C99. Verwenden Sie nicht mideval C90, es sei denn, Sie ** wirklich ** müssen alten Code beibehalten. – Olaf

Antwort

1
  1. Sie sind start_port vom Typ Funktionszeiger deklarieren und dann versuchen, einen unsigned int * Zeiger darauf zuweisen, versuchen

    STATUS (*start_port)(void *,void *) = (STATUS (*)(void *,void *)) 0x80000001; 
    

    aber das ist schrecklich Stil und Sie sollten es nicht tun.

  2. Es ist eine Warnung, die besagt, dass Sie keine Variablen innerhalb des Codes deklarieren. Dies ist mit modernen Versionen des Standards kein Problem mehr, aber IMHO ist immer noch eine gute Methode. Delcaring Variablen innerhalb des Codes macht es schwieriger, den Algorithmus und die Logik zu folgen. Wenn Sie sie nur am Anfang eines Blocks deklarieren, ist es einfacher, den Code als Ganzes zu lesen. Sie wissen, wo die Deklarationen sind und Sie müssen nicht Teile des Codes überspringen, die nur "Deklarationen" sind.

  3. Das gleiche Problem wie (1), so ist der richtige Weg

    start_port = (STATUS (*)(void *,void *)) 0x80000001; 
    
+0

Variablendeklarationen sollten so nah wie möglich an der Verwendung sein (z. B. kurz vor einer Schleife, in der sie verwendet wird). Eine langwierige Funktion kann ein Durcheinander sein, wenn man die ganze Zeit auf und ab springen muss, nur um einen Variablentyp zu überprüfen oder wo er herkommt. –

+1

Eine lange Funktion ist schon ein Durcheinander. Wenn Sie eine längere Funktion haben, müssen Sie sich mehr Gedanken machen, als wo Sie die Deklarationen platzieren. Der Körper einer Funktion sollte mindestens in den Puffer Ihres Editors passen, wenn es länger ist, ist die einzige vernünftige Erklärung eine sehr lange 'switch' Anweisung. Ansonsten ist es ziemlich einfach, Fehler zu haben, egal wo man Variablen deklariert. –

+0

Danke für die schnelle Antwort Das machte wirklich meinen Tag – achoora

2

Wie in anderen Antworten erwähnt wurde zu werfen ist, müssen Sie explizite Umwandlung verwenden integer in Funktionszeiger zu konvertieren :

STATUS (*start_port)(void *,void *)= (STATUS(*)(void *,void *))0x80000001; 

Aber Funktionszeiger sind schwer zu lesen.Verwenden Sie typedef, um sie sauber zu machen:

typedef STATUS FuncType(void*, void*); 
    ... 
FuncType * start_port = (FuncType *)0x80000001; 
+0

das ist nur eine persönliche Meinung. In einem 'typedef 'wird wenig verwendet, wenn nur eine Funktion dieses Typs vorhanden ist. Bedenken Sie, dass dies eine Sprungtabelle ist. – Olaf

+1

@Olaf 'typedef' selbst für den einmaligen Gebrauch macht Code klarer. Es ist sofort bekannt, wie der Zeiger verwendet werden soll. – user694733

+1

Unsinn. Du musst noch zwei Plätze checken. 'typedef's sind sinnvoll, wenn Sie die Schnittstelle von mehr als einer Funktion ändern wollen. Aber hier ist es nicht wahrscheinlich, und selbst wenn es mehr als eine Funktion (Sprungtabelle) gibt, ist es wahrscheinlicher, dass man nicht die Schnittstelle aller Funktionen ändern möchte, sondern eine einzige. Also brauchst du sowieso einen 'typedef' pro Zeiger. ** Sehen Sie, wie gut Ihre Antwort ist? ** – Olaf

Verwandte Themen