2010-04-04 12 views
7

Ich lerne C und ich sah in einem Buch, dass ein Funktionsprototyp die Form void f() hat und in der Funktionsdeklaration oder in der aufrufenden Funktion die f-Funktion Argumente übernimmt.
Also haben wir in der Funktionsdeklaration etwas wie void f (long double y [], long double A) und in der aufrufenden Funktion f (y, A).
Die Funktion führt Operationen an dem Array aus, d.h. wenn die Funktion aufgerufen wird, ändern sich einige Elemente in dem Array y. A ist nur ein konstanter numerischer Wert, der sich nicht ändert. Ich habe zwei Fragen:C-Funktion Prototyp: void f(). Ist es empfehlenswert?

  1. Wenn die Funktion Prototyp oben im Programm als void f() eine gute Praxis? Oder ist es besser, es als void f (long double y [], long double A) wie in der Funktionsdeklaration zu setzen?

  2. Die aufgerufene Funktion f ändert Elemente im Array y. Ist der richtige Rückgabetyp ungültig? Das Programm funktioniert als solches mit dem leeren wie beschrieben.
    Oder sollte ich alle meine "Voids" in "Long Double" ändern.
    Ich arbeite mit langen Doppel, da ich so viel Präzision wie möglich brauche, obwohl auf meiner Maschine sowohl Doppel-und Langdoppel gibt mir 15 Präzisionsziffern.

Vielen Dank

+5

In welchem ​​Buch hast du das gesehen? –

+0

"void f (lange doppelte y [], lange doppelte A)" ist "long double y []" erlaubt als Parameter? –

+0

@Andrei, sicher, warum nicht? –

Antwort

7

Wenn die Definition der Funktionsprototyp bei die oben in dem Programm als void f() eine gute Praxis? Oder ist es besser, es als void f (lange doppelte y [], lange double A) wie in der Funktion Deklaration?

Definitiv Letzteres - der Erste gibt dem Compiler keine Typinformationen für Kompilierzeitprüfungen. void f() teilt dem Compiler mit, dass f eine nicht spezifizierte Argumentliste verwendet. I.e. alles geht.

Die aufgerufene Funktion f ändert Elemente im Array y. Ist der Rechtsretourentyp ungültig? Das Programm ist funktioniert so gut mit dem leeren als beschrieben.

Der Rückgabetyp hat nichts mit dem zu ändernden Parameter zu tun. Sie können einen Nicht-void Rückgabetyp haben, wenn Sie jedoch einen Erfolgscode angeben möchten.

+0

Nachdem ich all Ihre Kommentare hier gelesen habe, verstehe ich, dass, obwohl void f() funktioniert, es nicht empfohlen wird. Es ist sicherer, dem Compiler die richtigen Argumente zu geben. – yCalleecharan

4

Nein, es ist nicht gut, eine Erklärung mit unbestimmten Argumenten zu haben. In C (aber nicht in C++) ist es erlaubt, eine Funktion als f() zu deklarieren, ohne das Argument anzugeben, aber die Verwendung dieser Funktionalität sollte vermieden werden. Wenn die Funktion keine Argumente akzeptiert, verwenden Sie f(void), um dies explizit zu markieren. Wenn die Funktion ein Argument akzeptiert, sollten Sie die Typen der Argumente immer in die Deklaration aufnehmen.

+0

Danke für die Klärung. Nachdem ich alle 3 Antworten hier gelesen habe, verstehe ich, dass der Code so weit wie möglich lesbar gemacht werden muss und dass ich gute Programmierstandards befolgen muss. – yCalleecharan

10

Ihre Frage leidet unter einer terminologischen Verwechslung.

void f(); 

ist nicht ein Funktionsprototyp in C. Dies ist eine Funktionsdeklaration, die keinen Prototyp einführt.Inzwischen

void f(long double y[], long double A); 

ist auch eine Funktionsdeklaration, und dies ist ein Prototyp (das heißt tut es einen Prototyp für f vorstellen).

Um Ihre Fragen zu beantworten, ja, es ist immer eine gute Praxis, Funktionen mit Prototypen zu deklarieren (d. H. Es ist besser, sie mit Prototypen zu deklarieren als ohne Prototypen). Normalerweise sollten Sie Prototypen für alle Ihre externen Funktionen deklarieren (und void f() ist kein Prototyp).

Wie für die Rückgabetypen, ist alles eine Frage Ihrer Absicht. Ich sehe nicht, wie die Tatsache, dass Sie die Elemente des Arrays ändern, es besser machen sollte, long double anstelle von void zurückzugeben.

+0

Danke für den Hinweis auf den Fehler in der Terminologie und für den letzten Kommentar, was die Funktion ist "Rückkehr". – yCalleecharan

Verwandte Themen