Mala pomoc u c

3

Mala pomoc u c

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Ne valja! Sastavicu ti ja kod za ovo da ne gubim vreme pisajuci sta ti valja a sta ne.



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Ok, hvala tebi u svakom slucaju! Verovatno, prva greska u zadnjem mom primeru je sto sam stavio:
char rgb_boja[0][3];
char rgb_boja[1][3];
char rgb_boja[2][3];
mada sam editovao post i stavio ovako:
char rgb_boja[3][4];

e sad ono ostalo mozda i gresim na vise mesta, ali bih voleo da znam gde, samim tim bi naucio na svojim greskama. Koristim nizove jer sam naucio da radim u php u nizovima i nekako mi je najlakse kad koristim niz Smile I prilikom kompilacije takodje ucim, cim pokaze upozorenje, trudim se da vidim u kojoj liniji je upozorenje, pa tako i naucim uvek novo nesto, ovo sa tutorijalima je super, mada dok sam ne probas nesto da kompilujes nema sanse da naucis nesto. Al da je komplikovan c jezik, komplikovan do...



offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Ne stigoh ranije da uradim ovo, sad sam se tek vratio iz grada. Razz

Evo ti sad mozes da ubacis bilo koji delimiter izmedju brojeva, sve ce da se parsuje kako treba. Bitno je da postoje 3 broja u drugom slucaju ostaje default vrednost.

Znaci ovo stavis negde pri vrhu koda:
typedef struct {    unsigned char r;    unsigned char g;    unsigned char b; }RGB_COLOR; RGB_COLOR menu_text_color = { 0, 191, 255 }; // default boja texta // pomocna funkcija char* str_find_digit(char* beg, char* end) {    if(beg < end)    {       for( ;beg != end; ++beg)       {          if((*beg >= '0') && (*beg <= '9'))             return beg;       }    }    return end; }

i onda:
// ucitava boju za text iz fajla, ako nesto // ne ispadne kako treba ostaje default boja void set_menu_text_color_from_file( void ) {    unsigned long tmp_color[3];    // maximalni broj karaktera u liniji texta    // postavljeno na 30         // povecaj ako mislis da nije dovoljno    const size_t buffer_sz = 30;    char buffer[buffer_sz];    int fd = open("/res/images/menu.txt", O_RDONLY);    // ovde u zavisnosti koje vrednosti vraca open funkcija    // predpostavjam da je sve iznad 0 proslo dobro    if(fd > 0)    {       size_t bytes_read = 0;       bytes_read = read(fd, buffer, buffer_sz);       close(fd);                 // mora biti 3 broja minimum + 2 delimitera                 // znaci 5 minimum       if(bytes_read >= 5)       {          char* begin = &buffer[0];          char* end = &buffer[bytes_read];          begin = str_find_digit(begin, end);          if(begin == end)          {             // error, no digit found             return;          }          tmp_color[0] = strtoul(begin, &begin, 10);          if(tmp_color[0] > 255)          {             // error, broj je veci od 255             return;          }          begin = str_find_digit(begin, end);          if(begin == end)          {             // error, no digit found             return;          }          tmp_color[1] = strtoul(begin, &begin, 10);          if(tmp_color[1] > 255)          {             // error, broj je veci od 255             return;          }          begin = str_find_digit(begin, end);          if(begin == end)          {             // error, no digit found             return;          }          tmp_color[2] = strtoul(begin, 0, 10);          if(tmp_color[2] > 255)          {             // error, broj je veci od 255             return;          }          // sve je proslo dobro, dodeli boju za menu          menu_text_color.r = tmp_color[0];          menu_text_color.g = tmp_color[1];          menu_text_color.b = tmp_color[2];       }    } }

i posle u zamenis u onoj funkciji gde god da se koristi stari makro:
//gr_color(MENU_TEXT_COLOR); gr_color(menu_text_color.r, menu_text_color.g, menu_text_color.b);

i pozoves tvoju funkciju koja ucitava vrednosti boje iz fajla u recimo onoj funkciji:
... // Redraw everything on the screen. Does not flip pages. // Should only be called with gUpdateMutex locked. static void draw_screen_locked(void) {     set_menu_text_color_from_file();     if (!ui_has_initialized) return;     draw_background_locked(gCurrentIcon);     draw_progress_locked(); ... }

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Pozvacu je iz ui_init... Ok, hvala ti puno, ako imas vremena jednom da prokomentarises code koji sam napisao u predhodnom postu, bas me zanima gde gresim i zbog cega je bolje ovako a ne onako, bilo bi mi od velike pomoci

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

1. Tvoj kod nece raditi ako postoji pogresan input u text fajlu.

2. Nepravilno:
char keys[] = "\2c"; //zarez u hex formatu
Pravilno:
// primenovao sam u zarez jer // ima vise smisla nego "keys" // ovde ti ne treba niz jer je // u pitanju jedan karakter char zarez = 0x2c; // hex // ili char zarez = 44; // dec // ili najbolje char zarez = ',';

3.Ovaj deo ti je nepotreban:
char *r = (char *)malloc(3); char *g = (char *)malloc(3); char *b = (char *)malloc(3);
zasto alociras memoriju?
Pravilno:
char *r; char *g; char *b;
Kasnije ce im biti dodeljena adresa od substr.
I posle na kraju samo:
free(r); free(g); free(b); // a ne ovo free(rgb_boja)

4. Ovde imas gresku:
// pre ove petlje "two" ima vrednost 0 // po svakoj iteraciji dodajes i na nju i // izlazis preko granica niza "rgb_boja" sa njom // odnosno pises po delu memorije koje ne bi trebalo! for (i=0; i<len; i++) {    if (str[i] == zarez)       one += 1;    two += i;    rgb_boja[one][two] = str[i]; }

Citat:
Pozvacu je iz ui_init...

u pravu si, najboje bi je bilo pozvati u nekoj funkciji koja ce biti pozvana samo jedanput a na kako sam ja predlozio u "draw_screen_locked" jer ime sugerise da se poziva svaki put kad treba da se iscrta ekran (sto moze da bude cesto) a otvaranje i manipulacija fajla moze da bude skupa operacija.

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Napisano: 24 Jan 2012 19:39

Da, ovo two ne treba uopste vec sam trebao samo staviti u petlji ovako?
rgb_boja[one][] = str[i];

Ali opet mi nije jasno, kako mislis da ako input fajl nije dobar nece valjati, zar nisam stavio u petlji default vrednosti ako nesto nije u redu sa fajlom, plus da pretvori bilo koji char, koji user napise, u broj i ako je jedan od njih veci od 255 opet uzima default vrednosti za rgb, tako da user moze da upise bilo koji karakter a da ne zakuca program na nekoj gluposti, a moze i pomocu karaktera da napravi boju? Smile U svakom slucaju hvala ti puno na trudu, dosta si mi pomogao, uzecu ipak tvoj kod jer ipak imas vise iskustva u c nego ja, i pokusacu po mome kompletan kod da napisem i postavim ovde da cujem misljenje Smile

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Citat:
Da, ovo two ne treba uopste vec sam trebao samo staviti u petlji ovako?
rgb_boja[one][] = str[i];

Ne mozes da koristis prazan [] operator kad pristupas elementima vec samo pri definiciji gde kompajler dodeljuje duzinu niza u toku kompajliranja:
char niz[] = "abc"; // duzina 4
Nisam siguran ali mislim da ovo ne moze kod "vise-dimenzionih" nizova uopste.

Srecno sa ucenjem.

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Pa definisao sam duzinu ovde?
rgb_boja[3][4];

evo ga i nov cod:
typedef struct {    unsigned char r;    unsigned char g;    unsigned char b; }RGB_COLOR; RGB_COLOR menu_text_color = { 0, 191, 255 }; char *substr(const char *str, size_t begin, size_t len) {     if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))         return 0;         return strndup(str + begin, len); } void set_menu_text_color_from_file(void) {     char zarez = 0x2c;     size_t len;     size_t i;     size_t one = 0;     size_t bytes_read;     size_t buffer_sz = 12; //255,255,255 == 11 karaktera + jedan vise za null termination?     char buffer[buffer_sz];      char rgb_boja[3][4];         int fd = open("/res/images/menu.txt", O_RDONLY);       if(fd >= 0)     {         bytes_read = read(fd, buffer, buffer_sz-1);         close(fd);                 if (bytes_read < 0) //nije ok manje od 0, sve preko ili je 0 je ok             return;         buffer[bytes_read] = '\0'; //null termination             len = strlen(buffer);         if (len)         {             for (i=0; i<len; i++)             {                 if (buffer[i] == zarez)                     one += 1;                 rgb_boja[one][] = buffer[i];             }                         if (rgb_boja[0] != NULL && strtoi(rgb_boja[0]) <= 255)                 menu_text_color.r = substr(rgb_boja[0], 0, strlen(rgb_boja[0]));             if (rgb_boja[1] != NULL && strtoi(rgb_boja[1]) <= 255)                 menu_text_color.g = substr(rgb_boja[1], 0, strlen(rgb_boja[1]));             if (rgb_boja[2] != NULL && strtoi(rgb_boja[2]) <= 255)                 menu_text_color.b = substr(rgb_boja[2], 0, strlen(rgb_boja[2]));         }     } }

offline
  • Pridružio: 19 Maj 2011
  • Poruke: 297

Citat:
Pa definisao sam duzinu ovde?


Ajd' napravi jednu konzolnu aplikaciju i probaj ovaj kod da li ce uspesno kompajlirarti (isecak iz tvog koda):
#include <stdio.h> #include <stdlib.h> #include <cstring> int main() {    char zarez = 0x2c;    char str[] = "10,120,255";    size_t len = strlen(str);    char rgb_boja[3][4];    size_t one = 0;    for(size_t i = 0; i < len; ++i)    {       if (str[i] == zarez)          one += 1;       rgb_boja[one][] = str[i];    }         rgb_boja[0][3] = '\0';         rgb_boja[1][3] = '\0';         rgb_boja[2][3] = '\0';    printf("%s, %s, %s", rgb_boja[0],rgb_boja[1],rgb_boja[2]);         return 0; }

Cak i da ovo prodje, ubacujes i zarez karakter u niz gde trebaju da budu samo cifre brojeva za boje!


Pogledaj pazljivo izraze sto si napisao:
if (rgb_boja[0] != NULL && strtoi(rgb_boja[0]) <= 255)                 menu_text_color.r = substr(rgb_boja[0], 0, strlen(rgb_boja[0]));

1.
rgb_boja[0] != NULL
Zasto proveravas da nije 0? U kom slucaju ce biti 0?

2.
Sta je, kog tipa je:
menu_text_color.r
?
a sta substr vraca?

3.
Zasto ovde radis substr?
substr( rgb_boja[0], // odseci od ovog stringa  0,               // od njegovog pocetka  strlen(rgb_boja[0]) // do njegovog kraja );
delis string ovom funkcijom gde ce rezlutat biti ceo taj string. Koji si ga djavo onda delio?

Nemas potrebe onda za funkcijom substr ako u petlji to sve popunis u niz rgb_boja!

offline
  • Pridružio: 15 Jul 2009
  • Poruke: 150

Napisano: 24 Jan 2012 21:46

Ajde da napisem nov code, dobio sam kompilaciju sa greskom (tamo gde je boja[0ne][] dok nisam stavio [i]) i mnogo warninga (nisam znao sda postoji razlika izmedju ssize_t i size_t) , umesto strtoi sam stavio atoi, sada sam napisao ovako bez ijedne greske i warninga:
typedef struct {    unsigned char r;    unsigned char g;    unsigned char b; }RGB_COLOR; RGB_COLOR menu_text_color = { 0, 191, 255 }; char *substr(const char *str, size_t begin, size_t len) {     if (str == 0 || strlen(str) == 0 || strlen(str) < begin || strlen(str) < (begin+len))         return 0;         return strndup(str + begin, len); } void set_menu_text_color_from_file(void) {     char zarez = 0x2c;     size_t len;     size_t i;     size_t one = 0;     ssize_t bytes_read;     ssize_t buffer_sz = 12; //255,255,255 == 11 karaktera + jedan vise za null termination?     char buffer[buffer_sz];      char rgb_boja[3][4];         int fd = open("/res/images/menu.txt", O_RDONLY);       if(fd >= 0)     {         bytes_read = read(fd, buffer, buffer_sz-1);         close(fd);                 if (bytes_read < 0) //nije ok manje od 0, sve preko ili je 0 je ok             return;         buffer[bytes_read] = '\0'; //null termination             len = strlen(buffer);         if (len)         {             for (i=0; i<len; i++)             {                 if (buffer[i] == zarez)                     one += 1;                 rgb_boja[one][i] = buffer[i];             }                         if (rgb_boja[0] != NULL && atoi(rgb_boja[0]) <= 255)                 menu_text_color.r = *substr(rgb_boja[0], 0, strlen(rgb_boja[0]));             if (rgb_boja[1] != NULL && atoi(rgb_boja[1]) <= 255)                 menu_text_color.g = *substr(rgb_boja[1], 0, strlen(rgb_boja[1]));             if (rgb_boja[2] != NULL && atoi(rgb_boja[2]) <= 255)                 menu_text_color.b = *substr(rgb_boja[2], 0, strlen(rgb_boja[2]));         }     } }
gr_color(menu_text_color.r, menu_text_color.g, menu_text_color.b, 255);
i funkciju sam pozvao u ui_init. E sad dali valja nisam probao na telefonu Smile

Dopuna: 24 Jan 2012 22:29

Ne vredi, dmesg nema nista u vezi bilo kakve greske, log iz programa isto tako, ali nema nista na ekranu mada mogu da udjem preko shell. Hehe, nista, ipak cu morati jos da ucim Smile

Ko je trenutno na forumu
 

Ukupno su 901 korisnika na forumu :: 11 registrovanih, 2 sakrivenih i 888 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Areal84, Bubimir, Dimitrije Paunovic, Istman, maCvele, Mendonca, ruso, SlaKoj, Stanlio, strelac07, vukovi