Forum: PC-Programmierung Funktionsprototyp


von Petra (Gast)


Lesenswert?

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? :)

von Hannes W. (7nrn3ap3)


Lesenswert?

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
von Petra (Gast)


Lesenswert?

Hei Hannes, in C :)

float doSomething(float *v1, float v2, float v3);

so also ? :)

von Petra (Gast)


Lesenswert?

Petra schrieb:
> float doSomething(float *v1, float v2, float v3);

float doSomething(float v2, float v3);

oder so?

von Klaus W. (mfgkw)


Lesenswert?

oder Hausaufgaben selber machen?

von Petra (Gast)


Lesenswert?

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 ;)

von Petra (Gast)


Lesenswert?

float *doSomething(float *v2, float *v3);

v2 und v3 sind dann die nötigen Parameter, müsste so stimmen oder?

von Daniel A. (daniel-a)


Lesenswert?

Villeicht verwechsle ich hier etwas?

Declaration:
1
float* doSomething(float*, float*);

Prototype:
1
float* doSomething();

von B. S. (bestucki)


Lesenswert?

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
von Karl H. (kbuchegg)


Lesenswert?

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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von B. S. (bestucki)


Lesenswert?

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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

Petra schrieb:
> v2=v3=5,5;

was denkst du, was hier passiert?

und jetzt?
v2=v3=5,3;

von Klaus W. (mfgkw)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.