» »

Pomoč z programom

Pomoč z programom

bison ::

Pozdravljeni

Imam hude probleme z naslednjim programom...

Napišite program(V programskem jeziku C), ki pretvori zaporedje zlogov v zaporedje ASCII, zapisanih kot šestnajstiška števila. PRVI PARAMETER programa predstavlja ima vhodne zbirke, v ciljno zbirko pa mora v šestnajstiški obliki prepisati pripadajoče ASCII kode vhodnih znakov. V primeru, da ciljna zbirka ni podana, se rezultat zapiše na standardni izhod, rezultat pa se zapisuje na standardni izhod. UPORABITE ŠTEVILKE SISTEMSKIH KLICEV IN NE PREDPROCESORSKIH DEFINICIJ. KOT EDINO ZUNANJO FUNKCIJO lahko uporabite SYSCALL.

Zadeva bi mogla zgledat tako nekako....

Vhod: Vpišeš neko besedo, stavek...
Izhod: Ti spremeni tisto besedo v ASCI znake. (recimo preverjanje/50726576....)

Dejansko bi potreboval samo v grobem fukcijo, ki bi bi spremenila znake v ASCII kodo. Problem je da je vse potrebno napisat z SYSCALL, ki pa ga resnično ne obvladam najbolje. Resnično bom hvaležen za bilo kakšno pomoč.

LP
  • spremenilo: bison ()

napsy ::

Za ascii verdnost znaka v C-ju samo castaš znak (char) v int in maš desetiško vrednost. Potem samo pretvoriš v šestnajstiško.

Za syscall pa maš definirane veljavne ukaze v bits/syscall.h. Ti verjetno potrebuješ SYS_write. Za izpis pa navedeš deskriptor standardnega izhoda, ki je 1.
"If you die, you die. But when you live you live. There is no time to waste."

bison ::

se pravi...

int vrednost;
char znak;

vrednost=(int) znak; v tem smislu ?
programiranje je zakon!

ERGY ::

se pravi...

int vrednost;
char znak;

vrednost=(int) znak; v tem smislu ?



Saj te ne bo ubilo če skompajlaš tole pa pogledaš output ;)

fiction ::

Za ascii verdnost znaka v C-ju samo castaš znak (char) v int in maš desetiško vrednost.
'A', 65 (desetisko), 0x41 (sestnajstisko) ali pa 01000001 (dvojisko) je dejansko ista stvar. V enem bajtu pomnilnika so notri napisani biti 01000001. Ali to obravnavas kot crko 'A' ali pa kot stevilko 65 je samo stvar interpretacije. Torej nic ni treba typecastati, samo na tisti char glej kot na unsigned stevilko med 0 in 255. Se pravi printf("%x", ch) bo izpisal 0x41, printf("%c", ch) pa 'A'. Typecast je brezvezen - tisto stlacis v int samo zato da sam sebe prepricas "to s cimer delam je dejansko stevilka".

Potem samo pretvoriš v šestnajstiško.
Ce bi lahko uporabljal zunanje funkcije (glej zgoraj) je to trivialno. V tvojem primeru bo pa potrebno nekaj telovadbe. Npr.:
const char *hexchars = "0123456789ABCDEF";
output(hexchars[(num & 0xf0) >> 4]);
output(hexchars[num & 0x0f]);

pri cemer output() izpise en znak.

V primeru, da ciljna zbirka ni podana, se rezultat zapiše na standardni izhod, rezultat pa se zapisuje na standardni izhod.

Kolikor jaz razumem problem(brez typotov): kot parameter programu dobis input file ter output file. Default za input (ce tiste datoteke ni) je stdin, za output pa stdout. V psevdokodi:
fd_in = open(file1); 
if (fd_in < 0) fd_in = 0; /* stdin */
fd_out = open(file2);
if (fd_out < 0) fd_out = 1; /* stdout */
do
{
  num = read(fd_in, ...);
  write(fd_out, /* spremenjen ... */);
} while (num > 0);
close(fd_in);
close(fd_out);

UPORABITE ŠTEVILKE SISTEMSKIH KLICEV IN NE PREDPROCESORSKIH DEFINICIJ. KOT EDINO ZUNANJO FUNKCIJO lahko uporabite SYSCALL.

Sistemski klici pri opisani kodi so: open, read, write in close. Fora je v tem, da ti ne mores sariti po filesystemu, ampak moras samo reci bolj priviligiranemu jedru - to pa to hocem narediti. Ta komunikacija poteka preko sistemskih klicev. Da pa to izgleda zate cim bolj transparentno (kot klic funkcije) obstajajo v libc razni wrapperji za sistemske klice npr. funkcija open(). Te dejansko ponavadi niso makroji, ampak prave funkcije, ki se klicejo in teh zgleda ne smes uporabiti. Imas pa sreco, da ti ni treba uporabiti SYSENTER oz. delati prekinitev, ampak lahko poklices kar syscall(). Da bi namesto definirane konstante (#define) za kateri klic gre uporabil dejansko stevilko se mi zdi pa grdo. No sicer je pa itak naloga precej akademska in mazohisticna. Ce se bo le kdo kaj navadil iz tega.

Ce delas npr. na Linuxu ti bo mogoce tole koristilo.


Vredno ogleda ...

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

[C] težava z binarnimi datotekami

Oddelek: Programiranje
91301 (1135) darkkk
»

C - pomoč

Oddelek: Programiranje
111435 (1175) Thagirion
»

ASCII ???

Oddelek: Programska oprema
71870 (1736) Pimoz
»

[c++] problem: pretvorba iz malih v velike crke

Oddelek: Programiranje
142103 (1750) Makina
»

[C] kako s syscall

Oddelek: Programiranje
51033 (982) napsy

Več podobnih tem