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.
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 ;)
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
constfloat*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
intmain(void){/* ... */}
oder
1
intmain(intargc,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.
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.
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...
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.