• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja wykonywana w preprocesorze / przez preprocesor

0 głosów
492 wizyt
pytanie zadane 31 sierpnia 2016 w C i C++ przez cysiek4 Nowicjusz (120 p.)
edycja 31 sierpnia 2016 przez Arkadiusz Waluk

- Jak w opisie potrzebuje stworzyć funkcję realizowaną przez preprocesor.   //nie znam składni takich funkcji
- Argumentem funkcji ma być łańcuch znaków w UTF-8     np. L"йфяцычкмИ qwerty"
- Funkcja ma zwracać normalny łańcuch char-ów
 

przykładowe wywołanie :    parseRU (L"йфяцычкмИ qwerty")

preprocesor zamiast tego ma wstawić do kodu:   "cos tam qwerty"

i dopiero ma nastąpić kompilacja.

 

//z tym poniżej  raczej sobie poradzę
- Sposób w jaki wszystkie znaki nietypowe (kod znaku powyżej 255) mają zostać przekonwertowane.

kod_nowego_znaku = kod_znaku_nietypowego - 850
if (kod_nowego_znaku > 255) kod_nowego_znaku=63;

 

//informacje nie kluczowe, mniej związane z tematem 

-poniżej wrzucam moją przykładową realizację funkcji w standardowy sposób.
-niestety nie może ona zostać w takiej postaci ponieważ wszystkie takie łańcuchy których będzie wiele w programie ostatecznie zostaną umieszczoną w pamięci RAM  mikrokontrolera i ją w sporej części zapełnią.

Dla zwykłych łańcuchów jest przewidziane makro PSTR("lancuch") zapobiega zapisaniu łańcucha do pamięci RAM i zwraca adres do miejsca w pamięci flash .  Dla łańcuchów ze znakami w Unicode nie znalazłem takiego makra.

- druga sprawa po co mikrokontroler ma przetwarzać te łańcuchy skoro z góry są one znane jeszcze przed kompilacją  , lepiej żeby to zrobił komputer i gotowe  łańcuchy skompilował.

void parseRU(char *dst, wchar_t *src) {
		uint8_t i;
		for(i=0; src[i]!=0; i++){
			if (src[i]>255) dst[i]= (src[i]-850 > 255) ? 63 : src[i]-850; 
			else dst[i]=src[i];
		}
		dst[i]=0;
	}
	
    //przykładowe wywołanie
	char buf[50];
	parseRU(buf, L"йфяцычкмИ qwerty"); 
	lcdTextRot(buf, 70 , 7 , 90);

 

komentarz 1 września 2016 przez draghan VIP (106,230 p.)
Tak sobie myślałem o Twoim problemie i doszedłem do wniosku, że może równie satysfakcjonującym wyjściem byłoby napisanie prostego programu, który by przeparsował Twoje źródła przed ich kompilacją. Co o tym sądzisz?
komentarz 2 września 2016 przez cysiek4 Nowicjusz (120 p.)
jestem praktykantem, mój mentor który to wszystko stworzył  chciał by tak dopieścić kod żeby bardzo łatwo było go modyfikować. Praktykuje w firmie która juz wprowadziła na rynek nowe własne urządzenie. Już poszło na czechy wiele egzmplarzy  i już mają oferty ze wschodu. Mnie by to satysfakcjonowało , prawdziwy napis w komentarzu a do funkcji "hieroglify" ale nie wiem czy jemu sie spodoba ja zrobiłem całą rosyjską czcionkę itd działa ale on by chciał do istniejącego kodu dopisać tylko makro i żeby działało z zapisem do flasch, narazie zrobiłem na funkcji  z jego pomocą  i działa ale  tak jak pisałem  cały tekst zostaje wrzucony do ramu a dwa konwersją zajmuje się sam mikrokontroler.  Była też opcja żeby przerobić biblioteczną funkcję PSTR   ale ja ją otwarłem to sie wystraszyłem
komentarz 3 września 2016 przez draghan VIP (106,230 p.)

mój mentor który to wszystko stworzył  chciał by tak dopieścić kod żeby bardzo łatwo było go modyfikować.

W takim wypadku zostaje tylko funkcja, działająca w czasie uruchomienia aplikacji. Możesz wywoływać ją tylko w trakcie inicjalizacji urządzenia, aby nie obciążać tym zadaniem właściwego wykonania programu.

on by chciał do istniejącego kodu dopisać tylko makro i żeby działało z zapisem do flasch

I tak każdy statyczny napis, z którego korzystasz, wędruje przynajmniej na stos - chyba że używacie sztuczek z wczytywaniem z flasha w trakcie run-time (ale to przecież jedynie obciąża wydajnościowo program, więc nie wiem gdzie byłaby tu potencjalna korzyść).

Pokaż implementację PSTR, może coś poradzimy.

2 odpowiedzi

+1 głos
odpowiedź 31 sierpnia 2016 przez draghan VIP (106,230 p.)
Niech mnie ktoś poprawi, jeśli jest inaczej.

Z tego co wiem, preprocesor jest głupi i jedyne co potrafi w kontekście makrodefinicji, to zamieniać jeden tekst w inny i korzystać z reszty swoich dobroci, jak wstawianie daty i tym podobnych.

Preprocesor nie posiada instrukcji pętli, nie zna pojęcia typu przekazywanych mu parametrów - czyli nie jest w stanie iterować po łańcuchu znaków, który mu przekażesz.
komentarz 2 września 2016 przez cysiek4 Nowicjusz (120 p.)
chyba niestety masz racje,
nie znam sie ale Twój post tkwi juz nie od dziś, nikt nie zaprzeczył i daje Ci za to mój głos.
0 głosów
odpowiedź 31 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)

Możesz użyć tzw. własnych literałów x)
Tu masz przykład użycia: http://cpp.sh/2pru
Ten kod wypisuje tekst, w którym wszystkie znaki
mają zwiększoną wartość o 1.. Używając takiego zapisu:
std::cout<<"ABCDEF"_RUS;
Na wyjściu dostaniesz:
BCDEFG

komentarz 31 sierpnia 2016 przez draghan VIP (106,230 p.)
To chyba wciąż działa w runtime. Poza tym autor (chyba) pisze kod na µC, gdzie kompilatory nie za bardzo trzymają się najnowszych standardów. ;)
komentarz 31 sierpnia 2016 przez MetRiko Nałogowiec (37,110 p.)
W sumie możliwe.. ale mimo wszystko myślę, że byłaby to dobra alternatywa (oczywiście nie w przypadku µC xD).

Podobne pytania

0 głosów
2 odpowiedzi 903 wizyt
pytanie zadane 2 sierpnia 2016 w C i C++ przez SebekMakaron Obywatel (1,290 p.)
+1 głos
1 odpowiedź 697 wizyt
0 głosów
2 odpowiedzi 365 wizyt
pytanie zadane 22 listopada 2018 w C i C++ przez Mitop Użytkownik (700 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,322 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...