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
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.
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.
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.
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.
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.
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.
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)
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 :-)
@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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.