• 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

Object Storage Arubacloud
0 głosów
222 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 473 wizyt
pytanie zadane 2 sierpnia 2016 w C i C++ przez SebekMakaron Obywatel (1,290 p.)
+1 głos
1 odpowiedź 433 wizyt
pytanie zadane 5 lipca 2021 w Python przez KumberTwo Dyskutant (8,270 p.)
0 głosów
2 odpowiedzi 163 wizyt
pytanie zadane 22 listopada 2018 w C i C++ przez Mitop Użytkownik (700 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...