Drucken void type in reinem C

8

Ich habe eine Funktion wie

%Vor%

wo ich einen leeren Zeiger übergeben und es auf dem Bildschirm drucken möchte. Das obige Beispiel ist in Ordnung, wenn i ein Integer, Float oder Double ist, aber abstürzt, wenn ich ein Char bin. Es gibt keine Überladung in C, wie ich es normalerweise in C ++ verwende. Die Frage ist also, können wir eine Funktion in C erstellen, die das Element, das der Parameter ist, ausdruckt, und wenn ja, wie ist das möglich, weil es mir in diesem Moment völlig entgeht.

    
SMeyers 27.01.2009, 09:22
quelle

4 Antworten

24

Q1: Also die Frage ist, können wir eine Funktion in C erstellen, die das Element, das ist der Parameter

A: Nicht so, wie du es willst. Sie müssen Informationen an die Funktion übergeben und ihr mitteilen, welche Art von Daten Sie übergeben.

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

A: Es entzieht sich Ihnen, weil es nicht getan werden kann. Mit einem void * sind keine Metadaten verknüpft, die der Compiler oder die Laufzeitumgebung verwenden kann, um herauszufinden, auf welchen Typ sie verweist. Sie müssen entweder

  1. übergibt eine Struktur, die ein
    enthält Zeiger und Informationen über was? Der Zeiger zeigt auf (z.B. enum).
  2. Übergeben Sie einen zusätzlichen Parameter mit Informationen darüber, was der Zeiger ist zeigt auf

Da der Code das einzige ist, was Sie hier ausdrucken können, ist die Adresse, auf die ich hinweise.

Ein void-Zeiger zeigt auf rohe Daten, printf nimmt an, dass Sie wissen, welchen Datentyp Sie drucken, er hat keine Intelligenz und kann Sie nicht "herausfinden".

So einfach ist das.

Was Sie tun können, ist Typinformationen an die Funktion weiterzuleiten, aber am Ende erhalten Sie etwas sehr ähnliches wie printf it's self, wo Sie eine Formatierungszeichenfolge übergeben, die Typinformationen über die Daten in den folgenden Argumenten enthält.

Hoffe, das hilft.

Auch. . . " Es gibt kein Überladen in C, wie ich es normalerweise in C ++ verwende "

Selbst in C ++ findet das Überladen zur Kompilierzeit statt, und hier kann der Compiler nicht wissen, welche Daten an diese Funktion übergeben werden. Selbst wenn Sie es gewohnt sind zu überladen, würde es nie so funktionieren (z versuche dasselbe mit printf, aber kompiliere es mit einem C ++ - Compiler, du bekommst genau die gleichen Ergebnisse). Versuche es eigentlich

%Vor%

in der obigen Funktion, und es gibt Ihnen die Adresse, auf die ich zeige, nicht den "Wert" von i. Du musst es umwandeln und es ableiten, bevor du es wertschätzen kannst

%Vor%

Um die obige Arbeit in C ++ zu erhalten, müßten Sie also viele überladene Funktionen haben (oder eine Template-Funktion, die wirklich die gleiche Sache ist, außer dass der Compiler die Funktionen für Sie übernimmt), z. überladene Funktionen

%Vor%

In c müssen Sie nur diesen Funktionen bestimmte Namen geben

%Vor%     
Binary Worrier 27.01.2009, 14:43
quelle
7

Zuerst drucken Sie den Zeiger, nicht was er zeigt. Um den tatsächlichen Inhalt zu drucken, müssen Sie *i an printf übergeben, nicht i .

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

%Vor%     
paxdiablo 27.01.2009 09:30
quelle
0
  

Also die Frage ist, können wir eine Funktion in C erstellen, die das Element, das ist der Parameter

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

Da in C keine Kompilierzeitfunktion überladen wird, müssen Sie zur Laufzeit den Typ der Argumente angeben. Dazu kann die printf -Format-Zeichenkette verwendet werden. Es gibt also keinen Grund, eine eigene Wrapper-Funktion zu erstellen, wenn bereits eine funktionierende Lösung vorhanden ist.

    
Christoph 27.01.2009 09:36
quelle
0

Wenn Sie versuchen, den Zeigerwert auszudrucken, ist die korrekte Verwendung printf("%p", i); . Der Spezifizierer 'd' steht für Ganzzahlen und das 'p' für Zeiger. Es liegt in Ihrer Verantwortung, diese richtig zu machen, und schlechte Dinge können passieren, wenn Sie sie vermischen.

Ich weiß nicht, warum das für einen char * und nicht für einen int * fehlschlagen würde, und es ist möglich, dass Sie andere Probleme haben, die das verursachen. Wenn es immer noch mit% p fehlschlägt, wurde etwas anderes durcheinander gebracht. Sehen Sie, ob Sie eine Art Speichermonitor-Software installieren können, um nach dangelnden Zeigern oder doppelten free () s zu suchen, denn an diesem Punkt ist das smarte Geld, dass Sie den Speicher irgendwo beschädigt haben.

    
David Thornley 27.01.2009 15:03
quelle

Tags und Links