Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 9 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 11.10.09
Prihlásený: 23.06.22
Príspevky: 289
Témy: 51
Bydlisko: Kysucké Nov...
Príspevok NapísalOffline : 03.01.2012 15:16

zdravim,

ucim sa na skusku z programovania, a v prednaskovych prezentaciach je nieco taketo :

Ukazovatele v strukturach, C jazyk

celkom nechapem ako sa moze k tym ukazovatelom na premenne pristupovat tak, ako to tam je napisane.
Ani mi to nejde skompilovat.

Podla mna sa musi pole najskor alokovat a potom naplnit, ale aj tak sa nevyhnem pouzitiu fcie strcpy().
Teda takto mi to funguje (nemam presne taku istu strukturu ako je v prezentacii-nechcelo sa mi tolko pisat):
Kód:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main()
{
    struct zakaznik {
        char *priezvisko;
        char *meno;
        int cena_nakupu;
    };

    struct zakaznik z1;

    z1.priezvisko = (char*) malloc(strlen("Mrkvicka") + 1);
        if(z1.priezvisko == NULL){
            printf ("chyba");
            exit (-1);
        }
    strcpy (z1.priezvisko, "Mrkvicka");

    z1.meno = (char*) malloc(strlen("Janko") + 1);
        if(z1.meno == NULL){
            printf ("chyba");
            exit (-1);
        }
    strcpy (z1.meno, "Janko");

    z1.cena_nakupu = 200;

    printf("\t%s\n", z1.priezvisko);
    printf("%s\n", z1.meno);
    printf("%d\n", z1.cena_nakupu);

    free (z1.priezvisko);
    free (z1.meno);

    z1.priezvisko = NULL;
    z1.meno = NULL;

    getch();
    return 0;
}


Je chyba v prezentacií alebo to ja zle chápem?







_________________
cpu intel c2q9550, 2.83GHz @ 3.91 GHz gpu asus eah4890 hdti 1GD5 1Gb ddr5 pcx zakl.doska asus p5q e HDD samsung 1Tb sata2 32Mb ram a-data ddr2 4x2Gb 1066+MHz Extreme zdroj fortron everest 600w 80+ skrinka enermax staray blue monitor LG 23" LCD W2343T-PF 2ms FULL HD DVI reproduktory Creative T6100 5.1
Offline

Skúsený užívateľ
Skúsený užívateľ
Ukazovatele v strukturach, C jazyk

Registrovaný: 11.01.09
Prihlásený: 03.05.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 03.01.2012 15:45

V prednaske je chyba, nema tam byt:

Kód:
stitok.priezvisko, "Novotna";
stitok.meno, "Tereza";
...

ale ma tam byt znak rovna sa:

Kód:
stitok.priezvisko = "Novotna";
stitok.meno = "Tereza";
...


V tomto zapise ide o to, ze v pamati iba na citanie sa vytvori retazec "Novotna", ktoreho adresa sa iba preda premennej stitok.priezvisko. Ak by si ju chcel neskor modifikovat, napr stitok.priezvisko[0] = 'R', pripadne by si volal strcpy na tuto adresu, dostal by si segmentation fault.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 11.10.09
Prihlásený: 23.06.22
Príspevky: 289
Témy: 51
Bydlisko: Kysucké Nov...
Príspevok Napísal autor témyOffline : 03.01.2012 16:10

Dakujem za objasnenie.

Tak ma napada otazka, je vobec na nieco dobry takyto zapis? (Ked pises, ze retazec je iba na citanie)...alebo lepsie povedane, pouziva sa takyto zapis? (teraz neriesim, ze v praxi by sa pouzili zrejme databazy)







_________________
cpu intel c2q9550, 2.83GHz @ 3.91 GHz gpu asus eah4890 hdti 1GD5 1Gb ddr5 pcx zakl.doska asus p5q e HDD samsung 1Tb sata2 32Mb ram a-data ddr2 4x2Gb 1066+MHz Extreme zdroj fortron everest 600w 80+ skrinka enermax staray blue monitor LG 23" LCD W2343T-PF 2ms FULL HD DVI reproduktory Creative T6100 5.1
Offline

Skúsený užívateľ
Skúsený užívateľ
Ukazovatele v strukturach, C jazyk

Registrovaný: 11.01.09
Prihlásený: 03.05.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 03.01.2012 16:16

Takto - menit sa sice nemoze, ale len tento konkretny retazec. Premennej stitok.priezvisko mozes kedykolvek priradit iny retazec ( ci uz cez malloc alokovat novu pamat, alebo cez znak = mu pridelit inu adresu s retazcom ). Takze vyuzitie moze mat, ak napriklad potrebujes povedzme nejaku defaultnu hodnotu uz v dobe pisania programu a potom budes potrebovat novu hodnotu retazca.


Offline

Užívateľ
Užívateľ
Ukazovatele v strukturach, C jazyk

Registrovaný: 14.03.11
Prihlásený: 30.04.24
Príspevky: 814
Témy: 23
Bydlisko: Bratislava
Príspevok NapísalOffline : 03.01.2012 17:18

Nerozumiem aká je výhoda zápisu

Kód:
z1.priezvisko = (char*) malloc(strlen("Mrkvicka") + 1);


Alokuješ pamäť presne na KONŠTANTU čo si uviedol.

V tých príkladoch je to normálne, alokuje sa 40 bajtov...

// pridané po 7 minútach od posledného príspevku

Fico píše:
Takto - menit sa sice nemoze, ale len tento konkretny retazec. Premennej stitok.priezvisko mozes kedykolvek priradit iny retazec ( ci uz cez malloc alokovat novu pamat, alebo cez znak = mu pridelit inu adresu s retazcom ). Takze vyuzitie moze mat, ak napriklad potrebujes povedzme nejaku defaultnu hodnotu uz v dobe pisania programu a potom budes potrebovat novu hodnotu retazca.


No, ak je to alokovaný buffer, aj strcpy by malo zafungovať, nie?
Ak je to pointer, tak sa jeho hodnota prepíše iným pointrom.

?


Offline

Skúsený užívateľ
Skúsený užívateľ
Ukazovatele v strukturach, C jazyk

Registrovaný: 11.01.09
Prihlásený: 03.05.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 03.01.2012 17:24

marian_r píše:
No, ak je to alokovaný buffer, aj strcpy by malo zafungovať, nie?


Nie nie, praveze strcpy robi to, ze na adresu, ktora je predana ako prvy parameter zacne zapisovat znaky pocnuc adresou, ktoru predame ako druhy parameter. Ale kedze je tento retazec ulozeny v read-only pamati, program spadne so Segmentation fault ( pretoze sa pokusame zapisovat na nepristupnu pamat ). Skuste si nasledujuci priklad pre ilustraciu:
Kód:
#include <stdio.h>
#include <string.h>

int main()
{

    char *text = "Toto je text ulozeny v pamati na citanie";

    strcpy( text, "Pokus prepisat konstantny text" );
    return 0;

}


Nasledujuci kod uz ale pojde, pretoze premennej pridelime novu adresu, ktora nie je v read-only sekcii:
Kód:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{

    char *text = "Toto je text ulozeny v pamati na citanie";

    text = malloc( 100 );
    if ( text != NULL )
    {
        strcpy( text, "Toto uz je platny zapis, pretoze text ma pridelenu novu adresu" );
        printf( "%s\n", text );
    }

    free( text );
    return 0;

}


Offline

Užívateľ
Užívateľ
Ukazovatele v strukturach, C jazyk

Registrovaný: 14.03.11
Prihlásený: 30.04.24
Príspevky: 814
Témy: 23
Bydlisko: Bratislava
Príspevok NapísalOffline : 03.01.2012 17:35

t-pack25 píše:
Podla mna sa musi pole najskor alokovat a potom naplnit, ale aj tak sa nevyhnem pouzitiu fcie strcpy().


Lenže tým zápisom s ukazovateľmi JE naalokované. Na ukazovatele a hodnotu ukazovateľa môžeš prepísať inou hodnotou ukazovateľa smerujúceho na iný reťazec.

// pridané po 3 minútach od posledného príspevku

Fico píše:
Nie nie, praveze strcpy robi to, ze na adresu, ktora je predana ako prvy parameter zacne zapisovat znaky pocnuc adresou, ktoru predame ako druhy parameter.


S tým nemám problém, je mi jasné že nemôže/nemal by zapisovať do alokovanej konštanty. :D

Ak má alokovanú premennú char[40] tak strcpy
ak má pointer char * tak =
.

Nie? O to išlo v tých ukážkach.


Offline

Skúsený užívateľ
Skúsený užívateľ
Ukazovatele v strukturach, C jazyk

Registrovaný: 11.01.09
Prihlásený: 03.05.24
Príspevky: 1385
Témy: 9
Bydlisko: Hrinova
Príspevok NapísalOffline : 03.01.2012 17:38

marian_r píše:
Ak má alokovanú premennú char[40] tak strcpy
ak má pointer char * tak =
.

Nie? O to išlo v tých ukážkach.


Presne tak, len ak mame smernik char*, mozme pouzit aj dynamicku alokaciu pomocou malloc.


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 11.10.09
Prihlásený: 23.06.22
Príspevky: 289
Témy: 51
Bydlisko: Kysucké Nov...
Príspevok Napísal autor témyOffline : 03.01.2012 20:12

Vdaka Vam vsetkym, uz tomu rozumiem







_________________
cpu intel c2q9550, 2.83GHz @ 3.91 GHz gpu asus eah4890 hdti 1GD5 1Gb ddr5 pcx zakl.doska asus p5q e HDD samsung 1Tb sata2 32Mb ram a-data ddr2 4x2Gb 1066+MHz Extreme zdroj fortron everest 600w 80+ skrinka enermax staray blue monitor LG 23" LCD W2343T-PF 2ms FULL HD DVI reproduktory Creative T6100 5.1
Odpovedať na tému [ Príspevkov: 9 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Ukazovatele (pointers) na funkciu (vyznam) v C++ otazka

v Assembler, C, C++, Pascal, Java

3

755

02.02.2016 19:32

Elendil Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk

v Operačné systémy Microsoft

6

603

16.12.2009 17:52

Freelan Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk

v PHP, ASP

2

545

29.06.2009 18:20

emer Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk

v Operačné systémy Microsoft

4

597

24.12.2008 4:55

mithequessir Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Vista jazyk

v Operačné systémy Microsoft

1

298

11.09.2010 22:42

shiro Zobrazenie posledných príspevkov

Táto téma je zamknutá, nemôžete posielať nové príspevky alebo odpovedať na staršie. Web jazyk

v Webdesign

6

620

17.11.2008 11:20

suchy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Jazyk klávesnice

v Assembler, C, C++, Pascal, Java

9

1098

11.07.2011 16:04

johny3212 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk webu

v PHP, ASP

15

1102

15.03.2009 17:24

kaidžas Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk stranky

v PHP, ASP

6

491

16.01.2009 19:59

kaidžas Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. aky jazyk

[ Choď na stránku:Choď na stránku: 1, 2 ]

v Assembler, C, C++, Pascal, Java

47

2853

08.12.2008 20:03

stopa27 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. aký jazyk?

v Ostatné

2

561

17.01.2010 21:55

Merlin_sk Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Programovací jazyk

v Assembler, C, C++, Pascal, Java

17

893

12.10.2011 13:44

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Jazyk PC

v Notebooky a netbooky

12

361

28.09.2013 20:01

SamerLp Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk C

v Assembler, C, C++, Pascal, Java

5

429

15.04.2013 22:06

marian_r Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. jazyk C

v Assembler, C, C++, Pascal, Java

9

984

10.04.2009 13:19

neutronmind Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Jazyk C

v Assembler, C, C++, Pascal, Java

17

1067

11.02.2011 23:55

walther Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra