» »

Pomoč pri programiranju fe

Pomoč pri programiranju fe

gizmo666 ::

Sem študent prvega letnika na fe in bi prosil če mi lahko nekdo razloži ta vprašanja :

1) S kolikimi biti se zapiše float oziroma duble ?
a) 3
b) 4
c) 2
d) 8

2)Spremenlj. x v pomnilniku zaseda 4 pomnilniške celice. Nahaja se na naslovu 100234 in ima vrednost 200444. Kakšna je vrednost *x?
a)200444
b)100234
c)4
d)Vrednosti ne moremo dolociti

vem da če bi namesto *x imel &x bi mi vrnilo naslov, ali mi v tem primeru vrne vrednost?

Za odgovore se vam že vnaprej zahvaljujem :)

LP

technolog ::

Predvidevam, da je jezik C. Drugič napiši, nimam kristalne krogle.

1. Noben od odgovorov. Tipično 32 bitov (float) in double 2x toliko, lahko pa je karkoli.
2. Compile-time error. Compiler prepreči, da bi naredil dereferenco tipa int. Če je to pointer (kar implicira 32 bitni sistem), potem je odgovor d).

Zgodovina sprememb…

_Dormage_ ::

Za prvo si mislu bajte al bite?
Ker za bite nima smisla...za byte pa je odvisno od natančnosti.
Float je 4 byte in double je 8 bytov.

technolog ::

Ponavadi.

MrBrdo ::

obupna vprašanja :) kot da bi jih nekdo napisal ki nima pojma za kaj se gre
za katerega profesorja pa gre? to so dejanska vprašanja ki jih je on dal? ga bom šel malo obiskat ob priliki :)
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

gizmo666 ::

Hvala za tako hitre odgovore !:)
@_dormage_
Prvo vprašanje sem pobral iz enega foruma, ki naj bi blo direkt z izpita, pa je zgleda narobe napisu .

@MrBrdo:
Ne profesor nič kriv, on je drgač ful faca :)!In drugo vprašanje je dal kod primer samo namesto *X je dal &X. mene pa je samo zanimalo kaj se zgodi v primeru če jih zamenjam :)

Senitel ::

Dereferenciraš lahko kazalec, X ni kazalec => compiler error.
Lahko se pa potrudiš in rečeš (kids don't try this at home):
int* notSoRealPtr = (int*)X;
printf("Answer to all the life problems is: %i\n", *notSoRealPtr);

Spura ::

Nikjer ne pise da x ni kazalec.
*x vrne vrednost na naslovu 200444, torej je odgovor D, ne moremo dolociti, ker ne vemo kaj je na tem naslovu.

technolog ::

Ja, je compile error na 64 bitnem sistemu, ker ne more biti kazalec. Zagotovo. Če je to 32-bitni sitem, potem bi jaz spremenil odgovor:

d)Vrednosti ne moremo dolociti v d)Obnašanja programa ne moremo dolociti

Ker compile error pač ni vrednost. Itak sem pa jaz že vse napisal v prvem odgovoru. In isto sem se spraševal kdo je ta vprašanja sestavljal :)

MrBrdo ::

No če smo pošteni bi tudi za pointer lahko rekli da ima tudi številsko vrednost, čeprav če banaliziraš potem lahko za vsako spremenljivko to rečeš. Če je bilo originalno &x potem gre za dokaj smiselno vprašanje, za *x pa je preveč nejasno, čeprav bi bil po logičnem sklepanju ne glede na interpretacijo potem odgovor d). Za &x pa seveda b). Se pa strinjam da bi potem d moral malo spremenit tako kot je technolog napisal, ker ne vemo če se kaj nahaja na tistem naslovu, tako da lahko pride do access violation oz. segfault.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

smoke ::

Spura je izjavil:

Nikjer ne pise da x ni kazalec.
*x vrne vrednost na naslovu 200444, torej je odgovor D, ne moremo dolociti, ker ne vemo kaj je na tem naslovu.


Kak ne moreš določit vrednosti, če je pa človek napisal da se na naslovu 100234 nahaja vrednost 200444. :) Pravilen odgovor je A.

technolog ::

Tebi pa koncept kazalcev ni čisto jasen, ane?

smoke ::

V gizmotovem primeru je spremenljivka x ENAKA naslovu 100234, in ta naslov drži vrednost 200444, torej *100234 = 200444. Kaj tebi ni jasno?

technolog ::

Dej pejd spat mi s takimi.

&x==100234 //nahaja se na naslovu 100234
x==200444 //in ima vrednost 200444
*x==?????? //kolikšna je vrednost *x

Sedi, cvek :)

Zgodovina sprememb…

smoke ::

Ti bom razložo z assembly vidika. Imamo spremenljivko x ki je naslov 100234 (torej je x = 100234, ne vrednost x ampak x sam) Kaj dobimo če rečemo *100234? Ti bom pomagal z assembly kodo.

x db 200444
mov eax, x
mov eax, [eax]


Kakšno vrednost ima register EAX? Preštudiraj, pa mi povej ;)

EDIT: Vsak naslov kot tak, je že kazalec, in sicer, na vrednost, ki jo drži.

Zgodovina sprememb…

  • spremenil: smoke ()

IceBoX ::

smoke je izjavil:

Imamo spremenljivko x ki je naslov 100234 (torej je x = 100234, ne vrednost x ampak x sam)


Ne, preberi še enkrat.

Spremenlj. x v pomnilniku zaseda 4 pomnilniške celice. Nahaja se na naslovu 100234 in ima vrednost 200444

&x=100234
x=200444

Kaj pa je na naslovu 200444 pa ne vemo
Huh...

technolog ::

Ja, saj ni čudno, da imamo tako bugast softver, če si pa ljudje na takle način po svoje tolmačijo navodila.

hexor ::

1.)float(enojna natančnost 4 byte) double(dvojna natančnost 8 byte)
2.)dereferenčni operator(prikaže vrednost na določeni pom. lokaciji)
RootMachine ;)

smoke ::

IceBox, to je že res. Ampak nikjer ne piše da je spremenljivka pointer. Res je da če ni pointer kompiler tega niti ne skompajla ampak to je pa drug problem. Načeloma je pa tak, da je vsak naslov pointer, ki kaže na dejanske podatke ki so v pomnilniku. V tem primeru pa x kaže na 200444.

MrBrdo ::

ojoj smoke, ne delaj si sramote... preden se delas se vecjega ... z dokazovanjem svojega (ne)znanja assemblerja, drugič raje probaj kaj si sploh naredil, zatakne se ti namreč že v prvi vrstici ko v polje BYTE vrednosti daš število, ki zelo očitno ne paše v BYTE. pa še dvopičje si pozabil. v glavnem, nimaš pojma.
navodila naloge si pa tudi popolnoma napačno interpretiral. to kar govoriš da je vsak naslov pointer je pa tudi neumnost brez kakšne osnove. recimo v C naslov postane pointer šele ko obstaja informacija o tipu, dokler te informacije ni, naslov ni pointer saj ga ni mogoče dereferencirat. torej pointer je naslov + informacija o tipu, če že kaj. pravzaprav koncept naslova kot nekega podatkovnega tipa v programiranju sploh ne obstaja, tako da je tvoja izjava tako ali tako mimo.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

Mavrik ::

Fantje... glede na to da se je avtor teme očitno zmoto pri prepisovanju prve naloge, a ne bi raje pomislili če je naredil podobno napako tudi pri drugi medtem ko pametujete? ;)
The truth is rarely pure and never simple.

smoke ::

MrBrdo, you got me. Zatipkal sem se pri eni črki in sicer db, bi moral bit dd, my bad, pisal sem z glave. Nevem pa o kterem dvopičju ti govoriš (no, ampak tak nimam pojma). Bom ti napisal celotno kodo in si jo skompajlaj v flat assemblerju in naloži v debugger. ;)

format PE GUI 4.0
include 'win32a.inc'

section '.text' code readable executable
entry $
      mov   eax, x
      mov   eax, [eax]

section '.rwdata' data readable writable
x dd 200444d


Ko boš to naredil, mi povej kakšno vrednost ma EAX.

MrBrdo ::

sej ni noben rekel, da eax ni 200444, ampak to nima nobene veze z vprašanjem, ker si slabo navodila prebral. torej, dokazuješ stvar, ki ni pomembna glede na vprašanje. pa bravo da si vsaj stestiral zdaj to kar si napisal, verjamem da deluje. kar se pa dvopičja tiče, ponavadi se označi takšne spremenljivke z labeli, dd pa je potem samo ukaz ki v pomnilnik nekaj zapiše. tako kot je tukaj napisano v primeru http://www.keil.com/support/man/docs/aa... Morda pa je na IA32 oz. pri tvojem assemblerju brez dvopičja.
MrBrdo

smoke ::

MrBrdo, ukaz dd ne obstaja v x86 (tisti moj dd kvečjemu pomeni "define doubleword", ki ni ukaz in je specifičen za flat assembler), sicer pa probaj, mogoče ti ga rata kot ukaz zagnat na x86 :)). Svetujem ti, da si še prebereš malo več o x86 arhitekturi (Intel ma super knjige na to temo, pravtako AMD) in o windowsovem PE formatu exejev in mi nato pametuješ. ;)
Dejstvo pa je, da če bi C kompajler skompajlal kodo kjer derefenciraš spremenljivko, ki ni pointer bi dobil točno to kar sem napisal.

Veselim se pogovora s tabo, ko boš mel malo več pojma ;). Lahko noč.

MrBrdo ::

Seveda je ukaz, in sicer ukaz za zbirnik (program). Bolj natančno gre za psevdo-ukaz. Verjetno si malo pomešal pojme, si mislil opcode?
derefenciraš spremenljivko, ki ni pointer

Mislim da ne rabim komentirat. :D
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

CleanPower ::

yo, js pa da ne odpiram nove teme, bom kr tle prašu kako je z učnim gradivom/knjigami na UNI Elektrotehniki v Lj, je treba kakšne knjige kupit, al se da vse v knjižnjici dobit? Hvala, Lp
Celsius - če hodlaš $400 za 30dni, dobiš 50$ nagrade
https://celsiusnetwork.app.link/1453486815

ducttape ::

Bolj ali manj se vse dobi v knjižnici, samo pravi čas si izposodi. Kar je obveznega za kupit v 1. letniku sta dve skripti za lab vaje od OE (~4 EUR vsaka), čeprav nekateri asistenti tolerirajo tudi skopirane.


Vredno ogleda ...

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

[Java] array v voidu

Oddelek: Programiranje
102094 (1793) Spura
»

C in funkcije ter #define

Oddelek: Programiranje
463759 (2120) misek
»

[C] struct in int[] (strani: 1 2 )

Oddelek: Programiranje
656797 (5870) MrBrdo
»

[C/C++] pointerji in reference

Oddelek: Programiranje
111937 (1761) Matako
»

Pomoč pri Turbo Pascalu. Nujno!

Oddelek: Programiranje
171095 (828) Gundolf

Več podobnih tem