Poslao: 23 Jan 2012 16:33
|
offline
- morando
- Građanin
- 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.
|
|
Poslao: 23 Jan 2012 16:44
|
offline
- savan2
- Građanin
- 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 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...
|
|
|
|
Poslao: 23 Jan 2012 20:56
|
offline
- morando
- Građanin
- Pridružio: 19 Maj 2011
- Poruke: 297
|
Ne stigoh ranije da uradim ovo, sad sam se tek vratio iz grada.
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();
...
}
|
|
|
|
Poslao: 24 Jan 2012 13:20
|
offline
- savan2
- Građanin
- 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
|
|
|
|
Poslao: 24 Jan 2012 14:17
|
offline
- morando
- Građanin
- 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.
|
|
|
|
Poslao: 24 Jan 2012 20:11
|
offline
- savan2
- Građanin
- 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? 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
|
|
|
|
Poslao: 24 Jan 2012 20:18
|
offline
- morando
- Građanin
- 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.
|
|
|
|
Poslao: 24 Jan 2012 20:42
|
offline
- savan2
- Građanin
- 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]));
}
}
}
|
|
|
|
Poslao: 24 Jan 2012 20:59
|
offline
- morando
- Građanin
- 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!
|
|
|
|
Poslao: 24 Jan 2012 22:29
|
offline
- savan2
- Građanin
- 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
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
|
|
|
|