Forum » Programiranje » tabele in kazalci v Cju
tabele in kazalci v Cju
Ezekiel ::
Zdravo!
Stvar je taka:
imam 3 datoteke:
main.c, tabele.h, tabele.c
bistveno je, da v main.c delam s tabelami integerjev. Le te najprej inicializiram takole:
unsigned short int *reverse_byte;
unsigned short int tabela[256];
//in potem
reverse_byte = &tabela[256];
vsebino tabele preberem iz tabele.c s funkcijo
void reverse_byte_table(unsigned short int *obrni_byte){
unsigned short int table[256];
*obrni_byte = &table[256];
obrni_byte[0]=0;
...
}
pač vsakemu elementu tabele določim njegovo vrednost na sledeči način:
reverse_byte_table(reverse_byte);
Nato sledi lepši del, torej manipulacija s števili na željeni način:
reverse_byte[3] = nova vrednost
itd...
Stvar deluje, vendar najprej javi napako
tabele.c:10: warning: assignment makes integer from pointer without a cast
to se nanaša na tole vrstico funkcije reverse_byte_table:
*obrni_byte = &table[256];
Najhuje pa je, da se (verjetno zaradi slabe inicializacije) nekontrolirano pojavljajo biti na nekaterih mestih.
Kaj menite o tem, kakšna ideja?
Stvar je taka:
imam 3 datoteke:
main.c, tabele.h, tabele.c
bistveno je, da v main.c delam s tabelami integerjev. Le te najprej inicializiram takole:
unsigned short int *reverse_byte;
unsigned short int tabela[256];
//in potem
reverse_byte = &tabela[256];
vsebino tabele preberem iz tabele.c s funkcijo
void reverse_byte_table(unsigned short int *obrni_byte){
unsigned short int table[256];
*obrni_byte = &table[256];
obrni_byte[0]=0;
...
}
pač vsakemu elementu tabele določim njegovo vrednost na sledeči način:
reverse_byte_table(reverse_byte);
Nato sledi lepši del, torej manipulacija s števili na željeni način:
reverse_byte[3] = nova vrednost
itd...
Stvar deluje, vendar najprej javi napako
tabele.c:10: warning: assignment makes integer from pointer without a cast
to se nanaša na tole vrstico funkcije reverse_byte_table:
*obrni_byte = &table[256];
Najhuje pa je, da se (verjetno zaradi slabe inicializacije) nekontrolirano pojavljajo biti na nekaterih mestih.
Kaj menite o tem, kakšna ideja?
BigWhale ::
A wild guess...
obrni_byte je ze deklariran kot pointer na int v deklaraciji funkcije.
obrni_byte = &table[256];
Takole mogoce?
obrni_byte je ze deklariran kot pointer na int v deklaraciji funkcije.
obrni_byte = &table[256];
Takole mogoce?
Ezekiel ::
hmmm...
vsaj napake ne javi več...
ampak še vedno se biti sprehajajo...
Zdaj vsaj vem kje je problem
vsaj napake ne javi več...
ampak še vedno se biti sprehajajo...
Zdaj vsaj vem kje je problem
Ezekiel ::
emm...
to pa žal ne bi šlo
Stvar ni "odprte" narave... (službena zadeva)
mogoče, ko bo končan projekt...
to pa žal ne bi šlo
Stvar ni "odprte" narave... (službena zadeva)
mogoče, ko bo končan projekt...
Zgodovina sprememb…
- spremenil: Ezekiel ()
BigWhale ::
Takole na pamet bi rekel, da svinjas po memoriji ko strela... Pa da je v bistvu, tisto kar dela precej srecno nakljucje... ;)
Kaj je tole?
> reverse_byte = &tabela[256];
reverse byte postane hm, pointer na prvi element v tabeli?
Kako napolnis tabelo?
Potem tole:
> unsigned short int table[256];
> *obrni_byte = &table[256];
> obrni_byte[0]=0;
Spet isto... tukaj imas lokalno spremnljivko tabela, ki ima isto ime kot globalna spremenljivka, to so ze creva...
Hm, ce ti delajo pointerji probleme, potem probaj narediti najprej malo pocasnejso varianto. Ustvari tabelo v heap memoriji z calloc() (da bodo notri same nule), potem potem jo pa pred 'obdelavo' skopiraj z memcpy nekam drugam in jo popravi.
Glede na to, da ne mores dat kode sem gor, obstaja pac tudi moznost, da je napaka kje drugje in ne v teh parih vrsticah, ki si jih nalimal sem. :)
Kaj je tole?
> reverse_byte = &tabela[256];
reverse byte postane hm, pointer na prvi element v tabeli?
Kako napolnis tabelo?
Potem tole:
> unsigned short int table[256];
> *obrni_byte = &table[256];
> obrni_byte[0]=0;
Spet isto... tukaj imas lokalno spremnljivko tabela, ki ima isto ime kot globalna spremenljivka, to so ze creva...
Hm, ce ti delajo pointerji probleme, potem probaj narediti najprej malo pocasnejso varianto. Ustvari tabelo v heap memoriji z calloc() (da bodo notri same nule), potem potem jo pa pred 'obdelavo' skopiraj z memcpy nekam drugam in jo popravi.
Glede na to, da ne mores dat kode sem gor, obstaja pac tudi moznost, da je napaka kje drugje in ne v teh parih vrsticah, ki si jih nalimal sem. :)
Gundolf ::
Ce naredis tabelo veliko 256 bytov, potem lako dostopas le do elementa st. 0 do st. 255. Table[256] je neveljaven.
Ezekiel ::
evo kode (prazniki pač). Tukaj je videti, na kakšen način manipuliram s spremenljivkami. Gre se za množenje polinomov, bit po bitu... Števila so 43 mestna, torej nekako stevilo[3].
lp
unsigned short int* umbral_mult(unsigned short int *a, unsigned short int *b){ unsigned short int *c, *lb, *rb, *tmp; unsigned short int table1[3], table2[3], table3[3], table4[3]; int decision; lb = &table1[3]; rb = &table2[3]; c = &table3[3]; tmp = &table4[3]; int index1 = 0, index2 = 0; //value transcription... variable setting and reset lb[0] = b[0]; lb[1] = b[1]; lb[2] = b[2]; rb[0] = b[0]; rb[1] = b[1]; rb[2] = b[2]; c[0] = 0; c[1] = 0; c[2] = 0; for(int i = 0; i < N; i++){ lb = left_shift(lb); rb = right_shift(rb); index1 = i / WORD_LENGTH; index2 = i % WORD_LENGTH; decision = (a[index1] & (BIT_0 << index2)) ? 1 : 0; if(decision){ for(int j = 0; j < WORD_COUNT; j++){ tmp[j] = rb[j] ^ lb[j]; } for(int j = 0; j < WORD_COUNT; j++){ c[j] = c[j] ^ tmp[j]; } } } return c; }
lp
Zgodovina sprememb…
- spremenil: Ezekiel ()
Vesoljc ::
uporabiš tag "st.koda c" v oglatih oklepajih
Abnormal behavior of abnormal brain makes me normal...
Gundolf ::
No ena napaka:
unsigned short int table1[3]
// tu naredis tabelo veliko tri polja. Veljavna polja so tako 0, 1, 2
...
lb = &table1[3];
// lb zdaj kaze en polje izven tabele, vrednost na tem naslovu ni veljavna
// (pravzaprav bo tale kazalec najverjetneje kazal na table2[0])
...
lb[0] = b[0];
lb[1] = b[1];
lb[2] = b[2];
// in tu zdaj spremenis nekaj povsem drugega kot si imel v mislih
Ce zelis pointer na zadnji element v tabeli potem je to lb=&table1[2].
Ce zelis pointer na prvi element tabele je to lb=&table1[0]; ali pa lb=table1;
unsigned short int table1[3]
// tu naredis tabelo veliko tri polja. Veljavna polja so tako 0, 1, 2
...
lb = &table1[3];
// lb zdaj kaze en polje izven tabele, vrednost na tem naslovu ni veljavna
// (pravzaprav bo tale kazalec najverjetneje kazal na table2[0])
...
lb[0] = b[0];
lb[1] = b[1];
lb[2] = b[2];
// in tu zdaj spremenis nekaj povsem drugega kot si imel v mislih
Ce zelis pointer na zadnji element v tabeli potem je to lb=&table1[2].
Ce zelis pointer na prvi element tabele je to lb=&table1[0]; ali pa lb=table1;
Ezekiel ::
potrebujem poiter na celotno tabelo, da ga potem lahko prenašam noter in ven iz funkcij, znotraj pa počnem operacije tipa
pointer[0] = 0;
Aha, če imam poiter na prvi element, potem pointer++ pokaže na drugi element?
(kje so časi, ko smo to znali....)
pointer[0] = 0;
Aha, če imam poiter na prvi element, potem pointer++ pokaže na drugi element?
(kje so časi, ko smo to znali....)
gumby ::
>> Aha, če imam poiter na prvi element, potem pointer++ pokaže na drugi element?
tocno tako
pazi samo, kako ga bos uporabil (tisti ++ se bo zgodil po "uporabi" kazalca)...
pointer++, ++pointer in (pointer+1) so zelo podobne stvari, naredijo pa povsem nekaj drugega
tocno tako
pazi samo, kako ga bos uporabil (tisti ++ se bo zgodil po "uporabi" kazalca)...
pointer++, ++pointer in (pointer+1) so zelo podobne stvari, naredijo pa povsem nekaj drugega
Ezekiel ::
ufa, vsaj nekaj se še spomnim :)
tisto s ++ mi je pa znano.
Sporočim, kakšen bo napredek... tnx
tisto s ++ mi je pa znano.
Sporočim, kakšen bo napredek... tnx
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C] problem s kazalciOddelek: Programiranje | 1343 (1104) | BigWhale |
» | [ C ] floating point not loaded !!?Oddelek: Programiranje | 1562 (1495) | Fizikalko |
» | [C/C++] unsigned long lala = -1;Oddelek: Programiranje | 1175 (1134) | Vesoljc |
» | doubleOddelek: Programiranje | 1352 (1157) | Imortales |
» | ASCII in binarni sys HELP!Oddelek: Programiranje | 2819 (2738) | rejnmen |