1) Kdyz si pomoci typedef definuju novy datovy typ (viz nize) a pouziju ho u te funkce g(void), Herout rika, ze odmocninu z 9 vypocitam jako double d = g()(9.). Dokaze mi nekdo vysvetlit jak to funguje? To, ze p_fd (2.radek) je pointer na funkci vracejici double chapu, dokonce i to, ze g je fce vracejici pointer na funkci vracejici double. Ale to konkretni provedeni ty odmocniny mi unika..
2) Kod nize ma vypsat jednotlivy byty v kterych je ulozena promenna d, ale v tom poslednim printf by melo byt p_d a ne *p_d ze? To tam ma Herout jen chybu ne?
double d;
unsigned char *p_d;
int i;
printf("Zadej realne cislo: ");
scanf("%lf", &d);
p_d = (unsigned char *) &d;
for (i = 1 ; i <= sizeof(double) ; i++, p_d++) {
printf("%d. byte = %d\n", i, *p_d);
}
#1tomas_prokop
v tom prvnim je to trosku sporne.. sqrt by melo byt spis s prototypem double sqrt(double) .. kazdopadne by to fungovalo jako vraceni adresy funkce sqrt z g, a to se pak zavola s (9.)
a druhe ma spravne.. vzal pointer z d, pretypoval na pointer na char.. a potom postupne prochazi a vypisuje jednotlive chary...
(ale minimalne 1 je spis bad practice - v c++ to jde udelat mnohem lepe)
Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#2KIIV
K ty dvojce.. Jaktoze to je spravne? Kdyz si to napisu v Xcode, tak p_d mi vrati cislo adresy bytu, ale *p_d mi vrati nejaky nesmysl. No a nebo delam neco spatne.. :-) To je taky mozny..
#4KIIV
No, jsem za pulkou knizky a zatim to neni vubec spatne. Chybky tam nejake jsou, ale zatim jen par.. Jinak s tim pretypovanim souhlasim, diky tomu mi Xcode nepise uz zadny hlaseni. Jen bych tam nedaval hvezdicku, proste (int)p_d. A to z toho duvodu, ze potrebuju vypsat adresy = hodnoty pointeru, ne hodnoty na ktery ukazuje.. Jestli mi rozumis..?
Ten příklad vypisuje jednotlivé byty toho doublu, takže tam ta dereference (hvězdička) má být. A ta konverze na int se dělá implicitně, takže by to nemělo nic hlásit.
Pokud tam ale dáváš ten ukazatel, tak to pochopitelně může křičet, protože to prostě není int. Přetypováním parametru to umlčíš, ale zjevně to neděláš s vědomím, co přesně děláš, takže je to špatně.
#6z
"Ten příklad vypisuje jednotlivé byty toho doublu, takže tam ta dereference (hvězdička) má být." To je hezký tvrzení, ale zkus ho prosím vysvětlit.. :-) Já jsem pořád přesvědčenej o opaku a to ze dvou důvodů 1) Xcode mi vypíše byty, pokud dereferenci nepoužiju 2) Proto, ze to moje hlava tak proste chape.. A proc? Viz kod nize:
int a = 3;
int *p_a;
p_a = &a;
printf("Hodnota pointeru (adresa promenne \"a\"): %d\nHodnota promenne na kterou pointer ukazuje (hodnota \"a\"): %d\n", (int)p_a, *p_a);
A jak je videt na obrazku, opravdu pointer bez dereference vypise adresu. S dereferenci vypise hodnotu "a". A takto stejne vidim i priklad s adresami bytu double d. Pokud to tak neni, zkuste mi vysvetlit prosim, proc se pletu.. Dekuju moc!
#include <stdio.h>
int main() {
int a = 0x12345678;
unsigned char *pa = (unsigned char*) &a;
printf("Hodnota: %d 0x%08X\n", a, a);
printf("Adresa a: %p\n",&a);
printf("Hodnota pa: %p\n",pa);
printf("Hodnota na adrese pa+0: 0x%02X\n", *pa);
printf("Hodnota na adrese pa+1: 0x%02X\n", *(pa+1));
printf("Hodnota na adrese pa+2: 0x%02X\n", *(pa+2));
printf("Hodnota na adrese pa+3: 0x%02X\n", *(pa+3));
}
vysledek:
Hodnota: 305419896 0x12345678
Adresa a: 0x7fff59a5cdc4
Hodnota pa: 0x7fff59a5cdc4
Hodnota na adrese pa+0: 0x78
Hodnota na adrese pa+1: 0x56
Hodnota na adrese pa+2: 0x34
Hodnota na adrese pa+3: 0x12
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
proste, kdyz se chces dostat k jednotlivejm bajtum nejakeho vetsiho cisla, tak si vemes jeho adresu a tu adresu pretypujes jakoby na retezec (unsigned char*)
Adresy se vypisujou pomoci %p - pak ti to neodsekne pulku adresy, jako mas ty v poslednich 4 radcich po tom "odseknuti" s (int).
Pokud chces jen adresy, budiz - nepouzijes dereferenci. Pokud ale chces hodnotu na te adrese, tak uz dereferenci proste pouzit musis (respektive ne uplne, muzes pouzit i alias dereference: pa[0] .. pa[3]).
Vsimni si v mem vypisu jedny veci: a = 0x12345678; tj. hexadecimalni zapis
a na:
pa[0] == 0x78;
pa[1] == 0x56;
pa[2] == 0x34;
pa[3] == 0x12;
coz jsou presne ty bajty z promenne a
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Mimochodem, mohem zajimavejsi je srovnani co dela pricitani u ruznych typu pointeru:
Hodnota: 305419896 0x12345678
Adresa a: 0x7fff4e99ae1c
Hodnota pa: 0x7fff4e99ae1c
Hodnota na adrese pa+0: 0x78
Hodnota na adrese pa+1: 0x56
Hodnota na adrese pa+2: 0x34
Hodnota na adrese pa+3: 0x12
Hodnota pi+0: 0x7fff4e99ae1c pa+0: 0x7fff4e99ae1c
Hodnota pi+1: 0x7fff4e99ae20 pa+1: 0x7fff4e99ae1d
Hodnota pi+2: 0x7fff4e99ae24 pa+2: 0x7fff4e99ae1e
Hodnota pi+3: 0x7fff4e99ae28 pa+3: 0x7fff4e99ae1f
z kodu:
int a = 0x12345678;
unsigned char *pa = (unsigned char*) &a;
int *pi = &a;
printf("Hodnota: %d 0x%08X\n", a, a);
printf("Adresa a: %p\n",&a);
printf("Hodnota pa: %p\n",pa);
printf("Hodnota na adrese pa+0: 0x%02X\n", *pa);
printf("Hodnota na adrese pa+1: 0x%02X\n", *(pa+1));
printf("Hodnota na adrese pa+2: 0x%02X\n", *(pa+2));
printf("Hodnota na adrese pa+3: 0x%02X\n", *(pa+3));
printf("Hodnota pi+0: %p pa+0: %p\n", pi+0, pa+0);
printf("Hodnota pi+1: %p pa+1: %p\n", pi+1, pa+1);
printf("Hodnota pi+2: %p pa+2: %p\n", pi+2, pa+2);
printf("Hodnota pi+3: %p pa+3: %p\n", pi+3, pa+3);
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#10KIIV
Jasne, to je to o cem jsem byl celou dobu presvedcenej, ale vy jste mi tvrdili, ze na vypis adres tech bytu mam pouzit dereferenci, coz me matlo..
Co se tyce toho pricitani u ruznych typu a hex. zapisu a rozdeleni cisla 0x12345678 do tech bytu, to je skvely, diky za tipy.. ;-)
"Ten příklad vypisuje jednotlivé byty toho doublu, takže tam ta dereference (hvězdička) má být." To je hezký tvrzení, ale zkus ho prosím vysvětlit..
#12tomas_prokop
tvrdil si, ze ti to vypisuje nesmysly s dereferenci - tak se ti snazime vysvetlit, ze to nejsou nesmysly ale jednotlivy bajty, ty tu meles porad neco o adresach.
Proste moc nepredpokladame, ze nekdo chce vypisovat jen pointery, kdyz tam ma pretypovani int pointeru na char pointer.
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#13KIIV
1) Nemyslel jsem to nijak spatne, tvych a jinych odpovedi si vazim. Ucim se a kazda rada dobra ;-)
2) Od zacatku mi slo jen a jen pouze o to, zda mi potvrdite, ze tam je chyba a mel jsem pocit, ze s tim nesouhlasite.. tot vse. Viz kod nize - pouzil jsem 3 ruzny moznosti vypsani adresy tech bytu, posledni moznost je ta z knizky - a ta je spatne.
protoze posledni prave vypisuje hodnotu a ne adresu :) nemam herouta, ale nejspis to byl ucel.. mozna jen blbe popsanej, nebo zustal nepochopen
EDIT: zrovna na to koukam a je tam:
/*
* s162.c v.2.0
*
* Vypis pameti pomoci pointeru
* ============================
*/
#include <stdio.h>
int main(void)
{
double f;
unsigned char * p_byte;
int i;
printf("Zadej realne cislo: ");
scanf("%lf", &f);
p_byte = (unsigned char *) &f;
for (i = 0; i < sizeof(double); p_byte++, i++)
printf("%d. byte = %02Xh\n", i, *p_byte);
return 0;
}
Vypis pameti znamena vypis jednotlivych bajtu, ne jejich adres!! Takze to ma spravne
EDIT2: jen se podle nej proboha neuc nepouzivat { blok }, kdyz mas jen jeden prikaz.. ani nevis, kolik chyb uz tu bylo jen proto, ze si tam nekdo doplni dalsi prikaz, a pak se divi, ze to nefunguje :)
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
#15KIIV
Koukam na to.. Mas pravdu, je tam totiz - zobrazi odpovidajici bajty z adresy v pameti. Ja to zrejme cetl jako zobrazi odpovidajici bajty adresy v pameti.
S tim blokem OK, jeste jsem si nezvolil cestu, obcas davam blok, obcas ne. Ale pokud je to lepsi bez, tak s tim nemam problem :-)
#16tomas_prokop
jop, blok je lepsi.. obzvlaste, pokud bys to psal pod s odsazenim (presne, jak je to v tom prikladu).. lidi na tom delaj strasne moc chyb
pak pridas treba:
p_byte = (unsigned char *) &f;
for (i = 0; i < sizeof(double); p_byte++, i++)
printf("%d. byte = %02Xh\n", i, *p_byte);
neco();
return 0;
a budes se divit, proc to nedela neco pokazde :)) - a jak rikam, je to strasne casta chyba
Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...