www.mikrocontroller.net

Forum: PC-Programmierung Aufrufen einer Funktion, Parameter aus Array "C"


Autor: Jakob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo! Nachdem mir schon tatkräftig geholfen wurde und ich mich gerade 
mit dem Aufruf von Funktionen beschäfftige, ist gleich eine Frage 
aufgetaucht.

ich habe ein int-Array beliebiger Länge
...
werte[0]=0;
werte[1]=1;
werte[2]=2;
...

nun habe ich eine Funktion "Rechne" und möchte die Zahl "werte[i]" aus 
dem Array der Funktion zum Rechnen übergeben.
nun frag ich mich grade wie das genau geht.
void Rechne(int werte[i])
{ ... }

oder macht man das mit Zeigern
void Rechne(int *werte[])

oder ist beides vom Ergebnis her gleich, oder ist beides Unsinn!? Der 
Parameter i soll im Program variabel einstellbar sein.
Danke Jakob

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steht sowas nicht in deinem C-Buch?

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jakob schrieb:
> void Rechne(int werte[i])
>
> { ... }

das ist ja nun völliger Blödsinn

wenn schon
int /* oder wo soll das Ergebnis hin*/ Rechne(int nA, int nB)

Autor: Tim T. (tim_taylor)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch wenns in wahrscheinlich JEDEM C-Buch steht:
void Rechne( int einwert ) {
...
}

int main( void ) {
...
 Rechne( Werte[ i ] );
...
}

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jakob schrieb:
> ich habe ein int-Array beliebiger Länge

ok


> nun habe ich eine Funktion "Rechne" und möchte die Zahl "werte[i]" aus
> dem Array der Funktion zum Rechnen übergeben.

gut

>
> void Rechne(int werte[i])
> { ... }
> 

Das kanns ja wohl nicht sein.
Die Funktion Rechne übernimmt einen int. Wo dieser int her kommt, in 
deinem Fall aus einem Array, hat doch die Funktion nicht zu 
interessieren.

Ob du die Funktion so aufrufst
   Rechne( 5 );
oder so
  int k = 8;
  Rechne( k );
oder gar so
  Rechne( k + 12 );
oder eben so
  Rechne( werte[i] );
immer bekommt die Funktion einen int übergeben.

Und daher definierst du die Funktion dann auch so
void Rechne( int derWert )
{ ... }

Funktionen sind und sollen davon unabhängig sein, wo der Wert herkommt, 
der ihnen in der Argumentliste übergeben wird. Es hat die Funktion 
einfach nicht zu interessuieren. Später wirst du dann irgendwann lernen, 
wie man diesen Mechanismus aushebeln kann, so dass die Funktion dann 
auch tatsächlich auf eine Variable des Aufrufers durchgreifen kann. Aber 
im Moment ist das nicht notwendig.

Autor: Brummer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe da irgendwie nen Denkfehler drin gehabt, aber durch deine 
Erklärung hab ich es jetzt verstanden.

Autor: Loonix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas Eckmann schrieb:
> Jakob schrieb:
>> void Rechne(int werte[i])
>>
>> { ... }
>
> das ist ja nun völliger Blödsinn

...und mal wieder Einer der auf dicke Hose macht, weil er in 
C-Grundlagen einem Anfänger überlegen ist...

Nehmt euch lieber mal ein Beispiel an der Engelsgeduld von Karl-Heinz 
Buchegger!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ... hab ich es jetzt verstanden.

Gut, das ist nämlich wichtig.

Viele Neulinge glauben nämlich, dass es in diesem Beispiel

int foo( int wert )
{
  return wert + 2;
}

int main()
{
  int wert = 5;
  int i;

  i = foo( wert );
}

zwischen der Variablen 'wert' in main und dem Parameter 'wert' in foo 
einen magischen Zusammenhang gibt. Da gibt es aber keinen. Das sind 2 
getrennte Variablen, die nur zufällig den gleichen Namen tragen. Es 
würde sich nichts ändern, wenn man das 'wert' in foo 'schnurdiburr' 
nennen würde.
Beim Aufruf einer Funktion werden die Funktionsargumente ausgewertet, 
ihr Wert festgestellt

int main
{
  ...
  i = foo( wert );

an dieser Stelle wird festgestelle, dass wert momentan den Zahlenwert 5 
hat. Diese 5 werden genommen und

int foo( int wert )

an die hier angegebene Parametervariable, die zufälligerweise auch 
'wert' heisst, gebunden. Innerhalb der Funktion beginnt diese Variable 
ihr Leben damit, dass sie die 5 vom Aufrufer als Initialwert bekommt.

Das bedeutet aber auch, dass es keinen Zusammenhang zwischen den 
Variablen hier
    i = foo( wert );
und den Variablen hier
int foo( int wert )
gibt, ausser dass die Zahlenwerte von dem einen auf die anderen 
übertragen werden.

Und damit ist es einer Funktion auch egal, wie genau der Zahlenwert 
entsteht, den sie bekommt. Das ist nicht ihr Bier und passiert auf der 
anderen Seite einer imaginären Grenze an der der Einflussbereich der 
Funktion beginnt.
Da diese Funktion selber wieder einen int returniert (sie liefert einen 
int), ist das hier völlig in Ordnung
int main()
{
  int i;

  i = foo( foo(5) );
]

Die Funktion foo wird mit 5 als Argument aufgerufen (der innere Aufruf) 
und liefert wieder einen int (mit dem Wert 7). Dieser int (die 7) wird 
erneut in einen Funktionsaufruf der Funktion foo hineingesteckt und die 
Funktion wird damit noch einmal aufgerufen und liefert ein Ergebnis (9), 
welches in diesem Fall dann an i zugewiesen wird. Man hätte es aber auch 
an jeder anderen beliebigen Stelle benutzen können, an der ein int 
gefordert ist.

Autor: Wolfgang Bengfort (et-tutorials) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht hilft da mein Video-Tutorial

http://et-tutorials.de/mikrocontroller/

Folgen 36 - 38

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.