Probleme bei Adressenauswahl von einem Makro



  • Danke für deine Mühe...Hmmm...

    // funktion für das makro
    void wrlmode_function (UINT16 adr, UINT16 val)
    {
       wrlmode(adr,val);
    }
    ...
    // neuer typ für den function pointer
    typedef void (*fptr)(UINT16, UINT16);
    ...
    // einen function pointer anlegen
    fptr func;
    ...
    // ...die funktion da rein ...
    [b]func = wrlmode_function;[/b]
    ...
    // ... und aufrufen  
    func (1,2);
    

    ⚠ Fehlermeldung:

    Error at line 14 : syntax error near `void`
    Error at line 14: function body for non-function
    Error at line 14: unable to recover from syntax error

    😕



  • welchen compiler benutzt du?
    🙂



  • Benutze 80C196 C Compiler v5.0



  • welcher hersteller? keil? tasking?
    ach ja, und du postest immer mein beispiel. zeig doch mal den originalcode, den du versuchst, dem compiler aufs auge zu drücken.
    🙂



  • Hersteller (C)1996 Tasking Software BV

    Mein Code:

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
    
    void wrlmode_function (uint16 adr, uint16 val)
    
    {
    
    wrlmode(adr,val);
    
    }
    
    typedef void (*fptr)(uint16,uint16);
    
    fptr func;
    
    func = wrlmode_function;
    
    func (1,2);
    
    #else
    
     UINT16	 aiWritePDBuffer[2];
     UINT16  aiReadPDBuffer[2];
     UINT16* const piWritePD  = aiWritePDBuffer;
     UINT16* const piReadPD   =  aiReadPDBuffer;
    
    #endif
    

    --> steht alles am Anfang,also nicht in main ()



  • aber mindestens das hier:

    fptr func;
    func = wrlmode_function;
    func (1,2);
    

    muss in eine funktion rein (z.b. in die main).
    🙂



  • oben:

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
    
    void wrlmode_function (uint16 adr, uint16 val)
    
    {
    
    wrlmode(adr,val);
    
    }
    
    typedef void (*fptr)(uint16,uint16);
    
    #else
    
     UINT16     aiWritePDBuffer[2];
     UINT16  aiReadPDBuffer[2];
     UINT16* const piWritePD  = aiWritePDBuffer;
     UINT16* const piReadPD   =  aiReadPDBuffer;
    
    #endif
    

    unten (Ablauf):

    void task2(void)	
    
    {
      register uint16 tl,th;
      register uint8  temp;
    
      taskinit ();
    
      firsttime  = 1;
      pbinitdone = 0;
    
    [b]fptr func;
    
    func = wrlmode_function;
    [/b]
    
    func (1,2);
    
    }
    

    ⚠ für unten:

    Error at line 15 : syntax error near `func`
    Error at line 15 : undefined indentifier: func
    Error at line 18 : undefined indentifier: func
    Error at line 18: incompatible types

    [b]typedef void (*fptr)(uint16,uint16);[/b]
    

    --> nach unten ?

    😕



  • ich weiss echt nicht, was du da anstellst. nimm mal diese zeilen:

    void wrlmode_function (unsigned short adr, unsigned short val)
    {
    }
    
    typedef void (*fptr)(unsigned short, unsigned short);
    
    void f(void)
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    }
    

    erstelle ein neues .c file und kopier das da unverändert rein. nichts hinzufügen und nichts weglassen. ...und dann füttere deinen compiler mal damit.
    🙂



  • Prima das geht schon mal... 👍 ,

    Jetzt muss ich es nur wieder richtig einbauen...

    Habe es eingebaut.Geht auch. 😋 👍

    Jetzt fehlt aber oben noch die Anweisung in

    void wrlmode_function (unsigned short adr, unsigned short val)
    {
    
    [b]wrlmode(adr,val); [/b]...Oder ?
    
    }
    


  • Guiekalle schrieb:

    Jetzt fehlt aber oben noch die Anweisung in
    void wrlmode_function (unsigned short adr, unsigned short val)
    {
    }

    das war auch nur ein testcode, ob dein compiler z.b. mit dieser function-pointer syntax klar kommt, etc. ich hab' bewusst alles weggelassen, wofür du irgendwas hättest #includen müssen. wenn jetzt noch irgendwas zickt, dann solltest du deine c-kenntnisse mal auffrischen.
    🙂



  • Du hast es echt drauf...wäre froh wenn ich einen Syntax kennen würde...und du spielst damit rum...klasse... 👍

    Da hast du recht meine Kenntnisse machen mir Angst...he he... 🙄

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    #define rdlmode(adr)  (outword (MOD1ADR+0x10,(adr)),inword  (MOD1ADR+0x108))
    
    void wrlmode_function (unsigned short adr, unsigned short val)
    
    {
    
    wrlmode(0x3800,0x11); /*Schreibe Wert 11 in Speicher 3800*/
    
    }
    
    typedef void (*fptr)(unsigned short, unsigned short);
    
    void f(void)
    
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    }
    

    So jetzt muss ich mir den Wert ausgeben lassen...und testen 👍

    Das passiert hier:

    MWA_Block = rdlmode(0x3800); /Auslesen von Speicher 3800 in Variable  MWA_Block*/
    
    putshex(ZS(21,00),MWA_Block,NORML(BLK,WHT)); /*Anzeigen der Variable MWA_Block*/
    


  • Guiekalle schrieb:

    ...wäre froh wenn ich einen Syntax kennen würde...und du spielst damit rum..

    wenn du ein bisschen länger mit C rumfummelst, kannst du das auch.
    🙂



  • Hallo ich bins noch mal:

    Also es ergeben sich keine Fehler,jedoch wollte ich nun func für einen Schreibvorgang weiterverwenden,und da scheint es noch nicht zu stimmen.

    Möchte zu Testzwecken den Wert 11 in den Speicher 3800 schreiben.

    #define wrlmode(adr,val)  (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    #define rdlmode(adr)  (outword (MOD1ADR+0x10,(adr)),inword  (MOD1ADR+0x108))
    
    void wrlmode_function (UINT16 adr,UINT16 val)
    
    {
    
    wrlmode(0x3800,0x11); 
    
    }
    
    typedef void (*fptr)(UINT16,UINT16);
    
    void f(void)
    
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    }
    
    #ifdef ABCC_PARALLEL_DIRECT_ACCESS_THROUGH_PTR
    
    UINT16* const  piWritePD   = (UINT16*)(func); 
    
    /*anstelle von  UINT16* const piWritePD = (UINT16*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3800 ); */
    
    #else
    
     UINT16	 aiWritePDBuffer[2];
     UINT16  aiReadPDBuffer[2];
     UINT16* const piWritePD  = aiWritePDBuffer;
     UINT16* const piReadPD   =  aiReadPDBuffer;
    
    #endif
    
    #define WriteParallel(func,adr,val)
    
    void task2(void)
    
    {
    
      register uint16 tl,th;
      register uint8  temp;
    
       taskinit ();
    
       firsttime  = 1;
       pbinitdone = 0;
    
       WriteParallel(piWritePD,0x3800,0x11); /*Schreiben von Wert 11 in 0x3800*/
    
       pbtim = ticks(1500000); /*delay*/
    
       while(pbtim);
    
       MWA_Block = rdlmode(0x3800); /*einlesen*/
    
       putshex(ZS(21,00),MWA_Block,NORML(BLK,WHT)); */ausgeben*/
    

    Dachte func verhält sich nun wie eine Variable... 😕



  • Guiekalle schrieb:

    Dachte func verhält sich nun wie eine Variable...

    so ist es doch auch. in func kannst du die adresse jeder funktion speichern, die die signatur void f (uint16, uint16) hat.
    🙂



  • Okay... 🙂

    Muss ich beim Verwenden etwas beachten...?

    [b]UINT16* const  piWritePD   = (UINT16*)(&func);   :confused: 
    
    /*anstelle von  UINT16* const piWritePD = (UINT16*)( ABCC_PARALLEL_BASE_ADDRESS + 0x3800 ); */[/b]
    

    Und falls es stimmt dann:

    #define WriteParallel([b]&func[/b],adr,val)
    
    void task2(void)
    
    {
    
      register uint16 tl,th;
      register uint8  temp;
    
       taskinit ();
    
       firsttime  = 1;
       pbinitdone = 0;
    
       WriteParallel([b]piWritePD[/b],0x3800,0x11); /*Schreiben von Wert 11 in 0x3800*/
    
       pbtim = ticks(1500000); /*delay*/
    
       while(pbtim);
    
       MWA_Block = rdlmode(0x3800); /*einlesen*/
    
       putshex(ZS(21,00),MWA_Block,NORML(BLK,WHT)); */ausgeben*/
    

    Bin mir bei der Übergabe nicht so sicher... 😞



  • Guiekalle schrieb:

    Bin mir bei der Übergabe nicht so sicher...

    #include <stdio.h>
    // *** fricky's little function pointer tutorial ***
    
    // erstmal eine funktion ...
    void f1 (void)
    {
       puts ("hello, i'm f1 !");
    }
    
    // ...und noch eine funktion
    void f2 (void)
    {
       puts ("what? me worry");
    }
    
    // wir bauen uns nun einen typ für unseren function pointer
    typedef void (*fptr)(void);
    
    // hier ist die main funktion. alle c-programme fangen so an
    int main (void)
    {
      // nun brauchen wir erstmal einen function pointer
      // wir verwenden dabei unser neues typedef
      fptr func;
    
      // den function pointer lassen wir jetzt auf unsere erste funktion zeigen
      func = f1;
    
      // mal sehen, ob's auch geklappt hat
      func();
    
      // na fein! nun versuchen wir es mal mit der anderen funktion
      // aber mit dem selben(!) function pointer
      func = f2;
    
      // und???
      func();
    
      // perfekt!
      puts ("vielen dank, dass sie dieses tutorial so aufmerksam durchgearbeitet haben. bis zum naechsten mal!");
    }
    

    🙂



  • Echt spitze deine Anleitung... 👍

    Ich hab es hinbekommen einen Wert 11 mit func zu schreiben...*freu*... 😉

    So jetzt muss ich func in einen anderen Pointer einlagern...überleg

    UINT16* const piWritePD = (UINT16*)(func); ... :warning:
    

    ...und mit diesem dann ein Schreiben auslösen...*hui*

    WriteParallel(piWritePD,0x3800,0x11); /*Schreiben von Wert 11 in 0x3800*/
    

    Melde mich...schade nur,dass ich das System von 7uhr-16uhr habe...aber wird schon...Bis bald...



  • #include <stdio.h>
    // hallo, liebe c-freunde. willkommen zum zweiten teil von fricky's fptr tutorial
    // heute lernen wir, wie man funktionspointer an andere funktionen weitergeben kann 
    
    // erstmal brauchen wir wieder eine funktion. ohne die geht gar nichts.
    void f1 (void)
    {
       puts ("hallo, ich bin die hauptfunktion");
    }
    
    // auch hier wieder: unser neuer typ für einen function pointer
    typedef void (*fptr)(void);
    
    // hier haben wir jetzt eine funktion, die einen function pointer entegennehmen kann
    // wie ihr alle sehen könnt, erscheint unser neuer typ in der argumentenliste als einziges argument namens 'fp'
    void intermediate_func (fptr fp)
    {
      puts ("hallo ich bin die zwischenfunktion");
      // na, ob das wohl so klappt?
      fp();
    }
    
    // wir wollen es gleich ausprobieren und brauchen dafür wieder eine main funktion...
    int main (void)
    {
      // ... und unsereren schon bekannten function pointer
      // den wir jetzt sofort auf unsere f1-funktion zeigen lassen
      fptr func = f1;
    
      // so, jetzt kommt der augenblick der wahrheit ~zitter~
      intermediate_func (func);
    
      // unglaublich! das ging ja! mal sehen, ob's auch direkt geht ~bibber~
      intermediate_func (f1);
    
      // funzt!!! that's coool! C ist ja so unglaublich geil!!!
      puts ("so, das war's mal wieder fuer heute. vielen dank fuer euer interesse und - bis bald\n");
    }
    

    🙂



  • Einfach klasse... 👍 ...werde mir beides ausdrucken und zu meinen Unterlagen geben... :p

    So noch mal zu meinem Code - funktioniert prima.

    #define wrlmode(adr,val) (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    #define rdlmode(adr)     (outword (MOD1ADR+0x10,(adr)),inword  (MOD1ADR+0x108))
    
    void wrlmode_function (UINT16 adr, UINT16 val)
    
    {
    
    [b]wrlmode(0x3800,0x11);[/b]
    
    }
    
    typedef void (*fptr)(UINT16, UINT16);
    
    void f(void)
    
    {
      fptr func;
      func = wrlmode_function;
      func (1,2);
    
    		#define WriteParallel(func)
    
    		WriteParallel(func);
    
    		pbtim = ticks(1500000);
    
    		while(pbtim);
    
    		MWA_Block = rdlmode(0x3800);
    
    		putshex(ZS(21,00),MWA_Block,NORML(BLK,WHT));
    
    }
    

    Habe nun folgende Frage an die Cracks:

    Im Moment bin ich abhängig von dem Wert,der in wrlmode_function geschrieben wird.Das wäre in diesem Fall 0x11 in 0x3800.
    Ich hätte es aber gerne,dass die Adresse und der Wert noch später (z.B. in der Hauptfunktion) übergeben werden.
    So etwa:

    #define WriteParallel(func,adr,val)
    
    WriteParallel(func,adr,val);
    

    --> So soll func den Kontakt herstellen und adr und val kann man beliebig anpassen.

    Kann auch über meine Email mal meine C-File Vorlage des Herstellers zukommen lassen,damit man sieht, was ich versuche umzusetzen...Danke... 👍



  • Guiekalle schrieb:

    #define wrlmode(adr,val) (outword (MOD1ADR+0x10,(adr)),outword (MOD1ADR+0x008,(val)))
    #define rdlmode(adr)     (outword (MOD1ADR+0x10,(adr)),inword  (MOD1ADR+0x108))
    
    void wrlmode_function (UINT16 adr, UINT16 val)
    
    {
    
    [b]wrlmode(0x3800,0x11);[/b]  //<-- dann trag hier: [b]wrlmode(adr, val);[/b] ein!
    
    }
    
    }
    

    Habe nun folgende Frage an die Cracks:

    Im Moment bin ich abhängig von dem Wert,der in wrlmode_function geschrieben wird.Das wäre in diesem Fall 0x11 in 0x3800.

    siehe im Code.

    Gruß mcr


Anmelden zum Antworten