Zeiger auf Funktion

Gast #2556648
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
Angehängte Dateien:
#2556700
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.
#2556701
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.
Gast #2556759
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.
#2556771
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.
#2556888
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 :-)
Gast #5711361
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.
Gast #5711386
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren