Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » verschiedene fragen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.09.2003, 14:04 Uhr
geissbock



hi!
bin wieder einmal ohne plan. ich hoffe ihr könnt durch zahlreiche kommentare mir helfen!


C++:
static const char *rcs_keywords[] = {
   "Author",
   "Date",
   "Header",
   "HTMLid",            
   "Id",
    NULL
};

typedef enum
{
   False, True
} Boolean;

typedef struct
{
   const char *op_name;
   int (*func) (const char *op_name, Boolean do_fork,
                    unsigned int argc, char **argv);
} ManagerOpInfoRec;




1.
2. welchen vorteil habe ich mit dem zeiger auf rcs_keywords? und weshalb brauch ich die NULL am ende?
3.BOOLEAN: wie verhält sich das mit dem enum, wenn ich das in manageropinforec benutze?
4.wieso ist *func in klammern?

ich wäre für jede erklärung dankbar

mfg geissbock
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.09.2003, 15:01 Uhr
virtual
Sexiest Bit alive
(Operator)


ad 1.: Wie meinen? Findest Du den Code so blöd?

ad 2.: Naja, also eine Funktion, die zB prüft, ob in einem Text ein rcs_keyword vorkommt, könnte einfach sowas machen:

C++:
int i;
for(i=0; rcs_keywords[i]; ++i)
{
     if (strstr(zu_untersuchender_text, rcs_keywords[i])
     {
         /* Irgendein keyword gefunden */
     }
}


Das Array hat also primär die Aufgabe, zb suchen nach keywords in einer Schleife zusammenzufassen. Die NULL dient dabei als "Ende-Des-Arrays"-Markierer.

ad 3: Wie soll sich das Verhalten? Du übergibst halt entweder True oder False. Thats it.

ad 4. Weil func ein Zeiger auf eine Funktion ist. Dies ist die dafür erfoderliche Notation
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.09.2003, 16:51 Uhr
geissbock



schon mal danke. ich muss mir das aber noch mal ruhig durchdenken. sind aber schon wieder tausend groschen gefallen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.10.2003, 11:28 Uhr
geissbock




C++:
typedef struct
{
   const char *op_name;
   int (*func) (const char *op_name, Boolean do_fork,
                    unsigned int argc, char **argv);



wieso muss ich denn bei int (*func) für *op_name wieder const char angeben?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.10.2003, 12:38 Uhr
RHBaum



weil du als Parameter zu deiner funktion sicher auch mal nen const char * uebergeben willst ... oder ?
Weiss ned wie kulant C in der sache ist, aber wenn mit nem C++ compiler ueberstezt, wuerde er dir nen type conversion error um die ohren werfen.

Und auch wenn Du sicherstellst, das du da nie ne Konstante Zeichenkette uebergibst, sondern immer was selbstertelltes veraenderbares, ist es doch guter Stil durch das const anzuzeigen, das du Daten auf die der zeiger zeigt ned veraendern wirst !

Ueber Performance mach ich als c++ Programmierer mal lieber keine aussage :-)

Ciao ...

Dieser Post wurde am 01.10.2003 um 12:39 Uhr von RHBaum editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.10.2003, 12:48 Uhr
ao

(Operator)


Aaalso, mal ein bißchen ausholen.

Die Struktur ManagerOpInfoRec hat zwei Member, einen const char-Pointer und einen Funktionspointer. Beim Ausfüllen einer Instanz der Struktur kannst du diesen Pointer auf eine Funktion biegen, aber nicht auf irgendeine, sondern auf eine mit dieser Signatur:

C++:
int irgendwas (const char *op_name, Boolean do_fork, unsigned int argc, char ** argv);



Nehmen wir mal an, du hättest zwei Operationen: "Add" und "Subtract". Dazu gehören zwei Funktionen

C++:
int AddOp (const char *op_name, Boolean do_fork, unsigned int argc, char ** argv)
{
    int nResult;
    /* nResult fuer Addition berechnen */
    return nResult;
}

int SubtractOp (const char *op_name, Boolean do_fork, unsigned int argc, char ** argv);
{
    int nResult;
    /* nResult fuer Subtraktion berechnen */
    return nResult;
}



Und du erzeugst zwei Manager-Strukturen und füllst sie aus:


C++:
ManagerOpInfoRec moirAdd = { "Add", AddOp };
ManagerOpInfoRec moirSubtract = { "Subtract", SubtractOp };



Dann kannst du anschließend mit einem gegebenen Parametersatz beide Funktionen aufrufen:


C++:
int nResultAdd = moirAdd.func (moirAdd.op_name, false, nIrgendwas, ppIrgendwas);
int nResultSubtract = moirSubtract.func (moirSubtract.op_name, false, nIrgendwas, ppIrgendwas);



Die ganze Leistungsfähigkeit dieses Konzepts erschließt sich aber erst, wenn du ein Array oder eine Liste, jedenfalls einen ganzen Haufen von ManagerOpInfoRec-Strukturen hast, wo du alle abeierst oder mit geeigneten Methoden eine raussuchst und dann über (*func) () die vorher hinterlegte Funktion aufrufst, wobei es dir in dem Moment egal ist, welche Funktion das tatsächlich ist.

Funktionspointer sind nicht ganz einfach zu verstehen, aber wenn mans einmal geschafft hat, sind sie ein sehr mächtiges Mittel.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.10.2003, 15:30 Uhr
geissbock



möge die macht mit mir sein!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: