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í
×
    dnes 03:55 | Komunita

    Byly vyhlášeny výsledky letošní volby vedoucího projektu Debian (DPL, Wikipedie). Staronovým vedoucím zůstává Andreas Tille.

    Ladislav Hagara | Komentářů: 3
    včera 16:55 | IT novinky

    Jason Citron končí jako CEO Discordu. Od pondělí 28. dubna nastupuje nový CEO Humam Sakhnini, bývalý CSO Activision Blizzard.

    Ladislav Hagara | Komentářů: 5
    včera 14:22 | Nasazení Linuxu

    Článek na Libre Arts představuje baskytarový multiefekt Anagram od společnosti Darkglass Electronics. S Linuxem uvnitř (licence, GitHub).

    Ladislav Hagara | Komentářů: 1
    včera 10:22 | IT novinky

    Městský soud v Praze vyhlásil rozsudek, který vyhověl žalobě novináře Jana Cibulky, který s podporou spolku IuRe (Iuridicum Remedium) požadoval omluvu od státu za to, že česká legislativa nařizuje operátorům uchovávat metadata o elektronické komunikaci. To je přitom v rozporu s právem. Stát se musí novináři omluvit a zaplatit náklady řízení. Především je ale součástí přelomové rozhodnutí o nelegálnosti shromažďování dat a o

    … více »
    Ladislav Hagara | Komentářů: 6
    včera 08:22 | IT novinky

    Americké technologické firmy Apple a Meta Platforms porušily pravidla na ochranu unijního trhu, uvedla včera Evropská komise (EK). Firmám proto vyměřila pokutu – Applu 500 milionů eur (12,5 miliardy Kč) a Metě 200 milionů eur (pět miliard Kč). Komise to oznámila v tiskové zprávě. Jde o první pokuty, které souvisejí s unijním nařízením o digitálních trzích (DMA). „Evropská komise zjistila, že Apple porušil povinnost vyplývající z nařízení

    … více »
    Ladislav Hagara | Komentářů: 28
    včera 08:11 | IT novinky

    Americká společnost OpenAI, která stojí za chatovacím robotem ChatGPT, by měla zájem o webový prohlížeč Chrome, pokud by jeho současný majitel, společnost Google, byl donucen ho prodat. Při slyšení u antimonopolního soudu ve Washingtonu to řekl šéf produktové divize ChatGPT Nick Turley.

    Ladislav Hagara | Komentářů: 0
    včera 07:55 | Nová verze

    Po roce vývoje od vydání verze 1.26.0 byla vydána nová stabilní verze 1.28.0 webového serveru a reverzní proxy nginx (Wikipedie). Nová verze přináší řadu novinek. Podrobný přehled v souboru CHANGES-1.28.

    Ladislav Hagara | Komentářů: 0
    včera 07:44 | Nová verze

    Byla vydána nová verze 10.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 211 vývojářů. Provedeno bylo více než 2 800 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    23.4. 16:33 | Komunita

    42 svobodných a otevřených projektů získalo finanční podporu od NLnet Foundation (Wikipedie).

    Ladislav Hagara | Komentářů: 0
    23.4. 12:22 | IT novinky

    Americký výrobce čipů Intel plánuje propustit více než 20 procent zaměstnanců. Cílem tohoto kroku je zjednodušit organizační strukturu ve firmě, která se potýká s problémy.

    Ladislav Hagara | Komentářů: 11
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (10%)
     (21%)
     (4%)
     (1%)
     (2%)
     (0%)
     (1%)
     (2%)
    Celkem 449 hlasů
     Komentářů: 18, poslední 17.4. 12:41
    Rozcestník

    Dotaz: Snazim se pochopit pole v C a nefunguje mi program

    Bundas avatar 24.1.2014 16:27 Bundas | skóre: 14 | Pardubice
    Snazim se pochopit pole v C a nefunguje mi program
    Přečteno: 683×
    >
    
    int main(void)
    {
        int a,k,i;
        scanf("%d", &a);
        int b[2000];
        for(i = 0; i < a; i++){
            b[i];
        }
        b[i] = k;
        printf("\n%d\n", k);
        return 0;
    
    }
    
    

    Nevite proc to nefunguje? na zacatku se ma ulozit hodnota do promenne a. Potom se definuje neinicializovane pole b. Potom by se mela zapsat hodnota z promenne a do pole b a pak by se mela hodnota pole b priradit do promenne k.
    Abe the Messiah has come.

    Odpovědi

    24.1.2014 16:37 axel
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Je to uplny nesmysl, projdi si jednotlive radky a rekni si slovy, co delaji. Z toho by melo vyjit, ze napr. "b[i]" nedela vubec nic, nebo ze prochazet pole podle indexu zadanych v promenne a nema zadny vztah k tvemu zadani, ktere je ostatne popsane dost zmatecne... Pripadne si poloz otazku, kde se vzala konstanta "2000".
    Bundas avatar 24.1.2014 16:45 Bundas | skóre: 14 | Pardubice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Dej sem prosim zdrojak.
    Abe the Messiah has come.
    24.1.2014 16:58 axel
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Zdrojak ceho? Jestli neumis napsat prirazeni do promenne (coz neumis), zacni nejakym tutorialem - v tuto chvili nejsi ve stavu, abys nejake zdrojaky vybec pochopil. Coz nemyslim zle, zadny uceny z nebe nespadl, ale samostudium je zaklad, ptat se na forech na takove veci je ztrata casu vsech zucastnenych.
    25.1.2014 11:51 xxxx
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    #include <iostream>
    #include <array>
    
    using namespace std;
    
    void main(int argc, char* argv[])
    {
    	array<int, 3> arr = { 1, 2, 3 };
    	for (int i : arr) cout << i << endl;
    	system("pause");
    }
    25.1.2014 12:23 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    C?
    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    24.1.2014 17:18 potato
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Přiřazení v C má formu[*]
    lhs = rhs;
    lhs je věc, do které se přiřazuje. Normálně tedy proměnná, prvek pole nebo struktury, ..., obecně něco adresovatelného.

    rhs je hodnota, která se přiřazuje.

    Porovnej si na základě toho svoje popisy, co se má dít, s kódem. Zjistíš, že vůbec neodpovídají.

    [*] Pro puristy: coby příkaz. Přiřazení je samozřejmě výraz, takže lze přiřadit i někde uprostřed výrazu, ale tímto teď nekomplikuji.
    24.1.2014 19:13 MadCatX
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Trochu mimo soutěž, ale vzhledem k tomu, že ten zdroják obsahuje pár nelogických věcí, by ti asi pomohlo překládat to nějakým ukecaným kompilátorem. Když to totiž já přeložím já, dostanu tohle:

    GCC 4.8 -Wall -pedantic
    waste01.c: In function ‘main’:
    waste01.c:7:5: warning: ISO C90 forbids mixed declarations and code [-Wpedantic]
         int b[2000];
         ^
    waste01.c:9:2: warning: statement with no effect [-Wunused-value]
      b[i];
      ^
    waste01.c:11:10: warning: ‘k’ is used uninitialized in this function [-Wuninitialized]
         b[i] = k;
              ^
    
    Clang 3.4 -Wall -pedantic
    waste01.c:9:5: warning: expression result unused [-Wunused-value]
            b[i];
            ~ ~^
    waste01.c:11:12: warning: variable 'k' is uninitialized when used here [-Wuninitialized]
        b[i] = k;
               ^
    waste01.c:5:12: note: initialize the variable 'k' to silence this warning
        int a,k,i;
               ^
                = 0
    2 warnings generated.
    
    Měl by ses snažit, aby ti kompilátor žádné warningy nevyhazoval i při velmi drsném nastavení, co se má kontrolovat. Minimálně v tomto případě bys totiž hned viděl, že ten tvůj kód nedává moc smysl.

    Co si BTW představuješ pod pojmem "pole"? Přijde mi, že ti to není vůbec jasné...
    Bundas avatar 24.1.2014 19:32 Bundas | skóre: 14 | Pardubice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    pole si predstavuju jakou soubor cisel se stejnym nazvem a ruznou adresou
    Abe the Messiah has come.
    24.1.2014 21:48 MadCatX
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Já bych spíš řekl, že pole v C je Spojitý blok paměti obsahující objekty stejného typu. S jednotlivými prvky se zachází stejně jako s normálními proměnnými. Moc nerozumím tomu, cos myslel tím "uložit hodnotu proměnné a do pole". Ukládat se dá jen do prvků pole, ne do pole jako takového.
    Bundas avatar 24.1.2014 23:24 Bundas | skóre: 14 | Pardubice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Trochu mimo topic:

    kdyz je dvourozmerne pole int pole[1001][3] jak se da zadat vstup do toho pole?

    nebo kdyz na vstupu zadame cislo do promenne N a cislo N ma predstavovat pole[N][3]
    Abe the Messiah has come.
    25.1.2014 00:21 MadCatX
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Sorry, ale opět ten dotaz moc nechápu.
    pole[N][3] - hodnota v poli "pole" na řádku N, sloupci 3
    
    pole[N][3] = x; // Do pole "pole" přiřaď na řádek N, sloupec 3 hodnotu "x"
    
    Bundas avatar 25.1.2014 12:35 Bundas | skóre: 14 | Pardubice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    tkze kdyby bylo

    int N = 20;
    int pole[N][3];
    pole[1-N][1-3] = 3; // Do pole "pole" prirad cislo 3 na radek 1 az N, sloupec 1 az 3 hodnotu 3 

    muze to tak byt?
    Abe the Messiah has come.
    25.1.2014 13:07 Jakub Galgonek
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Ne, nemůže. Obecně nelze přiřadit hodnotu všem prvkům pole jedním přiřazením. Nejlepší asi bude pořídit si nějakou učebnici jazyka C a začít od začátku. Já osobně třeba začínal s Heroutem (http://www.kopp.cz/www/cz/607-vyrobek-ucebnice-jazyka-c).
    25.1.2014 13:12 MadCatX
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Nemůže a to hned ze dvou důvodů. Jednak indexy pole v C nesmí být záporné a druhak staticky alokované pole (to, co operátor [] vyrobí) nemůže mít proměnnou velikost, takže použít jako délku pole nekonstantní proměnnou není přípustné.

    Přiřadit hodnotu více prvkům v poli najednou nelze, na to je třeba použít cyklus.
    25.1.2014 13:18 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    staticky alokované pole (to, co operátor [] vyrobí) nemůže mít proměnnou velikost, takže použít jako délku pole nekonstantní proměnnou není přípustné

    V tomhle případě to projde, protože ta alokace se provádí až za běhu. Neprošlo by to u globální proměnné nebo kdyby pole bylo static. Použije se ale samozřejmě aktuální hodnota N v okamžiku té inicializace.

    Jardík avatar 26.1.2014 21:46 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Imho když dop*dele někho chcu učit C v roce 2014, proč ho neučím C11 či alespoň C99 (15 let starý standard), ale musím se z nějakýho důvodu držet kravin, co vám vtloukali do hlavi v jeslích. imho index samozřejmě záporný být může, C99 §6.5.2.1/2 stanoví:
    The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
    
    Klidně můžete napsat i 50[mojepole]. Souhlasím, žě nemusíme mást (česky?) začátečníka, ale taky mu nemusíme lhát. A jeho pole je něco, čemu se nadává VLA a je naprosto v souladu s C99, C11 pak tuto "featuru" stanoví jako volitelnou (když není dostupné, musí být definováno __STDC_NO_VLA__).
    Přiřadit hodnotu více prvkům v poli najednou nelze, na to je třeba použít cyklus.
    Když se chce, tak jde i toto :-)
    Věřím v jednoho Boha.
    27.1.2014 08:07 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Taky neříkáš všechno:

    int N = 20;
    int pole[N][3];     /*int pole[20][3]    */
    pole[1-N][1-3] = 3; /*pole[-19][-2] = 3; */
    
    Tedy zápis mimo alokovaný prostor.

    Záporné indexy mohou fungovat takto, ale že by to byla zrovna začátečnická praktika…

    int pole[3] = {0,1,2};
    int *ptr = &pole[2];
    printf("%d,%d,%d",pole[0],pole[1],pole[2]);
    printf("%d,%d,%d",ptr[-2],ptr[-1],ptr[0] );
    

    To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
    25.1.2014 13:13 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program

    Ne. Nevymýšlejte si, prosím, svou vlastní syntaxi. Četl jste snad někde něco o tom, že jako index pole můžete napsat rozsah, navíc se znakem, který obvykle znamená odečítání? Překladač není člověk a nebude hádat, co jste tím asi tak mohl myslet. To, co jste napsal, by ve skutečnosti znamenalo

      pole[-19][-2] = 3
    

    Pokud chcete naplnit celé pole, musíte to udělat cyklem:

      int i, j;
    
      for (i = 0; i < N; i++)
        for (j = 0; j < 3; j++)
          pole[i][j] = 3;
    
    nebo pokud překladač podporuje C99 syntaxi
      for (int i = 0; i < N; i++)
        for (int j = 0; j < 3; j++)
          pole[i][j] = 3;
    
    Bundas avatar 25.1.2014 19:45 Bundas | skóre: 14 | Pardubice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    co kdyz na vstupu program dostane 2 radky a na kazdem radku 123123 ruznych cisel?

    jak se to da zapsat do pole cisla[2][123123]?
    Abe the Messiah has come.
    25.1.2014 20:19 potato
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Úplně stejně. Akorát normální programátor v C nebude nikdy vytvářet statické pole cisla[2][123123], ale paměť dynamicky alokuje z haldy.
    26.1.2014 01:32 lertimir | skóre: 64 | blog: Par_slov
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Takhle, že se budeš ptát na chybné programy, se to naučit nejde. Z těch příkladů je zcela jasně vidět, že naprosto nevíš, co se v tom jazyku děje. Potom i otázky jsou v podstatě nesmyslné a nedá se na ně odpovědět. Vezmi si dobrou knihu o C a tu si přečti, udělej všechny příklady, a porozumíš tomu jazyku. Já jsem se před mnoha lety učil z Programovací jazyk C - Kernighan, Brian W.; Ritchie, Dennis M. Což má tu výhodu, že jsou to autoři jazyka C a vyložili ho vynikajícím způsobem. Všichni také říkají, že Herout Učebnice jazyka C, je také výborná kniha, ale tu jsem nečetl. A v téhle chvíli zapomeň na pole. Při práci s polemi je C mnohem blíže assembleru než skoro jakýkoliv jiný jazyk, který jsi potkal (ať je to pascal, java, nebo co jsi zkoušel). Nejdříve zvládni pointry, protože tak se realizuje to pole. V nějaké proměnné máš adresu do paměti, kde jsou další data. Dokud neporozumíš jak nastavit (inicializovat), co je v pointru a kam má ukazovat, aby to bylo správně, nezabývej se polem, protože pole je jen konstantní pointer.

    A k té otázce: Co to znamená "co kdyz na vstupu program dostane 2 radky..."? Je to myšleno podprogram/funkce dostane v parametrech? Pak podprogram dostane pointr na pole o dvou prvcích, každý z těchto prvků obsahuje pointr na adresu paměti (začátek prostoru) o velikosti 123123 objektů (a záleží jestli je to objekt int, short, long, float). Protože v tom jediném pointru, který podprogram dostane, není žádná informace o rozměrech, musí dostat dalšími parametry počet řádku a sloupců. A pak se po prostoru pole může pohybovat.

    Nebo je to myšleno, že program dostane datový proud na STDIN? Pak si na to musí udělat/alokovat místo, načíst data a opět se pointry dostane, kam potřebuje.
    26.1.2014 12:11 sad
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Já bych jako první knihu o C bych doporučil Učebnici jazyka C od Herouta, protože programování učí. Kniha Programovací jazyk C Kernighan, Ritchie mi přijde spíše jako referenční příručka pro lidi, kteří už umí programovat. V Heroutovi je lépe vysvětlen oddělený překlad a dynamická alokace paměti, u KR je malloc zmíněn jen okrajově. Herout upozorňuje na to, že enter zůstává načten v bufferu, což je u KR pravděpodobně vinou zastaralosti opomíjeno a má to za následek to, že správně nefunguji i ty nejjednodušší příklady na getchar, a matoucí může být i testování getchar na EOF. Heroutova Učebnice obsahuje rozmanitější příklady, není tak roztahaná a nezáživná jako KR, srovnává C s Pascalem, takže člověk dostane základy i jiného jazyka. Takže pro začátečníka bych skutečně doporučil toho Herouta a pak, když už začal s C, ať se pustí do C++, algoritmů, datových struktur a knihovny závislé na tom, co chce programovat. Ale podotýkám, že nejsem moc dobrý programátor, takže možná píši kraviny.
    26.1.2014 22:19 potato
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    Obě knihy, K&R a Herout jsou dobré. Ani jedna není úplně ideální. K&R je už dnes trochu moc historická (psát dnes v C99 by už neměla být žádná exotika, není-li tedy člověk v zajetí MSVC). Herout je zase taková přeučovací příručka pro pascalisty (to pro mne kdysi bylo ideální, ale dnes už Pascal nevládne výuce informatiky).

    Celkově ale asi jakákoli učebnice, která slušně vysvětluje C, by měla postačovat k pochopení syntaxe a ukazatelů -- a aby tazatelovy programy přestaly být snůškou náhodných, a často i syntakticky pochybných konstrukcí, a obsahovaly nanejvýš normální chyby, nad kterými už lze smysluplně diskutovat.
    24.1.2014 20:21 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    int main(void)
    {
        int a,k,i;                // tři proměnné int neinicializované
        scanf("%d", &a);          //přečteme číslo a uložíme proměnnou do "a"
         int b[2000];             // neinicializované pole 
        for(i = 0; i < a; i++){   //provedeme cyklus několikrát pokud bude a>i
            b[i];                 //zde nic neděláme nemá to význam
        }                         //konec cyklu                   
        b[i] = k;                 //neinicializovanou proměnnou přečteme a zapíšeme do pole někam kam ukazuje proměnná i čili zapisujeme buhví co a bůh ví kam
        printf("\n%d\n", k);      //vypíšeme nesmysl co je v neinicializované proměnné k
        return 0;                 //konec
    
    }
    
    Co takhle si nejdříve něco přečíst Programování v jazyce C
    24.1.2014 22:05 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
        b[i] = k;                 //neinicializovanou proměnnou přečteme a zapíšeme do pole někam kam ukazuje proměnná i čili zapisujeme buhví co a bůh ví kam
    

    To není tak úplně pravda, bezprostředně po skončení cyklu bude mít proměnná i hodnotu a. Že to nedává smysl, protože pravá strana je neinicializovaná a levou pak nikdy nepoužijeme (a nedávalo by to smysl ani obráceně, protože levá strana také není inicializovaná), to už je jiná kapitola.

    Musím říct, že tady mne tazatel dostal. Většinou u špatně napsaného programu aspoň tuším, co měl autor na mysli. Tady se naprosto neodvažuji hádat; podobné pocity jsem měl při čtení zdrojáku z úlohy 6 tady.

    martin-ux avatar 24.1.2014 23:52 martin-ux | skóre: 18 | Bratislava
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    otazne je, co nie je uplne pravda. pretoze ak a >= 2000, tak ten comment je presny - nevieme co zapisujeme nevieme kam (resp. vieme kam, ale nevieme co prepisujeme).
    ..when you do things right, people won't be sure you've done anything at all..
    25.1.2014 00:48 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: Snazim se pochopit pole v C a nefunguje mi program
    To samozřejmě ano, ale takové věci má IMHO smysl začít řešit až tehdy, když ten program bude dávat aspoň trochu smyslu.

    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.