Hej jungs :) ich bin auf der Suche nach einem Funktionsprototypen zum folgenden Funktionsaufruf: #include <stdio.h> #include <stdlib.h> void main(){ float *v1,v2,v3; v2=v3=5,5; v1=doSomething(&v2,&v3); } Wer kann mir helfen? :)
C? C++? int main(void); ? int main(); ? float * doSomething(float *, float *)? float * doSomething(const float *, const float *)? float * doSomething(const float * const, const float *)? ... float * const doSomething(const float * const, const float *)? usw usf. Dann kann man noch implicit conversions betrachten, also geht es auch mit double und, wenn man Warnungen akzeptiert, mit ints.
:
Bearbeitet durch User
Hei Hannes, in C :) float doSomething(float *v1, float v2, float v3); so also ? :)
Petra schrieb: > float doSomething(float *v1, float v2, float v3); float doSomething(float v2, float v3); oder so?
Klaus, wenn ich keine Ahnung habe, wie die gehen, dann brauche ich etwas Hilfe. ich will ja nicht die Lösung präsentiert bekommen, sondern Hilfe, sodass ich es verstehe ;)
float *doSomething(float *v2, float *v3); v2 und v3 sind dann die nötigen Parameter, müsste so stimmen oder?
Villeicht verwechsle ich hier etwas? Declaration:
1 | float* doSomething(float*, float*); |
Prototype:
1 | float* doSomething(); |
Petra schrieb: > float *doSomething(float *v2, float *v3); > > v2 und v3 sind dann die nötigen Parameter, müsste so stimmen oder? Ja. Stellt sich noch die Frage, ob du
1 | const float * v2 |
schreiben willst oder nicht. Ohne const kannst du den Wert, auf den v2 zeigt, in der Funktion verändern, mit const nicht. Es ist üblich den Wert, auf den den Zeiger zeigt, als const zu definieren, wenn die Funktion den Wert nicht verändern soll. Ansonsten muss der Aufrufer damit rechnen, dass der Wert in der Funktion verändert wird. Petra schrieb: > void main() In C:
1 | int main(void) { /* ... */ } |
oder
1 | int main(int argc, char ** argv) { /* ... */ } |
oder "equivalent; or in some other implementation-defined manner." Petra schrieb: > v2=v3=5,5; In C:
1 | v2=v3=5.5 |
Daniel A. schrieb: > Villeicht verwechsle ich hier etwas? > > Declaration:float* doSomething(float*, float*); > Prototype:float* doSomething(); Ja. Eine Deklaration ist nichts anderes als ein Prototyp. Du deklarierst hier zwei Funktionen mit identischem Namen, aber unterschiedlichen Parametern. In C++ ist dies erlaubt, in C nicht.
:
Bearbeitet durch User
Daniel A. schrieb: > Villeicht verwechsle ich hier etwas? Nein, du hast schon recht. In einem gewissen Sinne. Die frühen Protoypen in C waren tatsächlich so. Allerdings meint man heute mit dem Begriff 'Prototyp' praktisch immer eine (vollständige) Deklaration. Die ursprünglichen Protoypen hätten meiner Meinung nach längst aus der Sprachdefinition gestrichen werden sollen. Hier hat C++ einen ganz klaren Pluspunkt gegenüber C. An manchen Stellen rächt es sich, wenn die Normierungsgremien extrem konservativ agieren. Egal wie gefährlich eine Defintion in der Praxis ist, ist sie erst einmal im Standard drinnen, ist es extrem schwer sie dort wieder rauszubekommen. > Prototype: >
1 | float* doSomething(); |
Eine Funktion die einen float Pointer liefert und über die Argumente weiss man nichts genaues.
:
Bearbeitet durch User
Daniel A. schrieb: > Villeicht verwechsle ich hier etwas? Ja. Aus dem C-Standard:
1 | A function prototype is a declaration of a function that declares the |
2 | types of its parameters. |
be s. schrieb: > Du deklarierst hier zwei Funktionen mit identischem Namen, aber > unterschiedlichen Parametern. In C++ ist dies erlaubt, in C nicht. Das ist die Deklaration ein und derselben Funktion. Nur werden im ersten Fall auch die Argumente mitdeklariert, im zweiten Fall (alter K&R-Stil, der aber immer noch standardkonform ist) nicht. Der Prototyp einer Funktion ohne Argumente hat in C ein void als Argumentliste.
Yalu X. schrieb: > be s. schrieb: >> Du deklarierst hier zwei Funktionen mit identischem Namen, aber >> unterschiedlichen Parametern. In C++ ist dies erlaubt, in C nicht. > > Das ist die Deklaration ein und derselben Funktion. Nur werden im ersten > Fall auch die Argumente mitdeklariert, im zweiten Fall (alter K&R-Stil, > der aber immer noch standardkonform ist) nicht. Der Prototyp einer > Funktion ohne Argumente hat in C ein void als Argumentliste. Stimmt, das hatte ich einmal gelernt und zum Glück schnell wieder vergessen, da die Deklaration mit Argumenten um einiges sinnvoller und fehlerresistenter ist. Aber die Abwesenheit von "void" hätte mir eigentlich auffallen müssen, C++ lässt grüssen...
:
Bearbeitet durch User
be s. schrieb: > Stimmt, das hatte ich einmal gelernt und zum Glück schnell wieder > vergessen, da die Deklaration mit Argumenten um einiges sinnvoller und > fehlerresistenter ist. Das ist auch richtig so. Keiner verwendet die Old-Style-Deklarationen für neue Programme. Sie existieren nur noch aus Kompatibilitätsgründen. Daher war ja auch der Work-Around mit der void-Argumentliste notwendig. In C++ hat man den Mut gehabt, diese Altlast über Bord zu werfen.
Petra schrieb: > Klaus, wenn ich keine Ahnung habe, wie die gehen, dann brauche ich etwas > Hilfe. > ich will ja nicht die Lösung präsentiert bekommen, sondern Hilfe, sodass > ich es verstehe ;) Dann bist du mit jedem guten C-Buch besser bedient als mit den widersprüchlichen Halbweisheiten aus diesem Thread. Willst du jedes Detail in Foren erklärt bekommen, nur um nie ein Buch anzufassen?
Klaus W. schrieb: > Petra schrieb: >> Klaus, wenn ich keine Ahnung habe, wie die gehen, dann brauche ich etwas >> Hilfe. >> ich will ja nicht die Lösung präsentiert bekommen, sondern Hilfe, sodass >> ich es verstehe ;) > > Dann bist du mit jedem guten C-Buch besser bedient als mit den > widersprüchlichen Halbweisheiten aus diesem Thread. Die Frage ist allerdings hier, ob sie das Kochrezept für sich abgeleitet hat, wie man das macht. Denn im Grunde ist es simpel: Wenn ich einen Funktionsaufruf gegeben habe, inklusive der Datenytpen aller am Aufruf beteiligten Argumente, dann muss ich mir eben die konkret im Aufruf vorkommenden Datentypen ermitteln. Dann kommt noch die Überlegung dazu, ob in manchen Fällen ein 'höherer' Datentyp sinnvoll wäre (zb ein long, obwohl das konkret vorhandene Argument ein int-Literal ist). Das ist nichts anderes als: Ich habe einen Stecker vorgegeben, wie muss die zugehörige Buchse aussehen, damit der Stecker dort rein passt? Am Ermitteln der Datentypen scheitert es dann eben oft. Man muss dann eben auch einen Address-Of Operator erkennen wenn einer dort steht und wissen, was der mit dem Datentyp der Variablen veranstaltet. Womit wir dann allerdings wieder bei der von dir angesprochenen Literatur sind.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.