abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

včera 18:55 | Nová verze

Byla vydána nová stabilní verze 1.9 (1.9.818.44) webového prohlížeče Vivaldi (Wikipedie). Z novinek vývojáři zdůrazňují podporu nového vyhledávače Ecosia. Ten z příjmů z reklam podporuje výsadbu stromů po celém světě (YouTube). Nově lze přeskupovat ikonky rozšíření nebo řadit poznámky. Nejnovější Vivaldi je postaveno na Chromiu 58.0.3029.82.

Ladislav Hagara | Komentářů: 3
včera 17:00 | Nová verze

Byla vydána verze 3.7.0 svobodného systému pro správu obsahu (CMS) Joomla!. V oznámení o vydání (YouTube) se píše o 700 vylepšeních. Opraveno bylo také 8 bezpečnostních chyb.

Ladislav Hagara | Komentářů: 0
včera 08:22 | Komunita

Grsecurity (Wikipedie) je sada bezpečnostních patchů pro linuxové jádro (porovnání se SELinuxem, AppArmorem a KSPP). Od září 2015 nejsou stabilní verze těchto patchů volně k dispozici. Dle včerejšího oznámení (FAQ) nejsou s okamžitou platností volně k dispozici už ani jejich testovací verze.

Ladislav Hagara | Komentářů: 32
26.4. 23:33 | Komunita

OpenBSD 6.1 vyšlo již 11. dubna. Po dvou týdnech byla vydána i oficiální píseň. Její název je Winter of 95 a k dispozici je ve formátech MP3 a OGG.

Ladislav Hagara | Komentářů: 0
26.4. 18:55 | Nová verze

Byla vydána verze 2017.1 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux. S vydáním verze 2016.1 se Kali Linux stal průběžně aktualizovanou distribucí. Aktualizovat jej lze pomocí příkazů "apt update; apt dist-upgrade; reboot".

Ladislav Hagara | Komentářů: 0
26.4. 18:22 | Nová verze

Po téměř pěti letech od vydání verze 2.00 byla vydána nová stabilní verze 2.02 systémového zavaděče GNU GRUB (GRand Unified Bootloader). Přehled novinek v souboru NEWS.

Ladislav Hagara | Komentářů: 15
26.4. 17:55 | Komunita

Vývojáři Debianu oznámili, že od 1. listopadu letošního roku nebudou jejich archivy dostupné pomocí protokolu FTP. Již v lednu oznámil ukončení podpory FTP kernel.org (The Linux Kernel Archives).

Ladislav Hagara | Komentářů: 23
26.4. 17:00 | Bezpečnostní upozornění

V oblíbeném webmailu postaveném na PHP SquirrelMail (Wikipedie) byla nalezena bezpečnostní chyba CVE-2017-7692, jež může být útočníkem zneužita ke spuštění libovolných příkazů a kompletnímu ovládnutí dotčeného serveru. Zranitelnost se týká pouze instancí, kde je pro transport používán Sendmail.

Ladislav Hagara | Komentářů: 3
26.4. 13:11 | Zajímavý článek

Soudní dvůr Evropské unie rozhodl (tisková zpráva) ve věci C-527/15: Prodej multimediálního přehrávače, který umožňuje zdarma a jednoduše zhlédnout na televizní obrazovce filmy protiprávně zpřístupněné na internetu, může představovat porušení autorského práva.

Ladislav Hagara | Komentářů: 32
25.4. 13:33 | Pozvánky

Byly stanoveny termíny konferencí LinuxDays 2017 a OpenAlt 2017. Letošní LinuxDays proběhne o víkendu 7. a 8. října v Praze v Dejvicích v prostorách FIT ČVUT. Letošní OpenAlt proběhne o víkendu 4. a 5. listopadu na FIT VUT v Brně.

Ladislav Hagara | Komentářů: 0
Chystáte se pořídit CPU AMD Ryzen?
 (4%)
 (35%)
 (1%)
 (6%)
 (45%)
 (9%)
Celkem 327 hlasů
 Komentářů: 50, poslední včera 04:06
    Rozcestník

    Dotaz: C- divné nulování pole

    18.6.2007 18:45 Major Zeman | skóre: 2 | blog: major_zeman | Praha 6
    C- divné nulování pole
    Přečteno: 1291×

    Dobrý den, konečně jsem si udělal čas a začal se učit céčko, mám problém, pokoušel jsem se o prográmek, ktrerý naplní pole hodnotami indexů, vytiske, pak vynuluje a znova vytiskne, bohužel, nevím, kde je problém, ale nenuluje ho správně:

    #include <stdio.h>
    int main() {
    int pole[10], i,a;
    for (i=0;i<10;i++) {
    	pole[i]=i;
    	}
    int *ppole;
    ppole = &pole;
    for (a=0;a<10;a++) {
    	printf("%d:\t%d\n", a, *(ppole + a));
    	}
    while(ppole <= &pole[9]) {
    	*(ppole++)=0;
    	}
    for (a=0;a<10;a++) {
    	printf("%d:\t%d\n", a, *(ppole++));
    	}
    return 0;
    }

    výstup je pak zhruba následující:

    david@PC1 /home/david/texty/programovani/cecko $ ./36-ukazatel_s_polem
    0:      0
    1:      1
    2:      2
    3:      3
    4:      4
    5:      5
    6:      6
    7:      7
    8:      8
    9:      9
    0:      10
    1:      1
    2:      -1074194984
    3:      -1074194944
    4:      0
    5:      1105578095
    6:      1091910816
    7:      134513744
    8:      0
    9:      1105578095
    

    jako by to nějak přetěkalo, nebo co, použiji-li for cyklus, jede to, takhle ne, chybu tam prostě nevidím, netušíte někdo? Předem díky moc...

    PS: takhle to mám, abych si procvičil ukazatele s poly

    whereis wc wc: /bin/wc /usr/bin/wc /usr/X11R6/bin/wc /usr/share/man/man1/wc.1.bz2 /usr/share/man/man1p/wc.1p.bz2

    Odpovědi

    Luboš Doležel (Doli) avatar 18.6.2007 18:48 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    ppole jste nenastavil znovu na začátek pole.
    19.6.2007 10:17 podlesh | skóre: 37 | Praha
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Je to tak. Ještě bych doplnil:

    Základní pravidlo pro psaní v C: vždy používat nějaký memory/malloc debugger. Například jednoduchý electric fence: stačí při linkování přidat -lefence

    V tomto případě sice nepomůže (protože se jedná o zásobník), ale jinak je to naprosto nutná věc.
    18.6.2007 20:29 Crusoe
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    
    #include stdio.h
    int main() {
    int pole[10], i,a;
    for (i=0;i<10;i++) {
            pole[i]=i;
            }
    int *ppole;
    ppole = &pole;
    for (a=0;a<10;a++) {
            printf("%d:\t%d\n", a, *(ppole + a));
            }
    while(ppole <= &pole[9]) {
            *(ppole++)=0; // tu sa posuva adresa o prvok dalej
            }
    
    
    // teda ukazovatel na konci cyklu while ukazuje na koniec pola
    ppole = &pole;
    
    for (a=0;a<10;a++) {
            printf("%d:\t%d\n", a, *(ppole++));
            }
    return 0;
    }
    
    
    
    18.6.2007 20:47 finn | skóre: 42 | blog: finnlandia | 49° 44´/13° 22´
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Ještě by nebylo od věci poznamenat, že na vynulování pole je obvykle výhodnější použít fci memset():
    #include <string.h>
    
    void foo()
    {
      int pole[DELKA_POLE];
      ...
      memset(pole, 0, sizeof(pole));
      ...
    }
    Užívej dne – možná je tvůj poslední.
    19.6.2007 08:52 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    void foo()
    {
      int pole[DELKA_POLE] = {0};
      ...
    }
    19.6.2007 11:16 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    To by vynulovalo pouze nultý prvek. Muselo by se napsat
    int pole[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    
    což by u velkých polí byla docela otrava ;-)
    19.6.2007 11:28 johniez | skóre: 17 | blog: xyz | Praha
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    kdepak, nuluje to vsechno, ale situaci to neresi, protoze je to jen pri deklaraci.
    michich avatar 19.6.2007 11:29 michich | skóre: 50 | blog: ohrivane_parky
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Nemáš pravdu. Inicializuje to celé pole.
    19.6.2007 11:39 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Přiznávám, že jsem si nebyl jistý. Vycházel jsem z tohoto
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N (10)
    
    int tisknipole(int *pole){
        int i;
        for (i = 0; i < N; i++){
            printf("%10d. %10d\n", i, pole[i]);
        }
        return 0;
    }
    
    int main(int argc, char** argv){
        int pole[N] = {1};
    
        tisknipole(pole);
        return 0;
    }
    
    což nainicializovalo pouze nultý prvek. Zřejmě to chápu nějak špatně.
    19.6.2007 11:43 johniez | skóre: 17 | blog: xyz | Praha
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Vsechny ktery vypises to nastavi a zbytek (pokud je pole vetsi nez pocet vypsanejch hodnot) vynuluje.
    19.6.2007 11:43 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    inicializuje se vždy tím, co uvedete a zbytek na 0.
    struct S {
      int i;
      double d;
      char c[100];
    };
    
    void foo() {
      struct S s1 = {0};
      struct S s2 = {1};
      struct S s3 = {1, 1.0};
      struct S s4[100] = {0};
    }
    
    19.6.2007 11:46 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Máte všichni samozřejmě pravdu. O tom nulování jsem to něvěděl. Takže dík :-)
    19.6.2007 12:32 Jirka | skóre: 36
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Ale to záleží na normě. Mám pocit, že C takto nuluje pole jen v normě c99. U ANSI C to tak není.
    19.6.2007 15:01 marbu | skóre: 28 | blog: hromada | Brno
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    "hezky" popsane je to treba na techto stankach k uvodu do c, (co plati pro c99 je modre)
    I think warning here is a bug. The biggest cloud service provider. There is no point in being so cool in a cold world.
    19.6.2007 11:39 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    zkuste třeba
    int pole[10] = {1, 2, 3}
    19.6.2007 02:20 trekker.dk | skóre: 71
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    ppole = &pole;
    for (a=0;a<10;a++) {
    	printf("%d:\t%d\n", a, *(ppole + a));
    	}
    Překvapuje mě, že tahle část dělá to, co se od ní očekává. Jeden by si myslel, že se do ppole uloží ukazatel na ukazatel na pole, zvlášt když gcc nadává, že

    sileny_pointry.c:11: warning: assignment from incompatible pointer type
    Quando omni flunkus moritati
    19.6.2007 08:07 rastos | skóre: 60 | blog: rastos
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    int pole[10];
    ...
    int *ppole;
    ppole = &pole;
    Vyznačený riadok je zle. Má byť

    ppole=pole;
    19.6.2007 11:59 springer | skóre: 10 | blog: engineering
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    nahlasi to sice warning ale v obou pripadech ukazuje ppole na to same ...
    kralovna Alzbeta a Stallmanuv holic diskutuji free software
    Luboš Doležel (Doli) avatar 19.6.2007 12:28 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    To se mi nezdá. pole je výraz typu int*, ale &pole je int**.
    michich avatar 19.6.2007 12:45 michich | skóre: 50 | blog: ohrivane_parky
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    &pole je typu int(*)[10].
    Luboš Doležel (Doli) avatar 19.6.2007 13:01 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Aha, to je fakt.
    19.6.2007 13:03 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    není. prostě
      int pole[10];
    
    není totéž co
      int *pole;
      pole = (int *) malloc(10 * sizeof(*pole));
    
    Luboš Doležel (Doli) avatar 19.6.2007 13:06 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    V obou případech vzniká paměťový prostor použitelný jako pole deseti int. V druhém případě se akorát musíte postarat o uvolnění sám.
    Luboš Doležel (Doli) avatar 19.6.2007 13:18 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Tak teď jsem to ozkoušel a &pole odkazuje na stejnou adresu jako pole. To jsem po pravdě netušil a připadá mi to nelogické - alespoň, že C++ vyhodí typovou chybu.
    19.6.2007 14:05 zhmulik
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    predstav si to tak, ze pole ukazuje na prvni prvek pole a &pole ukazuje na zacatek pole. prvni prvek pole je ovsem jeho zacatkem, takze pole == &pole plati.
    Luboš Doležel (Doli) avatar 19.6.2007 14:08 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Uznávám. Nikdy mě nenapadlo &pole dělat, protože jsem k tomu neviděl důvod...
    Josef Kufner avatar 19.6.2007 14:13 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Ne, pole je pointer na první prvek pole a &pole je adresa pointeru na prvni prvek pole. Tedy takto:
    
      .-------.      .------.
      | &pole | ---> | pole | ----------.
      `-------'      `------'           |
                                        v
                                      .---.---.---.- -
                                      |   |   |   |
                                      `---'---'---'- -
    
    pole == &pole platí jen a pouze tehdy, pokud pole ukazuje samo na sebe, což by vypadalo takto:
      .-------.      .------.
      | &pole | ---> | pole | -----.
      `-------'      `------'       |
          ^                         |
          |                         |
          `-------------------------'
    
    Hello world ! Segmentation fault (core dumped)
    michich avatar 19.6.2007 14:18 michich | skóre: 50 | blog: ohrivane_parky
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    &pole je adresa pointeru na prvni prvek pole
    Ne, žádný takový pointer v diskutované situaci neexistuje.
    Luboš Doležel (Doli) avatar 19.6.2007 14:22 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    To jsem si původně myslel taky :-)
    Josef Kufner avatar 19.6.2007 14:25 Josef Kufner | skóre: 67
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    tak to jsem rád, že nejsem sám :-D
    Hello world ! Segmentation fault (core dumped)
    19.6.2007 14:42 trekker.dk | skóre: 71
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Asi nás bude víc.
    Quando omni flunkus moritati
    Luboš Doležel (Doli) avatar 19.6.2007 14:48 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Ono je to svým způsobem logické. Adresu pointeru na první prvek pole získat nemůžete, protože tam žádný fyzicky umístěný pointer není - ten získávaný pointer (pole) je non-l-value.

    Každopádně bych zápis &pole raději ani nepovoloval, protože je matoucí.
    19.6.2007 12:42 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    int neni_zle() {
      int pole[10];
      return &pole == &pole[0];
    }
    
    Luboš Doležel (Doli) avatar 19.6.2007 13:13 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Není zle?
    test.cpp:6: error: comparison between distinct pointer types ‘int (*)[10]’ and ‘int*’ lacks a cast
    Porovnat můžete pole a &pole[0], výsledkem bude true.
    19.6.2007 13:49 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    řeč je snad o C, ne o C++?
    Luboš Doležel (Doli) avatar 19.6.2007 13:56 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    To je sice pěkné, ale i to C vám dá najevo, že to není úplně ok.
    19.6.2007 14:03 jekub | skóre: 8 | blog: noblog
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    reagoval jsem pouze na to, že to není špatně. ty adresy jsou si prostě logicky rovny. btw c++
    int neni_zle() {
      int pole[10];
      return reinterpret_cast< void *>(&pole) == reinterpret_cast< void *>(&pole[0]);
    }
    19.6.2007 17:31 Sinuhet
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Proc hned s kanonem na vrabce:
    int neni_zle() {
      int pole[10];
      return static_cast< void *>(&pole) == static_cast< void *>(&pole[0]);
    }
    19.6.2007 11:19 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Jestli mohu radit, vyhýbej se zásobníku. Zkus to třeba takhle:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N (100)
    
    int tisknipole(int *pole){
        int i;
        for (i = 0; i < N; i++){
            printf("%10d. %10d\n", i, pole[i]);
        }
        return 0;
    }
    
    int main(int argc, char** argv){
        int *pole;
        int i;
    
        pole = (int *) malloc(N * sizeof(*pole));
        if (!pole){
            printf("Out of memory\n");
            return -1;
        }
        for (i = 0; i < N; i++) pole[i] = i;
        tisknipole(pole);
        memset(pole, 0, N*sizeof(*pole));
        tisknipole(pole);
        free(pole);
        return 0;
    }
    
    19.6.2007 14:32 Jirka | skóre: 36
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Promiňte, ale pole se v C99 vždy do funkce předává přes ukazatel. Nelze jej předat hodnotou.
    michich avatar 19.6.2007 14:35 michich | skóre: 50 | blog: ohrivane_parky
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Nevidím, že by se tu kdokoliv snažil předat pole hodnotou.
    19.6.2007 14:40 Jirka | skóre: 36
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Ale já neříkám, že se o to snaží. Jen říká, že pokud může radit, tak by se vyhnul zásobníku a přepsal ten kód s voláním funkce a pozměněnou deklarací pole.
    19.6.2007 14:44 Jirka | skóre: 36
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Napsal jsem to dost nesrozumitelně. Jen mě zajímá ta zmínka o zásobníku, pole nejde předat na zásobník. Stejně se předává ukazatelem a je jedno jak se to zapíše. Nebo jsem možná přehlédl pointu.
    19.6.2007 15:00 trekker.dk | skóre: 71
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Možná šlo o to, aby se pole jako takové neumístilo do zásobníku, ale na haldu. I když dneska je to AFAIK skoro jedno.
    Quando omni flunkus moritati
    19.6.2007 15:12 Jan Martinek | skóre: 43 | blog: johny | Brno
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Zkuste napsat
    int pole[10000000];
    
    Dostanete segmentation fault a dost špatně se to debugguje. Navíc pole o pevné velikosti většinou plýtvá pamětí (protože se tam nacpe raději víc než míň), při požadavku na změnu velikost pole se musí překompilovávat, do toho pointeru se nedá zapsat třeba NULL (což se občas může hodit).
    Tak zhruba takovéhle důvody jsem měl na mysli.
    22.6.2007 16:47 Jirka | skóre: 36
    Rozbalit Rozbalit vše Re: C- divné nulování pole
    Tak to beru.

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.