Saper/nolin11
Guest
Tue Jul 17, 2007 5:50 pm
Witam,
Mam taki dylemat otóż jest sobie funkcja odczytująca z pamięci eeprom up
5bajtów i jeśli używam wskaźnika na tablicę do przenoszenia to qupa ,a jak
przenosze dane przez 5 wskaźników to jest ok..
Zeby było jaśniej co i jak kawałek kodu z funkcją wykożystującą wskaźniki:
void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
}
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}
i wywołanie:
uint8_t _pwm[4], _outs;
[..]
LoadDataProfile(&_pwm,&_outs,2);
I w tablicy potem mam tylko wartość dla _pwm[0] i _pwm[3] ,a pozostałe [1]
i [2] ,mają = 0x00. Nie wiem czemu.
A ten kod działa (nawet za dobrze

) ):
void LoadDataProfile(uint8_t *_pwm1, uint8_t *_pwm2, uint8_t *_pwm3,
uint8_t *_pwm4, uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
tmp2 = prof_id+0;
*_pwm1 = eeprom_read_byte(tmp2);
tmp2 = prof_id+1;
*_pwm2 = eeprom_read_byte(tmp2);
tmp2 = prof_id+2;
*_pwm3 = eeprom_read_byte(tmp2);
tmp2 = prof_id+3;
*_pwm4 = eeprom_read_byte(tmp2);
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}
i wywołanie:
LoadDataProfile(&_pwm[0],&_pwm[1],&_pwm[2],&_pwm[3],&_outs,1);
Może mi wskazać ktoś gdzie robie błąd w tym pierwszym kodzie czy to jest
jak czarna dziura :/
Ps. Wskaźników staram się omijać jak ognia :/ - nie jestem z nimi za pan
brat ale praktyka czyni mistrza

)
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Artur Lipowski
Guest
Tue Jul 17, 2007 7:53 pm
Saper/nolin11 wrote:
.....
Quote:
void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id) {
Według tej deklaracji/definicji _pwm jest tablicą wskaźników do uint8_t.
Czy aby na pewno Ci o to chodziło?
....
Quote:
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
....
Tutaj się odwołujesz do kolejnego elementu _pwm czyli do kolejnego wskaźnika, a
nie do uint8_t. Wskaźnik zajmuje (zwykle) 16 bitów. Chyba reszta już jest jasna?
Trochę to chyba przekombinowałeś chyba chodziło Ci o:
void LoadDataProfile(uint8_t _pwm[], uint8_t *_outs, uint8_t prof_id)
a odwoływać do _tmp można się przez proste:
_pwm1[tmp] = .....
a wywołanie funkcji:
LoadDataProfile(_pwm,&_outs,2);
A tak wogóle to zainteresuj się funkcją eeprom_read_block.
BTW> Używane przedrostka w postaci podkreślenia jest wysoce "niestandardowe" ;-)
Pozdrawiam,
--
Artur Lipowski
Saper/nolin11
Guest
Tue Jul 17, 2007 10:58 pm
Artur Lipowski wrote:
Quote:
Saper/nolin11 wrote:
....
void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id)
{
Według tej deklaracji/definicji _pwm jest tablicą wskaźników do uint8_t.
Czy aby na pewno Ci o to chodziło?
To jest tak w funkcji głównej (z której jest wywołanie tej) jest
deklaracja:
uint8_t _pwm[4]; // tablica 4 elementowa
Quote:
...
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
...
Tutaj się odwołujesz do kolejnego elementu _pwm czyli do kolejnego
wskaźnika, a nie do uint8_t. Wskaźnik zajmuje (zwykle) 16 bitów. Chyba
reszta już jest jasna?
Czyli wystaczyło by przekazać wskaźnik na pierwszy element i przesuwać go o
jeden na następny elelment, jeśli dobrze rozumiem.
Quote:
Trochę to chyba przekombinowałeś chyba chodziło Ci o:
void LoadDataProfile(uint8_t _pwm[], uint8_t *_outs, uint8_t prof_id)
a odwoływać do _tmp można się przez proste:
^^^ _pwm -= mniemam
_pwm1[tmp] = .....
AAAAAA simple...

- I'm stupid....
a wywołanie funkcji:
LoadDataProfile(_pwm,&_outs,2);
A tak wogóle to zainteresuj się funkcją eeprom_read_block.
własnie se przypomniałem o niej

) ale miejsce mam więc moge sobie
pozwolić na lenistwo

i nie zmieniać tego "mojego odczytu"
Quote:
Używane przedrostka w postaci podkreślenia jest wysoce "niestandardowe"
Ja jestem osobą bardzo "niestandardową" :)
[dopisane]
Działa ze wskaźnikami jak chce

oto wynik:
void LoadDataProfile(uint8_t *_pwm, uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
*(_pwm+tmp) = eeprom_read_byte(tmp2); // > *(_pwm+tmp) < <<--
przesunięcie wskaźnika po elementach tablicy
}
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}
i wywołanie:
LoadDataProfile(&_pwm[0],&_outs,1);
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Saper/nolin11
Guest
Wed Jul 18, 2007 9:10 am
Piotr Chmiel wrote:
Quote:
On Tue, 17 Jul 2007, Saper/nolin11 wrote:
Witam,
Mam taki dylemat otóż jest sobie funkcja odczytująca z pamięci eeprom up
5bajtów i jeśli używam wskaźnika na tablicę do przenoszenia to qupa ,a
jak przenosze dane przez 5 wskaźników to jest ok..
Zeby było jaśniej co i jak kawałek kodu z funkcją wykożystującą
wskaźniki:
void LoadDataProfile(uint8_t *_pwm[4], uint8_t *_outs, uint8_t prof_id)
{ uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
*(_pwm1+tmp) = eeprom_read_byte(tmp2);
}
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}
i wywołanie:
uint8_t _pwm[4], _outs;
[..]
LoadDataProfile(&_pwm,&_outs,2);
I w tablicy potem mam tylko wartość dla _pwm[0] i _pwm[3] ,a pozostałe
[1] i [2] ,mają = 0x00. Nie wiem czemu.
A ten kod działa (nawet za dobrze

) ):
void LoadDataProfile(uint8_t *_pwm1, uint8_t *_pwm2, uint8_t *_pwm3,
uint8_t *_pwm4, uint8_t *_outs, uint8_t prof_id) {
uint8_t tmp, tmp2;
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
0x05[05]-0x14[20])
tmp2 = prof_id+0;
*_pwm1 = eeprom_read_byte(tmp2);
tmp2 = prof_id+1;
*_pwm2 = eeprom_read_byte(tmp2);
tmp2 = prof_id+2;
*_pwm3 = eeprom_read_byte(tmp2);
tmp2 = prof_id+3;
*_pwm4 = eeprom_read_byte(tmp2);
tmp2 = prof_id+4;
*_outs = eeprom_read_byte(tmp2);
}
i wywołanie:
LoadDataProfile(&_pwm[0],&_pwm[1],&_pwm[2],&_pwm[3],&_outs,1);
Może mi wskazać ktoś gdzie robie błąd w tym pierwszym kodzie czy to jest
jak czarna dziura :/
A od czego jest kompilator ?
Problem w tym że kompilator nie narzeka na na sposób przekazywania
zmiennych tylko troche na przypisanie z eeprom_read_byte ale to wiem i to
jednak działa. No nic

już sobie poradziłęm

) z pomocą pana Artura.
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Paweł Więcek
Guest
Wed Jul 18, 2007 9:49 pm
Thus wrote Saper/nolin11 <nolin11_USUNT_TO@interia.pl>:
Quote:
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
Zasadniczo istneije coś takiego jak *=...
Quote:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
Po co ta zmienna?
Quote:
*(_pwm+tmp) = eeprom_read_byte(tmp2); // > *(_pwm+tmp) < <<--
Z definicji *(x+y) jest równoważne x[y] (jak i y[x] oczywiście), więc po co
komplikować?
Quote:
LoadDataProfile(&_pwm[0],&_outs,1);
&_pwm[0]? _pwm jest jakby "trochę" prostsze.
Tak wiem, czepiam się.
Paweł
--
(___) | Pawel Wiecek ----------------- Coven / Svart --------------------- |
< o o > |
http://www.coven.vmh.net/ <coven@vmh.net> GSM: +48603240006 |
\ ^ / | GPG/PGP info in message headers * [ Debian GNU/Linux developer ] |
(") | I don't want people to love me. It makes for obligations. -- JA |
Saper/nolin11
Guest
Thu Jul 19, 2007 8:13 pm
Paweł Więcek wrote:
Quote:
Thus wrote Saper/nolin11 <nolin11_USUNT_TO@interia.pl>:
prof_id = prof_id*5; // 5bajtów konfiguracyjnych (zakres konfiguracji:
Zasadniczo istneije coś takiego jak *=...
hmmm, fakt

(ps. czepiasz sie

)
Quote:
0x05[05]-0x14[20])
for (tmp=0;tmp<4;tmp++) {
tmp2 = prof_id+tmp;
Po co ta zmienna?
Aby mi sie lepiej pisalo :)
Quote:
*(_pwm+tmp) = eeprom_read_byte(tmp2); // > *(_pwm+tmp) < <<--
Z definicji *(x+y) jest równoważne x[y] (jak i y[x] oczywiście), więc po
co komplikować?
A czy życie jest takie proste

- lubie tak mieszać

)
Quote:
LoadDataProfile(&_pwm[0],&_outs,1);
&_pwm[0]? _pwm jest jakby "trochę" prostsze.
Ja tam wole zozole

....
....wolę wiedzieć dokładniej co mu każe zrobić ,a zresztą "bo mi tak
wygodniej"

)
Quote:
Tak wiem, czepiam się.
Ja też wiem, troche....

) ale projekt juz zamkniety

(napisane, działa
jak chce i nic więcej nie chce mi sie już dodawać i zmieniać

) ) tak wiec
dziękuje głównie za przypomnienie o tym operatorze.
[!close_thread!]
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700
Artur M. Piwko
Guest
Fri Jul 20, 2007 11:41 am
In the darkest hour on Thu, 19 Jul 2007 21:13:27 +0200,
Saper/nolin11 <nolin11_USUNT_TO@interia.pl> screamed:
Quote:
LoadDataProfile(&_pwm[0],&_outs,1);
&_pwm[0]? _pwm jest jakby "trochę" prostsze.
Ja tam wole zozole

....
...wolę wiedzieć dokładniej co mu każe zrobić ,a zresztą "bo mi tak
wygodniej"

)
To zamiast: int i = 0;
pisz: int i; memset( &i, 0, sizeof(i) );
będziesz wiedział dokładniej co mu każesz robić... ;)
--
[ Artur M. Piwko : Pipen : AMP29-RIPE : RLU:100918 : From == Trap! : SIG:232B ]
[ 12:24:20 user up 11408 days, 0:19, 1 user, load average: 0.50, 0.71, 0.02 ]
Compatible: Gracefully accepts erroneous data from any source.
Saper/nolin11
Guest
Fri Jul 20, 2007 9:06 pm
Artur M. Piwko wrote:
Quote:
In the darkest hour on Thu, 19 Jul 2007 21:13:27 +0200,
Saper/nolin11 <nolin11_USUNT_TO@interia.pl> screamed:
LoadDataProfile(&_pwm[0],&_outs,1);
&_pwm[0]? _pwm jest jakby "trochę" prostsze.
Ja tam wole zozole

....
...wolę wiedzieć dokładniej co mu każe zrobić ,a zresztą "bo mi tak
wygodniej"

)
To zamiast: int i = 0;
pisz: int i; memset( &i, 0, sizeof(i) );
będziesz wiedział dokładniej co mu każesz robić...
o_O
dobra, zamykać temat

)
--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700