Vypis retezce znaku z prava do leva

Zdravim, postavil sem si takovy maly " Propeller clock " , je to jen se 7 ledkama ,16F628A a splacany na rychlo ale funguje, problem je ze to mam na vetraku kterej se toci po smeru hodinovych rucicek tudis vypisovani znaku je z prava do leva, mam funkci “printf_char(“A”);“ktera my spravne vypise 1 znak , pokud chci vypsat vyce znaku zapis je “printf(printf_char"ABCD”);” to uz je ale horsi protoze se zobrazi “DCBA” , u textu to zapisu obracene “printf(printf_char"DCBA”);” a je to, ALE problem je u promenych “printf(printf_char “%2u”,a);” s tim uz si jaksi nevim rady , hodnota se zobrazuje obracene jednotky/desitky/stovky, jakym zpusobem je mozne to vypsat spravne ? pokud to jde nejak neslozite ,
otocenim smeru rotace vetraku bych zatim vynechal, Diky

No mozes to urobit tak, ze to polu, v ktorom mas retazec “ABCD”, najdes dlzku pomocou strlen a potom vo for cykle urobis preklopenie do noveho pola

len = strlen(source);
for (i=0;i<len;i++) destination* = source[len-1-i];
destination[len] = 0;

Ak je na zaciatku vo poli source “abcdef” tak na konci je v poli destination “fedcba”.
Funkciou strlen najdes v kniznici string.h*

Jaromire … Dekuju, takle nak sem si to predstavoval , jenom sem nevedel jak to pojmenovat natoz zapsat , vysledek vypada takle [code]char source [10],destination[10] ,len;

strcpy(source,“ABCD”);
len = strlen(source);
for (i=0;i<len;i++)destination * = source[len-1-i];
destination[len] = 0;
for (i=0;i<len;i++)printf_char(destination*);[/code]
jeste par veci co dela tohle ? destination[len] = 0; , v disassembleru tam nevidim vyznam, a kdyz to vypustim tak to taky funguje,
tenhle zapis strcpy(source,“ABCD”); je dobre ?
da se to zapsat i neprimo ? jako ze by se s toho celyho udelala funkce “void printf_str (char source [10] ) {}” a volalo by se to printf_str(“ABCD”);**

To priradenie nuly na koniec retazca je preto, ze v C-cku sa standardne ASCII retazce ukoncuju nulou. Napriklad printf alebo strlen robia iba to, ze od zaciatku pola jednoducho idu az kym nenajdu nulu (0x00 ale nie 0x30) a to povazuju za koniec retazca.

V tvojom pripade to asi nebude potrebne, ale ak by si dalej pole spracovaval povedzme printf-om, strlen-om alebo tak nejak, tak by ti to bez toho priradenia nuly robilo hluposti (printf, strlen a podobne funkcie by nevedeli kde je koniec retazca v poli).

jo to sem si taky myslel ze to oznaci asi konec retezce , jen pro zajimavost sem kouk co s toho leze v ASM 178: destination[len] = 0; 37D 3031 MOVLW 0x31 37E 073B ADDWF 0x3b, W 37F 0084 MOVWF 0x4 380 1383 BCF 0x3, 0x7 381 0180 CLRF 0 179: jaksi tam nenachazim nic uzitecnyho, nicmene funguje to i bez toho to staci … , Diky

Robi to presne to, co to ma robit:

178: destination[len] = 0; MOVLW 0x31 //adresa kde zacina pole destination, konstanta znama pri preklade ADDWF 0x3b, W //pripocita sa k nej obsah len, aby sa vypocitala efektivna adresa MOVWF 0x4 //a posunie sa to do FSR - nepriame adresovanie BCF 0x3, 0x7 //zvoli sa prva 256-bajtova banka pre nepriame adresovanie CLRF 0 //a zapise sa tam zelana hodnota - nula 179:

Optimalizator to mohol urobit aj lepsie, konkretne na jednu jedinu instrukciu, ale budiz - uz mnohkokrat som spominal ze tieto komilatory pre PIC16 su vo free verziach skor hrackou nez serioznym nastrojom.

jesne, uz sem zapomel ja funguje neprime adresovani :unamused: