Šta je novo?

Pomoć za C

Može li mi neko reći gde je greška?
 

Prilozi

  • Screen shot 2010-12-15 at 00.29.55.png
    Screen shot 2010-12-15 at 00.29.55.png
    157.9 KB · Pregleda: 51
Ukljucio si neki header 2 ili vise puta a nisi se zastitio od toga. Svaki .h file zapocni na sledeci nacin:
Kod:
#ifndef _IME_HEADER_FAJLA_
#define _IME_HEADER_FAJLA_

// a ovde stavi definicije, deklaracije, itd...

#endif

Ako kasnije napises #include "header.h" dva ili vise puta, samo ce prvi put biti procesiran, svaki sledeci put ce biti preskocen.
Budi pazljiv da se ne desi slucaj da imas dva razlicita headera sa identicnom zastitom.
 
Poslednja izmena:
Evo još jednog gremlina. Kaže: Expected expression before 'int'. Šta li to očekuje između "case 0:" i prve naredbe? Jel moguće da je zabranjeno deklarisati promenljive u okviru case-a?
 

Prilozi

  • Screen shot 2010-12-15 at 12.47.55.png
    Screen shot 2010-12-15 at 12.47.55.png
    124.5 KB · Pregleda: 42
heh, ja sam radio slicnu stvar.

ali su mi opcode-i gadjali niz pointera na fukcije. to sa switch-om ti je malo ghey... :d mada ako ti nisu poredjani moguce da bi bilo skuplje prevodjenje, nego switch. ili da ne prevodis, nego da ostavljas prazna mesta u nizu, ali je to gadno ako su opcode-i numericki rastrkani...

nemam pojma za case, ne secam se da sam imao potrebu da deklarisem u njemu. moguce da bi resio stvar kada bi sve stavio u blok (viticaste zagrade) ili deklarisao pre prvog case-a, kao u ovom ms primeru.

a cenim i da bi ti kod bio citljiviji ako bi za svaku operaciju napravio po funkciju, pa njih pozivao iz switch-a. tako sam i dosao na ideju niza pointera jer ti u switchu za n-tu instrukciju treba n provera jednakosti, a nije lose to izbeci.
 
Poslednja izmena:
Ja koliko se sećam u C-u ne možeš da deklarišeš promenljive bilo gde u kodu (kao u C++-u), nego samo na početku bloka.
 
Pa molim vas Gosn. Side, nisam tražio da mi se komentariše kod van pitanja. :d

Anyway, postoji razlog zašto sam onaj kod ispod stavio pod komentar. To je zato što i pišem funkciju koja će da ga zameni. Ovo je kod ostao iz prethodne verzije programa, sada taj kod mora da izvrši znatno komplikvaniju operaciju i u tu svrhu pišem funkciju. U međuvremenu sam shvatio da mi ne treba deklaracija te dve promenljive tu. Verovatno sam krenuo da improvizujem kad sam odkucao te deklaracije. :p

Inače, ič mi nije jasno šta si mislio pod "opkodovi gađaju niz pointera na funkcije". :p

Ja sam u ovom programu napravio niz struct-ova koji predstavljaju dekodirane instrukcije (što sam izveo iz postavke zadatka). (dekodiranje se obavlja ranije, isto korišćenjem funkcija).

A otkud znaš da radim to što pretpostavljaš da radim? :p Da nisi i ti studirao (ili još studiraš :D) FON ili ETF (ili tako nešto)?
 
Poslednja izmena:
Pa svi smo mi pravili evaluatore matematickih izraza. Ono sto je sid rekao je da ne stavljas id opcode-ova, vec pointere na func direktno.
Npr.
Kod:
// ovo je pointer na funkciju
typedef float(* PFNFuncOP)(float a, float b);

/* function returning pointer to int */
int *func(int a, float b);

/* pointer to function returning int */
int (*func)(int a, float b);

struct Instr
{
float op1;
float op2;
PFNFuncOP op;
};

i onda pises:
float Sabiranje(float a, float b)
{
 return a+b;
}

Instr i;
i.op1 = 1;
i.op2 = 2;
i.op = Sabiranje; // nije greska.. Sabiranje se pise bez zagrade i parametara . U ovom slucaju rec Sabiranje predstavlja pointer na funkcije a ne poziv funkcije.

IzvrsiInstr(i);

a u IzvrsiInstr(Instr* i)
{
i->op(i->op1, i->op2);
}
i gle cuda.. pozvace se sabiranje!!

Problem nastaje ako imas unarne (sin, cos, itd) ili ternarne funkcije (uhh ne pada mi nijedna na pamet ali znam da ima :) ), te treba modifikovati primer.

Secam se da je kompleksan matematicki izraz "kompajliran" na ovaj nacin bio oko 10-15% sporiji od C kompajlirane funkcije koja radi istu stvar.
ha... ovo je google prvo izbacio kada sam ga pitao za pointere na funkcije:
http://www.newty.de/fpt/intro.html#what

I jos nesto.. potrerbno je da znas da procitas kompleksne deklaracije:

http://www.ericgiguere.com/articles/reading-c-declarations.html
 
Poslednja izmena:
Ne pravim ja evaluatore matematičkih izraza, već simulaciju izvršavanja procesorskih instrukcija.

Ali može sigurno taj proncip da se primeni i tu. Samo moram malo to da pručim i vidim kako.

Hvala. :wave:
 
Ukljucio si neki header 2 ili vise puta a nisi se zastitio od toga. Svaki .h file zapocni na sledeci nacin:
Kod:
#ifndef _IME_HEADER_FAJLA_
#define _IME_HEADER_FAJLA_

// a ovde stavi definicije, deklaracije, itd...

#endif

Ako kasnije napises #include "header.h" dva ili vise puta, samo ce prvi put biti procesiran, svaki sledeci put ce biti preskocen.
Budi pazljiv da se ne desi slucaj da imas dva razlicita headera sa identicnom zastitom.

Moze da koristi i #pragma once, isti je efekt i radi podjednako brzo kao i ova struktura jer moderni kompajleri detektuju ovako nesto i prevode to na istu stvar. E sad, nisam bas siguran koliko je po "standardu" niti da li svi kompajleri to imaju. GCC i Microsoft imaju sigurno.

A sto se tice integrisanih operacija, pre jedno godinu dana smo nesto eksperimentisali na faxu na jednoj laboratorijskoj vezbi, dobili smo drasticno vecu razliku. Pogotovo kada je doslo do stvari kao sto su koren, stepenovanje itd. Mada to je ocekivano, u neku ruku.
 
Poslednja izmena:
Pa molim vas Gosn. Side, nisam tražio da mi se komentariše kod van pitanja. :d

istripovao sam RFC! :d

objasnio ti je yooyo za pointere na funkcije. fora je sto kad vec prevedes asembli u masinac bezveze je da "prevodis" masinac u instrukcije switchom. ovo sa nizom pointera je vrlo slicno onome sto se inace desava u hardveru, "adresa" instrukcije se salje u ALU i on propusta njen rezultat na izlaz. to bi za soft implementaciju bilo skupo i nepotrebno pa su pointeri "the next best thing".

faks je FKN, fakultet za kompjuterske nauke @ megatrend
 
Krenuo sam da implementiram te pointere na funkcije i naišao na problem odmah na prvoj naredbi koju sam otkucao.
Kod:
typedef void(* exe_function_ptr)(inst * inst_struct_ptr, int * memory_ptr, processor_data * proc_ptr);
Ovde dobijam grešku: Expected ")" before "*" token.

Meni je potpuna misterija*. Napisao sam baš kako je yooyo dao u primeru.

*Znam šta poruka govori, ali nemam pojma zašto.
 
Poslednja izmena:
Šta je? Niko ne zna? :d

Da malo preciziram. Mislim da se geška odnosi na drugu zvezdicu u naredbi. A inst i processor_data su struct-ovi koji su typedef-ovani u istom fajlu.

EDIT: U jbm ti sitno žito :d morao sam da napišem ovu naredbu ispod definicija ovih struct-ova da bi je kompajler shvatio kako treba. Ako se napiše iznad ne ide. (znam zašto, zato što kompajler čita odozgo na dole).

***, čekao sam da mi kompajler izbaci grešku: You must be joking!? Right? :D

EDIT2: Eto meni veselja. Ja ustvari hoću da stavim promenljivu u inst struct koja je ovaj pointer na funkciju. Ali ako njega definišem ispod definicije struct-a onda ne mogu da ga stavim kao promenljivu jer ga kompajler još nije našao.

Kako da ovo rešim. Pošto stavljanje definicije ovog pointera u drugi fajl povlači infinite loop include-ovanja, što povlači jedno 1000 istovetnih grešaka kompajlera. (dok ovaj konačno ne otegne papke :d)




Šta ja u stvari pokušavam je da u struct stavim pointer na funkciju koja kao jedan od argumenata prima taj struct. Ako ovo ne može, moraću onda da menjam funkcije za egzekuciju dekodoranih instrukcija tako da ne primaju ovaj struct kao argument već neke od njegovih promenljivih. Što znači da ću morati da širim deklaracije funkcija. Al ***. Ako se mora...
 
Poslednja izmena:
Odradi forward deklaraciju strukture. Sasvim je lelagno napisati sledece:
Kod:
struct A; // deklarisi struct A. kasnije cu objasniti sta je A.

struct B
{
  A *a; // ovo je leglno, jer kompajler zna da definicija A postoji negde
};

struct C
{
 A a; // ovo nije moguce izvesti jer kompajler nezna detalje o struct A
};

// detalji o struct A
struct A
{
...
};
 
Poslednja izmena:
Ja sam radio typedef, sa onim duplim imenom struct-a (jedno pre, jedno posle sadržaja struct-a). Zbog toga sam se zbunio kod ovog pristupa kasnijeg definisanja.

Ja taj struct koristim u main-u da napravim niz tih structova (kasnije i prosleđujem pointer ka jednom članu tog niza funkcijama). Jel može to da se radi bez typedef-a?

Anyway, uspeo sam uspešno da implementiram pointer na funkciju :banana:, i da se pri tom oslobodim jednog switch-a tako da mi je kod za izvršavanje dekodiranih instrukcija:
Kod:
while (proc.halt == 0)
	{
		ri = instMem[proc.pi];
		
		inst_execute(&ri, podMem, &proc);
	}
Dok je inst_execute definisana kao:
Kod:
void inst_execute(inst * instr_ptr, int * memory_ptr, processor_data * proc_ptr)
{
	instr_ptr->opcode(instr_ptr->adr1, instr_ptr->adr2, instr_ptr->is_1_array_ptr, instr_ptr->is_2_array_ptr, instr_ptr->flag_1, instr_ptr->flag_2, memory_ptr, proc_ptr);
}

opcode je pointer ka nekoj od 10 funkcija za egzekuciju. Naravno da svakoj od tih funkcija nisu potrebni svaki od ovih argumenata, ali moraju sve da se deklarišu isto, da bi ova tehnika mogla da se primeni. Ali gledaću da druga 2 argumenta izbacim i prenesem njihovu svrhu na treća dva.



EDIT: Evo izmenio sam.
Kod:
void inst_execute(inst * instr_ptr, int * memory_ptr, processor_data * proc_ptr)
{
	instr_ptr->opcode(instr_ptr->adr1, instr_ptr->adr2, instr_ptr->flag_1, instr_ptr->flag_2, memory_ptr, proc_ptr);
}
 
Poslednja izmena:
Nazad
Vrh Dno