Forum: Compiler & IDEs Zeiger auf Funktion


von Lyly (Gast)


Angehängte Dateien:

Lesenswert?

hallo zusammen,

ich bin Anfängerin und versuche Zeiger auf Funktion zu vestehen.
Ich möchte Zahlen sortieren. Aber erstmals habe ich einne Zeiger auf der 
Funktion u8ChoiceBubble definiert, in dieser Funktion möchte ich nur 
wissen ob ich eine aufsteigende sortieren machen soll oder nicht.
Mein Problem: Ich möchte gern wissen, ob ich der Rückgabewert auf die 
Funktion u8ChoiceBubble(char *pArray) überprüfen kann. Der Wert von 
Argument u8ChoiceBubble während der Aufruf der Funktion 
vBubblesort(u8ChoiceBubble,cArray, u8LencArray);

Danke sehr

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

u8ChoiceBubble sollte doch zwei zu vergleichende Elemente bekommen und 
entscheiden, welchen größer ist. Ansonsten ist solwas doch nicht so 
zweckmässig.

bool u8ChoiceBubble (uint8_t, uint8_t);

Je nachdem, wleche Sortierreihenfolge erreicht werden soll, wird eine 
andere Ordnungsrelation mitgegeben.

von Karl H. (kbuchegg)


Lesenswert?

Du musst dir darüber im klaren werden, wozu du eigentlich eine derartig 
indirekt aufgerufene Funktion brauchst, was ihr Zweck ist.
Und darüber bist du dir nicht im klaren.

Ein Sortierverfahren sortiert ein Array anhand eines Sortierkriteriums. 
Dieses Kriterium ist es, das du variabel halten willst. Anstatt das der 
Sortier-Basisalgorthmus zb eine Abfrage enthält ob a[i] kleiner als 
a[i+1] ist (wodurch indirekt das Kriterium 'kleiner' in das 
Sortierverfahren eingebaut ist), ruft es eine Funktion auf, die 
entscheidet, welche Reihenfolge die richtige ist. Dadurch wird der 
Sortieralgorithmus selbst davon befreit.

Zb Bubblesort

umgangssprachlich ausgedrückt, läuft der so ab

   nimm an, dass nicht sortiert ist

   solange Sortierung nicht hergestellt {

     Annahme: Sortierung ist hergestellt

     für alle hintereinanderfolgenden Pärchen

     wenn sie in der falschen Reihenfolge sind {
       vertausche sie
       merk dir, dass die Sortierung nicht hergestellt ist
     }
   }

das einzige, was davon abhängt, ob du aufsteigend oder absteigend 
sortieren willst, ist der Schritt "wenn sie in der falschen Reihenfolge 
sind". Alles andere ist davon vollkommen unabhängig. D.h. in diesem 
Schritt benutzt du einen Funktionspointer auf eine Funktion, deren 
Aufgabe es ist, festzustellen, ob die Reihenfolge 2-er Einträge passt, 
oder ob sie verändert werden muss.

von Andreas B. (andreas_b77)


Lesenswert?

Lyly schrieb:
> Mein Problem: Ich möchte gern wissen, ob ich der Rückgabewert auf die
> Funktion u8ChoiceBubble(char *pArray) überprüfen kann.

Falls ich das richtig verstehe, ist die Frage, ob man einen Rückgabewert 
der über Pointer aufgerufenen Funktion abfragen kann. Natürlich kann 
man, eine Funktion ruft man über Pointer genau so auf wie direkt, nur 
mit dem Pointernamen statt direkt dem Funktionsnamen.

Der Test "if (pBubble==0)" prüft dagegen nur, ob der Zeiger selbst 
gleich 0 ist.

von Lyly (Gast)


Lesenswert?

ich verstehe  gar nicht

von Karl H. (kbuchegg)


Lesenswert?

Lyly schrieb:
> ich verstehe  gar nicht

Dann bist du mglw. noch nicht soweit, das Potential für Funktionspointer 
zu sehen. Warte noch ein wenig. Das Potential von Funktionspointern 
erschliesst sich erst, wenn man ein wenig Übung hat.

von Lyly (Gast)


Lesenswert?

Hallo,
ich möchte gern die Funktion u8ChoiceBubble benutzen, um zu wissen ob 
das Sortieren aufsteigend oder absteingend soll.
In der Funktion vBubblesort werde ich dann abfragen, if(pBubble==0) dann 
ein Algorithm für eine aufsteigende Sortierung machen. Wenn nicht für 
eine absteingende Sortierung.

von Karl H. (kbuchegg)


Lesenswert?

Lyly schrieb:
> Hallo,
> ich möchte gern die Funktion u8ChoiceBubble benutzen, um zu wissen ob
> das Sortieren aufsteigend oder absteingend soll.


Wozu soll das gut sein.

Schreib 2 Funktionen, eine die aufsteigend sortiert, eine die absteigend 
sortiert. Dann schreibst du dir eine Funktion, die einen zusätzlichen 
Parameter nimmt (Art der Sortierung) und entsprechend dessen entweder 
die eine Funktion aufruft oder die andere.

Das ist deinem Kentnissstand angemessen. Funktionspointer braucht dazu 
niemand. Vor allen Dingen bringt dir ein Funktionspointer an dieser 
Stelle so wie du das möchtest, nicht das geringste. Ganz im Gegenteil.

Und solange du das noch nicht siehst, ist es für Funktionspointer für 
dich noch zu früh.

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Wozu soll das gut sein.

Hausaufgabe?

von Karl H. (kbuchegg)


Lesenswert?

Klaus Wachtler schrieb:
> Karl Heinz Buchegger schrieb:
>> Wozu soll das gut sein.
>
> Hausaufgabe?

Möglich. Wann genau nimmst du mit deinen Studenten Funktionspointer 
durch?
(Mir fehlt es nämlich sowohl bei der Fragestellung, als auch am 
präsentierten Code an Substanz, die mich zuversichtlich machen würde, 
dass der Fragesteller soweit ist, mit FP umzugehen)

von Klaus W. (mfgkw)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Möglich. Wann genau nimmst du mit deinen Studenten Funktionspointer
> durch?

inzwischen gar nicht mehr, aber ansonsten dann, wenn sie bsearch oder 
qsort brauchen oder (wenn es Ings sind) bei DGL-Lösern o.ä., also dann 
wenn sie es brauchen.

Jedenfalls nicht, bevor sie die einfachen Grundlagen von C verstanden 
haben - sonst ist es sinnlos, auch wenn morgen Abgabe wäre :-)

von Klaus W. (mfgkw)


Lesenswert?

@Lyly: diese ganzen grundlegenden Sachen lernt man am PC wesentlich 
besser als an einem Controller. Dadrin ist es dunkel, und du hast keine 
Ahnung, was schiefläuft.

Tu dir den Gefallen und lerne erst C, und nimm dann einen Controller in 
die Hand.

von MicroFrickler (Gast)


Lesenswert?

Ich habe auch eine Frage zu Zeiger auf Funktionen.

Bei einer nicht statischen, lokalen Variable weiß man ja, dass ein 
Zeiger da nur dann Sinn hat, wenn die Variable auf dem Heap existiert 
und aktiv ist. Nach dem Löschen der Variable wird das Symbol diese 
Variabel wahrscheinlich an einer anderen Adresse des Speichers neu 
anlegen.

Wie ist es mit Funktionen, können die auch ihre Adresse ändern während 
der Programmlaufzeit?
Ich glaube es nicht, weil sie ja entweder global oder statisch sein 
können, aber da ich mit Zeigern auf Funktionen arbeite, will ich auf 
Nummer sicher gehen.

von g457 (Gast)


Lesenswert?

Ein eigener Fred wäre glaube ich nicht unangebracht.

> Bei einer nicht statischen, lokalen Variable weiß man ja, dass ein
> Zeiger da nur dann Sinn hat, wenn die Variable auf dem Heap existiert
> und aktiv ist.

..oder auf dem Stack. Oder sonstwo im Speicher.

> Nach dem Löschen der Variable wird das Symbol diese Variabel
> wahrscheinlich an einer anderen Adresse des Speichers neu anlegen.

Wie meinen?

> Wie ist es mit Funktionen, können die auch ihre Adresse ändern während
> der Programmlaufzeit?

Die Antwort darauf lautet eindeutig 'jein' - eigentich normalerweise 
nicht, aber es gibt da halt doch sowas wie dynamisches Linken, und damit 
halt doch irgendwie schon.

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.