Herout - pointery – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Herout - pointery – C / C++ – Fórum – Programujte.comHerout - pointery – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
4. 3. 2014   #1
-
0
-

 Ahoj, poprosil bych zas o nejake vysvetleni..

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..

typedef double (*P_FD)();
P_FD p_fd;
    
P_FD g(void) {
    return (sqrt);
}
    
double d = g()(9.);
printf("%lf", d);

 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);
    }

Predem diky za odpovedi.

Nahlásit jako SPAM
IP: 88.103.65.–
KIIV
~ Moderátor
+43
God of flame
4. 3. 2014   #2
-
0
-

#1 tomas_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...
4. 3. 2014   #3
-
0
-

#2 KIIV
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..

Nahlásit jako SPAM
IP: 88.103.65.–
KIIV
~ Moderátor
+43
God of flame
4. 3. 2014   #4
-
0
-

idealni je to pretypovat na int ... 
..., (int)*p_d)
 

kazdopadne podle mnozstvi drobnych chyb to nevypada na moc dobrej studijni material

Nahlásit jako SPAM
IP: 94.113.93.–
Program vždy dělá to co naprogramujete, ne to co chcete...
5. 3. 2014   #5
-
0
-

#4 KIIV
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..?

Nahlásit jako SPAM
IP: 88.103.65.–
z
~ Anonymní uživatel
268 příspěvků
5. 3. 2014   #6
-
0
-

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ě.

Nahlásit jako SPAM
IP: 78.156.159.–
5. 3. 2014   #7
-
0
-

#6 z
"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);

Připojen obrázek.

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!

Nahlásit jako SPAM
IP: 88.103.65.–
KIIV
~ Moderátor
+43
God of flame
5. 3. 2014   #8
-
0
-

#7 tomas_prokop
 

#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...
5. 3. 2014   #9
-
0
-
Nahlásit jako SPAM
IP: 88.103.65.–
KIIV
~ Moderátor
+43
God of flame
5. 3. 2014   #10
-
+1
-
Zajímavé

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...
KIIV
~ Moderátor
+43
God of flame
5. 3. 2014   #11
-
+1
-
Zajímavé

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...
7. 3. 2014   #12
-
0
-

#10 KIIV
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.. ;-)

Nahlásit jako SPAM
IP: 62.201.23.–
KIIV
~ Moderátor
+43
God of flame
7. 3. 2014   #13
-
0
-

#7 tomas_prokop

"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..

#12 tomas_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...
7. 3. 2014   #14
-
0
-

#13 KIIV
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. 

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 62.201.23.–
KIIV
~ Moderátor
+43
God of flame
7. 3. 2014   #15
-
0
-

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...
7. 3. 2014   #16
-
0
-

#15 KIIV
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 :-)

Diky!

Nahlásit jako SPAM
IP: 62.201.23.–
KIIV
~ Moderátor
+43
God of flame
7. 3. 2014   #17
-
0
-

#16 tomas_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...
7. 3. 2014   #18
-
0
-

#17 KIIV
Jasne, blok je lepsi.. diky

Nahlásit jako SPAM
IP: 62.201.23.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

Podobná vlákna

Pavel Herout - riešenia — založil djmathias

Java - první příklad Herout — založil Martin

C++ pointery — založil jane32

Pointery — založil inferno-girl

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý