» »

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?

BigWhale ::

A wild guess...

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 :)

BigWhale ::

Cel program bi prisel prav ;)

Ezekiel ::

emm...

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. :)

Gundolf ::

Ce naredis tabelo veliko 256 bytov, potem lako dostopas le do elementa st. 0 do st. 255. Table[256] je neveljaven.

Ezekiel ::

mah kurc, del kode sledi malo kasneje....

je že precej tečno vse skupaj :'(

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].
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;

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....)

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:)

Ezekiel ::

ufa, vsaj nekaj se še spomnim :)

tisto s ++ mi je pa znano.

Sporočim, kakšen bo napredek... tnx


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] problem s kazalci

Oddelek: Programiranje
141329 (1090) BigWhale
»

[ C ] floating point not loaded !!?

Oddelek: Programiranje
111549 (1482) Fizikalko
»

[C/C++] unsigned long lala = -1;

Oddelek: Programiranje
51155 (1114) Vesoljc
»

double

Oddelek: Programiranje
201336 (1141) Imortales
»

ASCII in binarni sys HELP!

Oddelek: Programiranje
62795 (2714) rejnmen

Več podobnih tem