Frage

Ich habe eine Funktion wie

void printMe (void *i)
{
    printf("%d", i);
}

, wo ich will einen void-Zeiger zu übergeben und drucken Sie es zu screenen. Das obige Beispiel ist in Ordnung, wenn die i ganze Zahl ist, float oder Doppel aber abstürzt, wenn ich ein char ist. Es gibt keine Überlastung in C, wie ich in der Regel in C ++ verwenden. Die Frage ist also das, können wir eine Funktion in C erstellen, die das Element gedruckt wird, dass es Parameter ist, und wenn ja, wie dies möglich ist, weil es völlig entzieht sich mir in diesem Moment.

War es hilfreich?

Lösung

Q1: Die Frage ist also das, können wir eine Funktion in C erstellen, die das Element gedruckt wird, dass es Parameter

A: Nicht so, wie Sie wollen. Sie werden Informationen an die Funktion übergeben haben, ist es die Art von Daten zu erzählen Sie vorbei.

Q2:. und wenn ja, wie ist das möglich, weil es mir total in diesem Moment entzieht sich

A: Es ist eluding Sie, weil es nicht getan werden kann. Es gibt keine Metadaten mit einem void * zugeordnet, dass der Compiler oder Laufzeit, um herauszufinden, verwenden können, sie geben es deutete auf. Sie müssen entweder

  1. eine Struktur übergeben, die eine
    enthält Zeiger und Informationen über das, was
    der Zeiger auf (beispielsweise ein Enum).
  2. passieren einen zusätzlichen Parameter mit Informationen über das, was den Zeiger verweist auf

Wie der Code das einzige, was steht Ihnen hier drucken kann, ist die Adresse, die i verweist.

Ein void-Zeiger verweist auf Rohdaten, printf vorausgesetzt, dass Sie wissen, welchen Datentyp Sie drucken, ist es keine Intelligenz hat und nicht „es herausfinden“ für Sie.

Es ist so einfach.

Was Sie tun können, sind Pass-Typinformationen für die Funktion, aber dann Sie am Ende mit etwas sehr wie printf ist es selbst, in dem Sie eine Formatierung Zeichenfolge enthält Typinformationen über die Daten in den folgenden arguements passieren.

Hope, das hilft.

Auch. . . " Es gibt keine Überlastung in C, wie ich in der Regel in C ++ verwenden "

Auch in C ++ ist nun mal die Überlastung bei der Kompilierung, und hier gibt es keine Möglichkeit für den Compiler zu wissen, welche Daten zu dieser Funktion übergeben werden, so dass, obwohl Sie zu einer Überlastung gewöhnt sind, wäre es nie so arbeiten (zB diese gleiche Sache versuchen printf verwenden, aber es mit einem Compiler C ++ kompiliert, erhalten Sie genau die gleichen Ergebnisse). Eigentlich versuchen

cout << i;

in der Funktion oben, und es werden Ihnen die Adresse i verweist, nicht den „Wert“ von i. Sie müssten i werfen und derference es, bevor Sie es Wert bekommen könnte

cout << *(int*)i;

Also, um die oben arbeitet in C ++ müssen Sie viele überladenen Funktionen haben (oder eine Template-Funktion, die wirklich die gleiche Sache ist, mit Ausnahme der Compiler die Funktionen für Dich rollt), z.B. ladenen Funktionen

printMe(int i){...}
printMe(double d){...}
printMe(char c){...}
printMe(char* string){...}

c Sie müssen nur diejenigen Funktionen bestimmten Namen geben

printInt(int i){...}
printDouble(double d){...}
printChar(char c){...}
printString(char* string){...}

Andere Tipps

Für den Anfang sind Sie den Zeiger Druck, nicht das, was er zeigt. Um den eigentlichen Inhalt zu drucken, müssen Sie *i passieren printf, nicht i.

Wenn Sie das wirklich tun wollen, eine Lösung:

void printMe (void *p, int typ) {
    switch(typ) {
        case TYP_INT: printf("%d", *((int*)p)); break;
        case TYP_CHR: printf("%c", *((char*)p)); break;
        /* and so on ... */
    }
}
  

Also die Frage ist, können wir eine Funktion in C erstellen, die das Element gedruckt wird, dass es Parameter ist

Ja, wir können. Eine solche Funktion ist bereits Teil der Standardbibliothek - es heißt printf;)

Da es keine Kompilierung-Funktion in C Überlastung, müssen Sie irgendwie die Art der Argumente zur Laufzeit liefern. Das printf Format-String verwendet werden kann, dies zu tun, so gibt es wirklich keinen Grund, Ihre eigene Wrapper-Funktion zu bauen, wenn es bereits eine funktionierende Lösung.

Wenn Sie versuchen, den Zeigerwert zu drucken, ist die korrekte Verwendung printf("%p", i);. Die ‚d‘ spezifizierer ist für ganze Zahlen, und die ‚p‘ für Zeiger. Es ist Ihre Verantwortung, diese richtig zu bekommen, und schlechte Dinge passieren kann, wenn man sie mischen.

Ich weiß nicht, warum dies für einen char * scheitern würde und nicht ein int *, und es ist möglich, dass Sie andere Probleme haben die Ursache dafür. Wenn es immer noch mit% p ausfällt, bekam etwas anderes durcheinander. Sehen Sie, wenn Sie irgendeine Art von Speicher-Monitor-Software installieren können für baumelnden Zeigern oder Doppel free () s zu überprüfen, da zu diesem Zeitpunkt das Schmerzensgeld ist, dass Sie Speicher irgendwo beschädigt haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top