sofian Postat Mai 26, 2013 Partajează Postat Mai 26, 2013 Am inceput sa cochetez cu C de la microchip si as avea nevoie de putin ajutor deci vreau sa fac un meniu si nu stiu cum sa pasez un pointer catre un sir text deci cum transfer la functia TextMenu textul din TabTextMenu_1 sau TabTextMenu_2 //-----------------------------------------------------------//const char TabTextMenu_1[]={ "CONFIGURATION " "SET CLOCK " "EXIT "};const char TabTextMenu_2[]={ "ENABLE " "DISABLE"};//-----------------------------------------------------------//void TextMenu(unsigned char NrMenu){ unsigned char Char,idx,Cnt01; idx = (NrMenu * 14); Cnt01 = 14; while (Cnt01) { Char = TabTextMenu_1[idx++];// AfsCharText(Char); Cnt01--; }}//-----------------------------------------------------------//void main (){ TRISC = 0xFFFF; TRISB = 0x0000; PORTC = 0xFFFF; PORTB = 0xFFFF;//-----------------------------------------------------------// TextMenu(0); while(1) { TextMenu(1); }}//-----------------------------------------------------------// Link spre comentariu
Elef Postat Mai 26, 2013 Partajează Postat Mai 26, 2013 rom char TabTextMenu_1[][15]={"CONFIGURATION ","SET CLOCK ","EXIT "};rom char TabTextMenu_1[][15]={"ENABLE ","DISABLE"};void TextMenu(unsigned char NrMenu, unsigned char SelMenu){ if(SelMenu==0){ while(TabTextMenu_1[NrMenu]) AfsCharText(*TabTextMenu_1[NrMenu]++); } else{ while(TabTextMenu_2[NrMenu]) AfsCharText(*TabTextMenu_2[NrMenu]++); }} Sunt 2 array-uri de stringuri, modifcatorul rom spune ca sa fie plasate in flash nu in ram(e mai logic avand in vedere ca nu se modifica). Fiind declarate global pot fi apelate in cadrul functiei TextMenu fara a fi nevoie sa fie pasate ca parametru. Link spre comentariu
Elef Postat Mai 27, 2013 Partajează Postat Mai 27, 2013 void TextMenu(unsigned char NrMenu, rom char **Menu){ while(Menu[NrMenu]) AfsCharText(*Menu[NrMenu]++);} Link spre comentariu
sofian Postat Mai 27, 2013 Autor Partajează Postat Mai 27, 2013 elef mersi mult ptr raspunsdar eu vreau un singur string din care eu sa iau din 14 in 14 caractere si sa il afisez, asa nu ocup mai multa memorie in flashasa pot face mai multe texte si doar pasez pointerul si lungimea la text,eu am facut asa idx = (NrMenu * 14); dar vreau sa inlocuiesc 14 cu lungimea textului care il afisez Link spre comentariu
Elef Postat Mai 27, 2013 Partajează Postat Mai 27, 2013 Atunci sirul trebuie sa arate in felul asta: rom char TabTextMenu_1[42]={"CONFIGURATION SET CLOCK EXIT "}; Functia ar putea sa fie ceva in genul: void TextMenu(unsigned char NrMenu, rom char *Menu){ unsigned char startpos,endpos,count; startpos=NrMenu*14; endpos=NrMenu*15; for(count=startpos;count<endpos;count++) AfsCharText(Menu[count]);} Nu prea inteleg cum vine chestia cu lungimea textului. Ceva de genul? void TextMenu(unsigned char StartPos, unsigned char Lenght, rom char *Menu){ unsigned char count; for(count=StartPos;count<StartPos+Lenght;count++) AfsCharText(Menu[count]);} Cel mai bine ar fi sa faci string-uri individuale pentru fiecare meniu. Link spre comentariu
sofian Postat Mai 28, 2013 Autor Partajează Postat Mai 28, 2013 functia va arata asa //-----------------------------------------------------------//const char TabTextMenu_1[]={ "CONFIGURATION " "SET CLOCK " "EXIT "};const char TabTextMenu_2[]={ "ENABLE " "DISABLE"};void TextMenu(unsigned char NrMenu,unsigned char LnMenu, rom char *Menu){ unsigned char idx; idx = (NrMenu * LnMenu); while (LnMenu) { // Char = TabTextMenu_1[idx++]; AfsCharText(Menu[idx++]); LnMenu--; }}// aici nu stiuTextMenu(1,14,Menu); // 1 este "SET CLOCK", 14 este Lungimea, Menu ar trebui sa fie pointer catre string dar cum apelez functia cu texte diferite ? Link spre comentariu
Liviu M Postat Mai 28, 2013 Partajează Postat Mai 28, 2013 In C constructiile de genul asta n-au cum sa functioneze. //-----------------------------------------------------------//const char TabTextMenu_1[]={ "CONFIGURATION " "SET CLOCK " "EXIT "}; In C nu exista notiunea de "string" sau "sir de caractere" sau... Un string se defineste ca un array de caractere. Adica fiecare intrare in TabTextMenu_1 trebuie definita ca un sir de caractere : char configurare[] = "CONFIGURATION";Cum TabTextMenu_1 e la randul lui un array de 3 elemente, la sfarsit obtii exact ce ti-a scris Elef mai sus:rom char TabTextMenu_1[][15]={"CONFIGURATION ","SET CLOCK ","EXIT "};O matrice dubla cu 3 x lungimea_maxima caractere. // aici nu stiuTextMenu(1,14,Menu); // 1 este "SET CLOCK", 14 este Lungimea, Menu ar trebui sa fie pointer catre stringdar cum apelez functia cu texte diferite ?Cu indecsi. Ceva de genul:TextMenu(TabTextMenu_1[1], 14,Menu)Da' incearca sa intelegi ce face codul pus de Elef, ca mie mi se pare OK.@Elef: cred c-ar fi bine daca ai comenta putin codul. Link spre comentariu
sofian Postat Mai 28, 2013 Autor Partajează Postat Mai 28, 2013 "C" este ptr PIC32 si constructiile de genul functioneaza asa nu cu rom char //-----------------------------------------------------------//const char TabTextMenu_1[]={ "CONFIGURATION " "SET CLOCK " "EXIT "};este bun si asa const char TabTextMenu_1[42]={"CONFIGURATION SET CLOCK EXIT "}; eu vreau sa stiu cum apelez functia ca am citit tot netul si nu stiu cum se face ori "C" asta stie de altceva Link spre comentariu
Liviu M Postat Mai 28, 2013 Partajează Postat Mai 28, 2013 "C" este ptr PIC32 si constructiile de genul functioneaza asa nu cu rom charA sooo, pai e simplu, definesti matricea cum ii place lui:const char TabTextMenu_1[][15]={"CONFIGURATION ","SET CLOCK ","EXIT "}; eu vreau sa stiu cum apelez functia ca am citit tot netul si nu stiu cum se face ori "C" asta stie de altcevaAcum trebuie sa functioneze varianta cu indecsi. Adica daca vrei sa afisezi "CONFIGURATION" apelezi TabTextMenu_1[0], pentru "SET CLOCK " TabTextMenu_1[1] si pentru "EXIT" TabTextMenu_1[2].Fiecare litera in parte se poate accesa folosind ambii indecsi. De exemplu, ca sa afisezi "CONFIGURATION" litera cu litera poti folosi bucla:i=0;while(TabTextMenu_1[0][i]) { AfiseazaCaracter(TabTextMenu_1[0][i]); i++;}Il las pe Elef sa-ti arate varianta eleganta cu pointeri. :jytuiyuPS Sper ca n-am scris prea multe prostii. Link spre comentariu
Elef Postat Mai 28, 2013 Partajează Postat Mai 28, 2013 rom e un specificator care in MCC18 spune ca respectiva variabila nu e salvata in RAM ci in FLASH.Se pare ca la C32 nu mai e valabila. In C exista o legatura foarte stransa intre tablouri si pointeri. Daca avem declaratia char str[]="string" str va pointa catre primul element din stringul respectiv adica s Asa ca in cazul nostru daca avem stringul : const char TabTextMenu_1[42]="CONFIGURATION SET CLOCK EXIT ";si functia delarata in felul urmator: void TextMenu(unsigned char NrMenu, char *Menu){ unsigned char startpos,endpos,count; startpos=NrMenu*14; endpos=NrMenu*15; for(count=startpos;count<endpos;count++) AfsCharText(Menu[count]);}Daca in program am nevoie de SET CLOCK atunci functia o voi apela in felul urmator: void TextMenu(1,TabTextMenu_1) Link spre comentariu
sofian Postat Mai 28, 2013 Autor Partajează Postat Mai 28, 2013 Multumesc elef asa este cum ai scris ultima datarom in C ptr PIC32 nu mai merge Link spre comentariu
Vizitator stack Postat Mai 29, 2013 Partajează Postat Mai 29, 2013 Sofian, din ce am vazut ca ai postat pana acum , am inteles ca te descuri in assembler. Incearca sa faci legatura intre intre INDF/FSR folositi in asm si pointer utilizat in C.Dupa ce pricepi asta, poti sa te apuci sa citesti despre programarea in C. fie el si C32. Fara sa se simta cineva jignit, sfaturile de mai sus au legatura mai mult cu limbajul basic decat cu C.Parerea mea. Stima,stack (overflow) Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum