logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega32][C++] Przeciążanie operatorów

damiano713 15 Cze 2008 22:11 3254 11
  • #1 5250163
    damiano713
    Poziom 15  
    Witam!

    Problem jest natury programistycznej.
    Zacznę może od kodu:

    
    //LCD class
    class LCD {
    	public:
    		LCD();							//INIT
    		void put(char *text);					//PUT TEXT ON LCD
    		#ifdef BACKLIGHT
    		void backlight(bool status);				//TURN OFF/ON BACKLIGHT
    		#endif
    		void put_p(const char *text);				//PUT TEXT FROM PGM SPACE
    		void put(int16_t number, uint8_t base);			//PUT NUMBER ON LCD
    		void gotoxy(uint8_t x, uint8_t y);			//Set cursor position
    		void cls(void);						//CLEAR LCD
    		void define_char(uint8_t number, uint8_t p1, uint8_t p2, uint8_t p3, uint8_t p4, uint8_t p5, uint8_t p6, uint8_t p7, uint8_t p8);	//Define user-defined chars
    	private:
    		void send(uint8_t data, bool mode);			//SEND DATA OR COMMAND
    };
    //
    LCD &operator<<(LCD &lcd, uint16_t val);
    LCD &operator<<(LCD &lcd, char *val);
    LCD &operator<(LCD &lcd, const char *val);
    
    


    Mam problem z odróżnieniem przez kompilator typu zapisanego w pamięci programu a typu w pamięci RAM czyli typu char* od const char*. Chodzi mi dokładnie o trzy ostatnie linijki; przeciążony jest operator << na typach char* i int*. Próbowałem zrobić to na różne sposoby i nic. W końcu utworzyłem to na osobnych operatorach, nie jest to wygodne gdyż nie można ich łączyć.
    Jeśli ktoś posiada jakąś koncepcje jak sobie z tym poradzić i podciągnąc to wszystko pod jeden operator, to proszę o pomoc.
  • #2 5253440
    KowalD
    Poziom 17  
    int& operator[](int index);
    int operator[](int index) const;


    c++ traktuje to jako dwa rozne operatory... wiec moze i z operatorem << zadziala "ustalowienie" go ;)... tylko nie mam pomyslu skad kompilator bedzie wiedzial ktorego uzyc w Twoim przypadku... ale moze sie uda :)... musisz pokombinowac :)...
  • #3 5254207
    damiano713
    Poziom 15  
    Podsunąłeś mi pewien pomysł...

    zrzutowałem sobie wskaźnik na tekst w pamięci programu na typ void*
    Kompilator rozpoznaje typ void* i odróźnia go. Później znowu sobie go rzutuje na const char*.
  • Pomocny post
    #4 5254393
    KowalD
    Poziom 17  
    damiano713 napisał:
    Podsunąłeś mi pewien pomysł...

    zrzutowałem sobie wskaźnik na tekst w pamięci programu na typ void*
    Kompilator rozpoznaje typ void* i odróźnia go. Później znowu sobie go rzutuje na const char*.
    o t6akiej opcji tez myslalem :)... ale stwierdzilem, ze przesada... i, ze w razie innych funkcji podobnych, trzebaby ciagle o tym pamietac :)... ale skoro dziala to dziala :)...
  • #5 5254700
    damiano713
    Poziom 15  
    KowalD: utworzyłem typedefem typ prog, wystarczy przed makrem PSTR dać (prog) i gotowe. Nie jest tak źle... :D

    Problem rozwiązany. Nie w 100% ale zawsze to coś.

    Jeśli ktoś kiedyś wpadnie na inny pomysł to proszę o info.

    Jeśli ktoś chce skorzystać z mojej biblioteki do obsługi HD44780 to proszę o kontakt.
    Biblioteka zawiera bardzo przejrzysty interfejs. Ma możliwość definiowania znaków użytkownika jedną funkcją. Obsługuje wszystkie wyświetlacze HD44780 (również wyjątki) po 4 bitowym interfejsie na delayach (bez szyny R/W).
    Choć jest to pisane w C++ zajmuje "tylko" ok 1300B w pamięci i 39B w RAM (chodziło mi głównie o przenośność kodu i prostotę użytkowania).
    Licencja GNU - jak przystało na linuksowicza...

    Pozdrawiam!
  • #6 5254748
    Krotki
    Poziom 14  
    Hmmm a nie jest to tak ze kompilator w deklaracji funkcji jak widzi ze coś jest "const" to tylko informuje go ze ma być nie modyfikowane w danym zakresie ... wiec nie widzę potrzeby użycia 2 przeładowań ... wg mnie to z const powinno wystarczyć :)
  • #7 5255783
    damiano713
    Poziom 15  
    Jednak nie. Kompilator traktuje typ const char i char jak ten sam. Przy kompilacji miałem błąd o tym że są dwa przeładowania na jeden typ danych.

    Rozwiązałem ten problem inaczej.

    
    typedef void* prog 
    // 
    LCD &operator<<(LCD &lcd, char *val) { 
            lcd.put(val); 
            return lcd; 
    } 
    // 
    LCD &operator<<(LCD &lcd, prog val) { 
            lcd.put_p((const char*)val); 
            return lcd; 
    } 
    



    teraz przy wysyłaniu danych na strumień robię tak:

    
    lcd << "/1To jest tekst w pamięci RAM" << (prog)PSTR("/2A TEN JUŻ W PAMIĘCI FLASH MIKROKONTROLERA"); 
    




    kompilator dobrze rozpoznaje typ void* i char*. Przy wywoływaniu funkcji wyświetlającej tekst z pamięci programu, rzutuję typ void* na typ const char*.
  • #8 5256246
    KowalD
    Poziom 17  
    damiano713 napisał:
    Jednak nie. Kompilator traktuje typ const char i char jak ten sam. Przy kompilacji miałem błąd o tym że są dwa przeładowania na jeden typ danych.
    no bo pewnie dlatego, ze funkcja, ktora jako parametr ma zadeklarowane char* to rownie dobrze moze przyjac const char*, wiec kompilator nie wiedzial, ktora funkcje ma wykorzystac do const char*... taka jest moja koncepcja ;)...
  • #10 5256796
    Krotki
    Poziom 14  
    Hmmm a nie możesz sprawdzić tego co pisałem ? Zrób tylko jedno przeładowanie

    LCD &operator<<(LCD &lcd, const char *val);


    i wykorzystuj do wszystkiego (tzn char* i const char*). Z tego co ja rozumiem słowo const w deklaracji tylko informuje kompilator ze nie ma być zmieniany pointer w tej funkcji. A czy ty mu tam podasz zmienna jako const char* czy jako char* to kompilatorowi nie robi to różnicy przecież - on wie ze twoja funkcja nie będzie modyfikowała i tyle :) Oczywiście nie jestem tego pewien ... ale sam jestem ciekaw czy zadziała :)
  • #11 5256878
    damiano713
    Poziom 15  
    No chyba wiem o co ci chodzi. W procesorach AVR inaczej odczytuje się z pamięci RAM a inaczej z pamięci programu. Nie mogę dać tego pod jedno przeładowanie gdyż nie będę wiedział czy w char* znajduje się wskaźnik na pamięć programu czy pamięć RAM.
  • #12 5257210
    Krotki
    Poziom 14  
    A taki mi się jeszcze pomysł pogłowie kręci ... teraz masz const char* co oznacza stały pointer do ... A gdyby zrobic pointer do stałego elementu ? char * const ?
REKLAMA