[ pri3rak @ 03.05.2007. 22:29 ] @
Naime sledeci je problem.U pitanju je deo domaceg zadatka iz predmeta teorija informacija i kodovanje na 4. godini BG ETF-a.Potrebno je na osnovu godine upisa i broja indexa izgenerisati nekakvu pseudoslucajnu sekvencu odredjenih brojeva kojima je zadata verovatnoca pojavljivanja.Nakon toga je potrebno izracunati entropije pojedinih brojeva.Da bi to bilo moguce potrebno je koristiti log funkciju.Problem je u tome sto me kompajler stalo izbacuje kada natrci na log funkciju u source-u.U pitanju je gcc na SuSE 10.1, isto mi radi i na FreeBSD-u 5.2, kao i na galebu (galeb.etf.bg.ac.yu - nekakav slackware).Kada za isti posao koristim bloodshed na windowsu kompajliranje prodje bez problema, ali ne dobijam nikakvu pseudoslucajnu sekvencu vec niz istih brojeva.Source sledi.(Namerno je pisan ovako prosto, moglo je i krace ali onda ljudi za koje se to radi bi imali problema, a u pitanju su studenti telekomunikacija koji nemaju prilike da vide bas previse programiranja).Jos jedna napomena onaj sinus pri dnu source-a nema nikakvu funkciju u resavanju samog problema, vec je posluzio da se vidi da li ce i na njemu da pukne kompajliranje, i puklo je....

#include <stdio.h>
#include <math.h>

main ()
{
int index,year,flag,n,i,k;
int a,b,v,g;
int lim1,lim2,lim3;
int sekvenca[10000];
int na,nb,nv,ng;
float pa,pb,pv,pg;
float x,h;
FILE *fw;

printf("Uneti broj indeksa: ");
scanf("%d",&index);
printf("Uneti godinu upisa: ");
scanf("%d",&year);

printf("Index: %d\n",index);
printf("Godina: %d\n",year);

a = index%10;
b = year%10;
v = (index+year)%10;
g = (index*year)%10;

printf("a: %d\n",a);
printf("b: %d\n",b);
printf("v: %d\n",v);
printf("g: %d\n",g);

flag = 0; //Bez sazimanja
if(a>=b && a>=v && a>=g) {
pa = 4.0/8.0;
pb = 2.0/8.0;
pv = 1.0/8.0;
pg = 1.0/8.0;
}

if(b>=a && b>=v && b>=g) {
pa = 3.0/8.0;
pb = 2.0/8.0;
pv = 2.0/8.0;
pg = 1.0/8.0;
}

if(v>=a && v>=b && v>=g) {
pa = 0.4;
pb = 0.3;
pv = 0.2;
pg = 0.1;
}

if(g>=a && g>=b && g>=v) {
pa = 0.25;
pb = 0.25;
pv = 0.25;
pg = 0.25;
}

if(a == b) {
flag = 1; //Sazimanje (pb - se gubi)
pa += pb;
pb = 0;
}

if(a == v) {
flag = 2; //Sazimanje (pv - se gubi)
pa += pv;
pv = 0;
}

if(a == g) {
flag = 3; //Sazimanje (pg - se gubi)
pa += pg;
pg = 0;
}

if(b == v) {
flag = 2; //Sazimanje (pv - se gubi)
pb += pv;
pv = 0;
}

if(b == g) {
flag = 3; //Sazimanje (pg - se gubi)
pb += pg;
pg = 0;
}

if(v == g) {
flag = 3; //Sazimanje (pg - se gubi)
pv += pg;
pg = 0;
}

printf("pa: %f\n",pa);
printf("pb: %f\n",pb);
printf("pv: %f\n",pv);
printf("pg: %f\n",pg);
printf("flag: %d\n",flag);

x = 2147483647*pa;
lim1 = x;
flag = 0;

if(pb != 0) {
x += 2147483647*pb;
lim2 = x;
}
else {
x += 2147483647*pv;
lim2 = x;
lim3 = 2147483647;
flag = 1;
}

if(pv!=0 && flag==0) {
x += 2147483647*pv;
lim3 = x;
}

printf("lim1: %d\n",lim1);
printf("lim2: %d\n",lim2);
printf("lim3: %d\n",lim3);

fw = fopen("prs.txt","w");

for(i=0; i<10000; i++) {
n = rand();
if(flag == 0) {
if(n < lim1) sekvenca=a;
if(lim1<=n && n<lim2) sekvenca=b;
if(lim2<=n && n<lim3) sekvenca=v;
if(lim3 <= n) sekvenca=g;
}
if(flag == 1) {
if(n < lim1) sekvenca=a;
if(lim1<=n && n<lim2) sekvenca=v;
if(lim2 <= n) sekvenca=g;
}
if(flag == 2) {
if(n < lim1) sekvenca=a;
if(lim1<=n && n<lim2) sekvenca=b;
if(lim2 <= n) sekvenca=g;
}
if(flag == 3) {
if(n < lim1) sekvenca=a;
if(lim1<=n && n<lim2) sekvenca=b;
if(lim2 <= n) sekvenca=v;
}
//printf("sekvenca[%d]: %d\n",i,sekvenca);
k = sekvenca+48;
putc(k,fw);
}

fclose(fw);

//
// Odredjivanje entropije
//
na = nb = nv = ng = 0;

for(i=0; i<10000; i++) {
if(flag == 0) {
if(sekvenca == a) na++;
if(sekvenca == b) nb++;
if(sekvenca == v) nv++;
if(sekvenca == g) ng++;
}
if(flag == 1) {
if(sekvenca == a) na++;
if(sekvenca == v) nv++;
if(sekvenca == g) ng++;
}
if(flag == 2) {
if(sekvenca == a) na++;
if(sekvenca == b) nb++;
if(sekvenca == g) ng++;
}
if(flag == 3) {
if(sekvenca == a) na++;
if(sekvenca == b) nb++;
if(sekvenca == v) nv++;
}
}

printf("na: %d\n",na);
printf("nb: %d\n",nb);
printf("nv: %d\n",nv);
printf("ng: %d\n",ng);

pa = na;
pb = nb;
pv = nv;
pg = ng;
pa /= 10000;
pb /= 10000;
pv /= 10000;
pg /= 10000;
printf("pa: %f\n",pa);
printf("pb: %f\n",pb);
printf("pv: %f\n",pv);
printf("pg: %f\n",pg);

x = log2(2);
h = sin(x);
// h = log(pa)/x;
printf("h: %f\n",h);
return(0);
}
[ VRider @ 03.05.2007. 22:59 ] @
U sekvencu, koja je niz (pokazivac na int), pokusavas da stavis int. to ti nece poleteti, i zato puca kompajliranje, barem meni.
damir@phoenix:~/temp$ gcc -lm -o prog zadatak.c
zadatak.c: In function ‘main’:
zadatak.c:149: error: incompatible types in assignment
zadatak.c:151: error: incompatible types in assignment
zadatak.c:153: error: incompatible types in assignment
zadatak.c:155: error: incompatible types in assignment
zadatak.c:160: error: incompatible types in assignment
zadatak.c:162: error: incompatible types in assignment
zadatak.c:164: error: incompatible types in assignment
zadatak.c:169: error: incompatible types in assignment
zadatak.c:171: error: incompatible types in assignment
zadatak.c:173: error: incompatible types in assignment
zadatak.c:178: error: incompatible types in assignment
zadatak.c:180: error: incompatible types in assignment
zadatak.c:182: error: incompatible types in assignment
zadatak.c:185: warning: assignment makes integer from pointer without a cast
zadatak.c:200: warning: comparison between pointer and integer
zadatak.c:202: warning: comparison between pointer and integer
zadatak.c:204: warning: comparison between pointer and integer
zadatak.c:206: warning: comparison between pointer and integer
zadatak.c:211: warning: comparison between pointer and integer
zadatak.c:213: warning: comparison between pointer and integer
zadatak.c:215: warning: comparison between pointer and integer
zadatak.c:220: warning: comparison between pointer and integer
zadatak.c:222: warning: comparison between pointer and integer
zadatak.c:224: warning: comparison between pointer and integer
zadatak.c:229: warning: comparison between pointer and integer
zadatak.c:231: warning: comparison between pointer and integer
zadatak.c:233: warning: comparison between pointer and integer
zadatak.c:256: warning: incompatible implicit declaration of built-in function ‘log2’
damir@phoenix:~/temp$
[ VRider @ 03.05.2007. 23:37 ] @
Ako u for petlji zamenis sekvenca sa sekvenca[ i ], onda nema gresaka, osim sto je fajl popunjen samo jednom te istom cifrom. Ne valja ti ovde nesto ozbiljnije... A ja nemam pojma o cemu si pisao u zadatku, ja sam ipak tek druga godina...

EDIT: Sad sam skapirao da je [es] uklonio [ i ] iz koda. Zato se kod stavlja medju odgovarajuce "code" tagove. Ako ne racunamo to, mislim da samo je problem sto nisi linkovao math biblioteku prilikom kompajliranja (-lm). A ovo da ti sama ideja zbog necega ne valja, stoji. Napisi neke komentare sta tu sta treba da radi, pa da trazim gresku dalje...
[ pri3rak @ 04.05.2007. 11:18 ] @
Hvala kolega, pre svega na dobroj volji za pojasnjavanjem, a i (nadam se) na resenom problemu :).Koliko vidim problem je bio sa linkovanjem matematicke biblioteke tj. onaj svic -lm , nazalost do sada nisam imao potrebe za math.h , tako da je ovo previd.A ne verujem da se tvoj linux preterano razlikuje od moga po ovom pitanju skroz me baca u rebus zasto ti nize iste cifre u datoteci.

Meni se trenutno lepo kompajlira na SuSEtu, generise pseudorandom sekvence bez problema, i racuna entropije.Jedino sto me malo buni je warrning

x.c: In function ‘main’:
x.c:207: warning: incompatible implicit declaration of built-in function ‘log2’

Ne znam u cemu je greska u logaritmu sa osnovom 2.

Inace koliko su ti rezultati koje dobijam korektni to cu tek videti.

Inace ne brini i tebe ce taj predmet na RTI da doceka za koju godinu ili kada se budes nasao na 4-oj godini.E sada ovo je i dalje rad u progresu, tako da ce verovatno biti jos problema, i ne zameri mi ako te jos neki put budem konsultovao.

Inace evo ga i link ka postavci problema (ima ih u mnozini) je http://nic-nac-project.de/~mbojan/dat.zip Tu postoje i neki opisi algoritama, to su oni jpg fajlovi....

Rade se I-b , I-v , II-b i II-v tj. za njih se pise code (naravno ne ocekujem da ces ovo da radis, vec samo pogledaj sta ces jednog dana raditi ;-) )

Srecno u kolokvijumskoj nedelji !

Pozdrav i svako dobro!
[ jonathan @ 04.05.2007. 16:26 ] @
tvoj x je tipa float, zameni log2 sa log2f
Code:

NAME
       log2, log2f, log2l - base-2 logarithmic function

SYNOPSIS
       #include <math.h>

       double log2(double x);
       float log2f(float x);
       long double log2l(long double x);

       Compile with -std=c99; link with -lm.