Nicht angemeldet. · Kennwort vergessen · Registrieren

Forum 2. Semester Grundlagen der systemnahen Programmierung in C RSS
Art der Übergabe, Funktionsübergabe, Stack
Nudelsuppe
Mitglied seit 01/2015
2 Beiträge
Betreff: Fragen zum Stoff
Bei mir sind beim durchgehen vom Skript ein paar Fragen aufgekommen:


1.
Im Skript steht, dass Pointer (13-5) und Arrays (13-16) an Funktionen als call-by-reference übergeben werden. (oder hat dieser geschlängelte Pfeil nur eine "sieht so aus wie"/"ist in etwa" Bedeutung??)
C unterstützt doch aber gar kein call-by-reference, sondern übergibt ausnahmslos immer per call-by-value. Durch Verwendung von Pointern und Übergabe von Adressen mag das zwar wie call-by-reference aussehen, ist aber doch gar keine. Habe ich hier falsche Informationen, oder ist das im Skript falsch? Was sollte ich bei entsprechenden MC Fragen ankreuzen?

2.
Im Skript auf Seite(n) 16-5 wird im Stack ganz oben "return-addr" und "fp-retten" gezeigt. Was darf ich mir den hierunter vorstellen? Es sieht für mich so aus, als würde hier versucht werden, irgendwo hinzuspringen, falls die main() doch mal terminieren sollte. Und welcher framepointer soll denn hier gerettet werden?

3.
Zuletzt noch eine konkrete Code Frage. Im untenstehenden Programm möchte ich ohne speziellen Sinn, sondern einfach um es einmal gemacht zu haben, einer Funktion eine andere Funktion übergeben. Die übergebene Funktion soll aber nicht wie im Beispiel im Skript eine void/void-Funktion sein, sondern einen Rück- und Übergabewert haben. Lässt sich das auch noch eleganter lösen? Also ohne dass ich funcA() zwei Parameter übergeben muss?


#include <avr/interrupt.h>
#include <7seg.h>

void funcA(uint8_t (*j)(uint8_t ), uint8_t arg_von_j){
    sb_7seg_showNumber(j(arg_von_j));   
}

uint8_t funcB(uint8_t a){
    sb_7seg_showNumber(a);
    return (a<<1);   
}

void main(void){
sei();
funcA( funcB , 29);

while(1){}

}


Danke schonmal im vorraus :)
Raim
GSPiC-Guru
Mitglied seit 05/2011
79 Beiträge
Zitat von Nudelsuppe am 17.07.2015, 18:23:
1.
Im Skript steht, dass Pointer (13-5) und Arrays (13-16) an Funktionen als call-by-reference übergeben werden. (oder hat dieser geschlängelte Pfeil nur eine "sieht so aus wie"/"ist in etwa" Bedeutung??)
C unterstützt doch aber gar kein call-by-reference, sondern übergibt ausnahmslos immer per call-by-value. Durch Verwendung von Pointern und Übergabe von Adressen mag das zwar wie call-by-reference aussehen, ist aber doch gar keine. Habe ich hier falsche Informationen, oder ist das im Skript falsch? Was sollte ich bei entsprechenden MC Fragen ankreuzen?

Alles richtig so weit. C benutzt call-by-value, aber mit Zeigern lässt sich call-by-reference nachbilden.

Zitat von Nudelsuppe am 17.07.2015, 18:23:
2.
Im Skript auf Seite(n) 16-5 wird im Stack ganz oben "return-addr" und "fp-retten" gezeigt. Was darf ich mir den hierunter vorstellen? Es sieht für mich so aus, als würde hier versucht werden, irgendwo hinzuspringen, falls die main() doch mal terminieren sollte. Und welcher framepointer soll denn hier gerettet werden?

Wenn ein Betriebssystem verwendet wird (wie im Beispiel auf IA-32 üblich), terminiert die main-Funktion tatsächlich ganz normal und gibt auch einen Wert zurück. Die Rückkehr erfolgt dann in eine C-Bibliotheksfunktion, die automatisch dazu gebunden wird.

Zitat von Nudelsuppe am 17.07.2015, 18:23:
3.
Zuletzt noch eine konkrete Code Frage. Im untenstehenden Programm möchte ich ohne speziellen Sinn, sondern einfach um es einmal gemacht zu haben, einer Funktion eine andere Funktion übergeben. Die übergebene Funktion soll aber nicht wie im Beispiel im Skript eine void/void-Funktion sein, sondern einen Rück- und Übergabewert haben. Lässt sich das auch noch eleganter lösen? Also ohne dass ich funcA() zwei Parameter übergeben muss?

Nein, Funktionszeiger und Parameter müssen dann separat übergeben werden.
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen