hallo Felix G,
das ist sehr interessant mit den function-pointern. bisher war mir das ein Buch mit sieben siegeln, deshalb habe ich 1-2 möglicherweise triviale fragen und einen batzen code.
Code:
#include<stdio.h>;
#include<malloc.h>;
#include<conio.h>; // fuer getch
// die listenstruktur
struct LISTELEM
{
int nr;
struct LISTELEM *next;
};
/*****************************************************************
weist dem uebergebenen element eine nummer zu
*****************************************************************/
void number(struct LISTELEM *elem)
{
elem->nr=1;
}
/*****************************************************************
gibt daten des uebergebenen elements aus
*****************************************************************/
void output(struct LISTELEM *elem)
{
printf("element %d an adresse %x\r\n",elem->nr,elem);
}
/*****************************************************************
crawled durch die liste "chain" und ruft die funktion fct() auf
*****************************************************************/
void crawl(struct LISTELEM *chain,void fct(struct LISTELEM *elem),int delete)
{
struct LISTELEM *old; // fuer loeschen von listenelementen
while(chain!=NULL)
{
if(fct)fct(chain);
if(delete)
{
old=chain;
printf("*");
}
chain=chain->next;
if(delete)free(old);
}
}
/*****************************************************************
einsprungspunkt main
*****************************************************************/
int main(void)
{
int i;
struct LISTELEM *list=NULL;
struct LISTELEM *chain;
// liste anlegen
for(i=0;i<10;i++)
{
chain=(struct LISTELEM *)malloc(sizeof(struct LISTELEM));
chain->nr=i;
chain->next=list;
list=chain;
}
// aufrufe von crawl mit verschiedenen funktion-pointern
crawl(list,output,0);
crawl(list,number,0);
crawl(list,NULL,1);
getch();
return 0;
}
/****************************************************************/
es wird eine verkettete liste angelegt (in main) und dann die funktion crawl aufgerufen, die sich durch die liste hangelt und die übergebene funktion (number oder output) darauf anwendet. das scheint soweit ganz gut zu klappen, allerdings kann ich der funktion output keinen weiteren parameter (einen wert, der zugewiesen werden soll zB) übergeben, ohne dass ich der output funktion quasi als dummy auch einen wert übergebe, obwohl sie ihn nicht benötigt(?). bräuchte ich da variable parameter?
zum anderen fällt mir keine funktion ein, die ein element löscht, (weil dann crawl ja das nächste element (chain->next) nicht mehr findet. deshalb das workaround mit "if(delete)...".
scheinbar sind functionpointer ein sehr mächtiges werkzeug, das ich aber hier recht ungeschickt anwende..
vielleicht kannst du mir ja bisschen auf die sprünge helfen.
gruesse von der katze
Lesezeichen