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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 2
dnes 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 0
dnes 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 1
dnes 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
dnes 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
včera 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
včera 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
včera 15:16 | Komunita

Na GOG.com začal zimní výprodej. Řada zlevněných her běží oficiálně také na Linuxu. Hru Neverwinter Nights Diamond lze dva dny získat zdarma. Hra dle stránek GOG.com na Linuxu neběží. Pomocí návodu ji lze ale rozběhnout také na Linuxu [Gaming On Linux].

Ladislav Hagara | Komentářů: 1
včera 13:14 | Bezpečnostní upozornění

Byla vydána verze 2.7.1 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Řešeno je několik bezpečnostních problémů. Aktualizován byl především Tor Browser na verzi 6.0.7. Tor Browser je postaven na Firefoxu ESR (Extended Support Release) a právě ve Firefoxu byla nalezena a opravena vážná bezpečnostní chyba MFSA 2016-92 (CVE-2016-9079, Firefox SVG Animation

… více »
Ladislav Hagara | Komentářů: 0
30.11. 19:19 | Nová verze

Příspěvek na blogu nadace Raspberry Pi je věnován bezpečnostním vylepšením v nejnovější verzi Raspbianu s desktopovým prostředím PIXEL. V oficiálních obrazech je nově zakázán SSH přístup. Ten lze samozřejmě povolit po zavedení Raspbianu pomocí nástroje raspi-config. Nemá-li uživatel k Raspberry Pi připojený terminál, může SSH přístup povolit vytvořením souboru ssh v adresáři /boot. Raspbian nově upozorňuje uživatele na bezpečnostní riziko, je-li SSH přístup povolen a uživatel pi nemá změněno výchozí heslo.

Ladislav Hagara | Komentářů: 42
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 755 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

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: 1285×

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