abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    včera 22:00 | IT novinky

    Společnost OpenAI představila svůj nejnovější AI model GPT-4o (o jako omni, tj. vše). Nově také "vidí" a "slyší". Videoukázky na 𝕏 nebo YouTube.

    Ladislav Hagara | Komentářů: 0
    včera 15:44 | Zajímavý článek

    Ondřej Filip publikoval reportáž z ceremonie podpisu kořenové zóny DNS. Zhlédnout lze také jeho nedávnou přednášku Jak se podepisuje kořenová zóna Internetu v rámci cyklu Fyzikální čtvrtky FEL ČVUT.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | IT novinky

    Společnost BenQ uvádí na trh novou řadu monitorů RD určenou pro programátory. První z nich je RD240Q.

    Ladislav Hagara | Komentářů: 11
    včera 13:00 | IT novinky

    Byl aktualizován seznam 500 nejvýkonnějších superpočítačů na světě TOP500. Nejvýkonnějším superpočítačem nadále zůstává Frontier od HPE (Cray) s výkonem 1,206 exaFLOPS. Druhá Aurora má oproti loňsku přibližně dvojnásobný počet jader a dvojnásobný výkon: 1,012 exaFLOPS. Novým počítačem v první desítce je na 6. místě Alps. Novým českým počítačem v TOP500 je na 112. místě C24 ve Škoda Auto v Mladé Boleslavi. Ostravská Karolina, GPU

    … více »
    Ladislav Hagara | Komentářů: 0
    včera 10:11 | Nová verze

    GHC (Glasgow Haskell Compiler, Wikipedie), tj. překladač funkcionálního programovacího jazyka Haskell (Wikipedie), byl vydán ve verzi 9.10.1. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    včera 09:22 | Nová verze

    Po 9 týdnech vývoje od vydání Linuxu 6.8 oznámil Linus Torvalds vydání Linuxu 6.9. Přehled novinek a vylepšení na LWN.net: první a druhá polovina začleňovacího okna. Později také na Linux Kernel Newbies.

    Ladislav Hagara | Komentářů: 2
    11.5. 18:22 | Nová verze

    Byla vydána verze 0.2.0 v Rustu napsaného frameworku Pingora pro vytváření rychlých, spolehlivých a programovatelných síťových systémů. Společnost Cloudflare jej letos v únoru uvolnila pod licencí Apache 2.0.

    Ladislav Hagara | Komentářů: 0
    10.5. 19:11 | Nová verze

    Open source RDP (Remote Desktop Protocol) server xrdp (Wikipedie) byl vydán ve verzi 0.10.0. Z novinek je vypíchnuta podpora GFX (Graphic Pipeline Extension). Nová větev řeší také několik bezpečnostních chyb.

    Ladislav Hagara | Komentářů: 16
    10.5. 04:11 | Nová verze

    Rocky Linux byl vydán v nové stabilní verzi 9.4. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    9.5. 22:22 | Bezpečnostní upozornění

    Dellu byla odcizena databáze zákazníků (jméno, adresa, seznam zakoupených produktů) [Customer Care, Bleeping Computer].

    Ladislav Hagara | Komentářů: 22
    Podle hypotézy Mrtvý Internet mj. tvoří většinu online interakcí boti.
     (72%)
     (6%)
     (10%)
     (12%)
    Celkem 223 hlasů
     Komentářů: 15, poslední včera 21:33
    Rozcestník

    Dotaz: "obrazek" pro kruhovy seynam v C

    tomes.io avatar 12.4.2012 11:17 tomes.io | skóre: 12 | blog: tomesh
    "obrazek" pro kruhovy seynam v C
    Přečteno: 910×
    Ahoj,

    potreboval bych poradit, jak nejjednodusseji a nejelegantneeji zvolit implementaci "obrazku" pro kruhovy seznam (ten uz mam napsany).

    Obrazkem se rozumi predem neznamy pocet radku, do kterych se vklada jakykoliv znak ze vstupu.

    Oficialni zadani zni: "Obrázek je jakýkoliv textový vstup, který má stejně dlouhé řádky, přičemž každý řádek je zakončený znakem nového řádku."

    Napriklad:
    ***           <->
    ***           ---
    ***   nebo :  <-> 

    Tyto obrazky se ukladaji do kruhoveho spojoveho seznamu, ktery mam uz vytvoreny. Otazka zni, jak nejjednodusseji naiplementovat "objekt" obrazku?

    Napadaji me dve moznosti, jak nejlepe nacist a hlavne VYPSAT obrazek:

    1) dvourozmerne mallocovane pole. 2) jednosmerny linearni seznam.

    Obe moznosti budou v sobe mit hodne mallocu, rad bych to mel podle zasady KISS a premyslim, zda by to neslo udelat jeste jinak.

    P.S.: o nedynamicky alokovanem stacku ani neuvazuju :)

    Řešení dotazu:


    Odpovědi

    12.4.2012 12:53 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Vstup je text. Takže jednotlive riadky by som reprezentoval ako stringy. Jeden string - jeden malloc. Pocte stringov asi nie je vopred známy, takže musia ísť do nejakej dynamickej štruktúry - napr. linkovaný zoznam. Dĺžka stringu nie je vopred známa, takže buď odhadneš nejakú hornú hranicu, alebo súbor budeš čítať na dva prechody pričom v prvom len zistíš dĺžku riadku, alebo implementuješ nejaký adaptívny alogritmus, ktorý napr. načíta 1kB a ak je riadok dlhší, tak naalokuje 2kB a skúsi znova, atď atď.
    tomes.io avatar 12.4.2012 13:09 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    No tak to je vpodsate to, co me taky napadlo, viz moznost 1 a 2. ale prijde mi to jako jit s kanonem na vrabce :)
    12.4.2012 14:48 rastos | skóre: 62 | blog: rastos
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ďalšia varianta je načítať ten súbor celý (jeho veľkosť zistiť cez ftell() resp. lseek()). A môžeš sa dynamickým štruktúram vyhnúť celkom a alokácie budeš potrebovať asi tak dve.
    tomes.io avatar 12.4.2012 17:26 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Program nebude nacitat soubor, ale uzivatelsky vstup!
    12.4.2012 20:04 l4m4
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Najděte deset rozdílů.

    Nebo alespoň jeden...
    12.4.2012 20:06 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ale no tak ... :) Block versus character device? Co třeba ten seek tak pro začátek?
    12.4.2012 20:15 l4m4
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Napiš jednou funkci pro načtení vstupu, která by se zde smysluplně použila a nelze ji napsat pomocí souborového API, ať už se streamy nebo filedeskriptory.

    Kde je napsáno, že v každém souboru lze volně seekovat?

    Block a char device... A z leda se ozývá volání: adresář a named pipe... Proč? Těžko říci.
    12.4.2012 21:14 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Konkrétně linuxové tty neumožní mmap ani SEEK_END, které by se tu daly využít pro eliminaci reallocování.

    Uznávám, že by to měl být spíš rozdíl seekable a non-seekable fd, ale ono to dost koreluje s tím, co se většinou implicitně čeká od stdin a souboru.

    pavlix avatar 12.4.2012 23:19 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ta realokace je vcelku jednoduchá a dá se dělat buď po stejně velkých blocích (jestliže máš přibližnou představu o velikosti vstupu), nebo může růst exponenciálně (pokud tu představu nemáš). Vcelku běžná věc. Počet (re)alokací je pak logaritmický vůči délce vstupu (přičemž základ, neboli velikost úvodní alokace, určuješ ty).
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    Josef Kufner avatar 12.4.2012 23:35 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    V dokumentaci ke Qt píšou, že ten jejich QVector jak roste, tak zdvojnásobuje reallokace pouze do doby než dojde na velikost stránky paměti a pak pokračuje právě tak, aby vždy přidal jednu stránku. Ve výsledku to prý zvládá v konstantní složitosti, neboť není třeba vždy překopírovávat pole, stačí jen přimapovat další stránku virtuální paměti... (ale to jen tak na okraj).
    Hello world ! Segmentation fault (core dumped)
    pavlix avatar 13.4.2012 10:42 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ale to už je docela černá magie, protože to zřejmě funguje jen u jednoho velkého pole. Ale jako bonus hezké.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 13.4.2012 09:00 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jakych 10 rozdilu?? Tak jinak. Ty znaky proste bude zadavat uzivatel do stdin. nebudou se zkratka cist ze souboru. Takze pripadaji v uvahu fce typu scanf... ja uz nevim jak jinak to rict...
    pavlix avatar 13.4.2012 10:36 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    scanf je na tohle úplně k ničemu. Osobně doporučuju jít buď nízkoúrovňovou (POSIX) cestou přes read, nebo vysokoúrovňovou cestou přes nějakou knihovnu, která obsahuje funkci na načtení celého souboru (to by měla zvládat třeba glib.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    Josef Kufner avatar 13.4.2012 10:56 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Napsat to správně s nízkoúrovňovým read není zrovna triviální záležitost Je tam hodně skrytých zádrhelů.

    GNU scanf v tomto případě může být užitečné:
    char *buffer;
    if (fscanf(stdin, "%a[^\n]", buffer) == 1) {
      /* read ok */
    }
    Tohle načte z stdin vše až po '\n', ale je to nestandardní rozšíření GNU C knihovny.
    Hello world ! Segmentation fault (core dumped)
    pavlix avatar 13.4.2012 11:05 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Napsat to správně s nízkoúrovňovým read není zrovna triviální záležitost Je tam hodně skrytých zádrhelů.
    Například?
    GNU scanf v tomto případě může být užitečné:
    Mýlíš se. V tomto případě je scanf kanónem na vrabce, který dělá úplně zbytečné věci. Pozři manuálovou stránku funkce fgets, která je k tomu, co píšeš narozdíl od scanf určená.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    12.4.2012 14:34 Marble | skóre: 27 | blog: marble
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Mno, a jak zjistíš délku řádky předtím, než ji načteš? Stejně potřebuješ něco jako realloc. (Anebo jej za tebe udělá "a" GNU rozšíření scanf, ale to už je celkem jedno.) Prostě budto věřit tomu, že je malloc/realloc rozumně napsaný a alokovat pamět po krocích (ideálně dle heuristiky na základě znalostí o čtených datech), anebo si napsat vlastní memory managment na nějakém větším předalokovaném bloku. :) (To druhé nemyslím tak úplně vážně.)

    Sekání do spojového seznamu (anebo jakékoliv jiné blbnutí se vstupem) by mělo záviset především na tom, co s těmi daty budu následně dělat. Pokud budu do "obrázků" třeba "kreslit" úsečky, je řádkový seznam dost nesmyslný přístup a bude mnohem lepší mít jeden souvislý buffer pro celý obrázek a stranou uložené rozměry.

    V případě jiného zpracování dat může být výhodný řádkový seznam, v jiném případě třeba ještě něco úplně jiného.
    tomes.io avatar 12.4.2012 17:13 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    S obrazkem se pak uz nic nedela. Nacte se do struktury kruhoveho seznamu, ktery obrazek zobrazi, tedy vytiskne na obrazovku. Kruhovym seznamem ze pak toci doleva nebo doprava a zobrazuje se aktualni obrazek. Cili po nacteni obrazku se s nim uz nijak nepracuje, je pasivni.

    Delku radku predem praveze nezjistim, ale vic nez 2*32-1 radku mit nebude zejo :)
    Josef Kufner avatar 12.4.2012 19:26 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Pracuje se s ním, ale nemění se. Kdyby se s ním nepracovalo, tak ho nemá smysl načítat.
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 12.4.2012 19:38 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ano, myslel jsem to tak, ze se s nim pracuje, ale nemeni se.

    No asi nejcistsi reseni se jevi linearni seznam co jsem stvoril:

    
    typedef struct _node {
    
     struct _node* pNext;  
     char array[32];   
     int len;              
    } Node;
    
    int main() {
        
        char name[32];
        Node *head = NULL;
        
        int len;
    
        while(1){
          
          gets(name);
          len = strlen(name);
          
          if (len == 0)
              break;
          
          else{
    
          // dynamic allocation of single structure (heap)
          Node* newNode = malloc(sizeof(Node));  
          strcpy(newNode->array, name);
          newNode->len = strlen(name);
          
          
          newNode->pNext = NULL;
          //newNode->pPrev = NULL;  
    
          if(head == NULL) 
          {
              head = newNode;
              continue;
          }
    
          
          Node* pNode = head; 
          while(pNode->pNext != NULL){
              pNode = pNode->pNext;
    
          }
          
          pNode->pNext = newNode;
          
          }
          
        }
       
    
        Node* pNode = head;
        // Print
        while(pNode != NULL)
        {
          printf("%s\n", pNode->array);
          pNode = pNode->pNext;
        }
    
       
        // Free
        pNode = head;
        Node* pNextNode;
        while(pNode != NULL)
        {
          pNextNode = pNode->pNext;
          free(pNode);
          pNode = pNextNode;
        }
    
        return 0;
    }
    
    Josef Kufner avatar 12.4.2012 19:56 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Je úplně jedno, jak jsi to myslel, důležité je, co jsi napsal. Počítač číst myšlenky neumí a mě to je jedno.

    Napřed si napiš funkce, které manipulují s tím seznamem. Budou mít sice jen pár řádek, ale nebude to takový bordel.

    Nepoužívej gets(), nemá ošetřené přetečení bufferu.

    Přečti si man k fgets():
    RETURN VALUE
       gets()  and  fgets() return s on success, and NULL on error or when end
       of file occurs while no characters have been read.
    Není třeba dělat strlen():
    while((fgets(...)) != NULL) { ... }
    Zbytečně to kopíruješ ještě jednou po načtení. Proč to nenačteš přímo tam, kde to chceš mít?

    Nekontroluješ úspěšnost malloc(). Při nedostatku paměti ti to pochybně zhučí.
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 13.4.2012 08:57 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ok, nepouzivat gets, tedy to musim prohnat pres scanf...? PAc jina moznost me nenapada. Chapu dobre, ze radis pouzivat fgets? Ale ten prece podle manualu nacita ze souboru, tady bude data zadavat uzivatel ze stdin...
    tomes.io avatar 13.4.2012 09:10 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    ...aha, tak misto *FILE lze pouzit promennou stdin ze stdio.h...to uz pouziti fgets smysl dava
    Josef Kufner avatar 13.4.2012 10:58 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    fgets().
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 13.4.2012 14:45 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Tak jo, zkusil jsem to s fgets(). Chapu, ze s touto fci muzu nacitat do bufferu dokud nebude delka radku 0. pak si asi muzu cely buffer vypsat pomoci fputs analogicky.

    takze jse podle toho napsa nasledujici kod, kde se mi ale while porad vyhodnocuje kladne, takze loop neskonci pri novem radku... co jsem prehlidl?
    int main(void)
    {
    
        char *buffer;
    
        if ((buffer = (char *) malloc (32 * sizeof(char))) == NULL){
    
            printf("Neni volne misto\n");
        }
    
        else{
    
            while (fgets(buffer, 32 , stdin) != NULL ) {
    
            }
    
            fputs(buffer, stdout);
    
        }
    
    return 0;
    
     }
    tomes.io avatar 13.4.2012 17:10 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Aha, tak ukoncit smycku bych s fgets() mohl jen s EOF. Nicmene EOF nemuzu pouzit, protoze v zadani je napsane, ze nacitani "obrazku" skonci po nacteni prazdneho radku. Takze asi budu muset precijen pouzit strlen()... nic jineho me nenapada...
    Josef Kufner avatar 15.4.2012 13:29 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    if (buffer[0] == '\0') {
      break;
    }
    Hello world ! Segmentation fault (core dumped)
    Řešení 1× (Jan Drábek)
    Josef Kufner avatar 12.4.2012 14:31 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Koukni na man 3 vsprintf. Je tam ukázka použití realloc, s lehkou modifikací to můžeš použít pro načtení prvního řádku a pak vlastně i všech dalších, jen si ulož délku, ať ten realloc nevoláš zbytečně dokola.

    Druhou možností je použít jednorozměrný buffer a seznam offsetů, kde začínají nové řádky (pokud je potřebuješ).

    Prostě číst, jak ti to přijde, neřešit konce řádek a nacpat to do jednoho stringu. Pokud ti přijde '\n', tak si můžeš poznamenat do druhého pole jeho pozici + 1 a na jeho místo uložit '\0'. Takže když pak budeš chtít 5. řádek, uděláš:
     char *paty_radek = buffer[offset[5]];
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 12.4.2012 17:27 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jsem zapomnel zduraznit, ze obrazek se nacita z uzivatelskeho vstupu, tedy nejake scanf nebo gets...
    tomes.io avatar 12.4.2012 18:34 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Tohle je prvni nastrel, v podstate udela, co chci (krome osetreni stejne delku vstupu): nacita vstup od uzivatele, po entru se prepne na novy radek. Pokud je vstup prazdny a Enter, tak vytiskne obrazek, jenze program skonci s nenulovou hodnotou. Proc? Mam spatne vycisteni pameti?

    int main(void)
    {
    char **jmeno = (char **) malloc ((MAX) * sizeof(char*)) ;
    // char **seznam;
    int i = 1;
    char name[32];
    //char *obr;
    int size;
    int len;
    int j;
    int pom = 0;
    
    
       do {
       jmeno[i] = (char *) malloc (32 * sizeof(char));
       //scanf("%s", name);
       gets(name);
       len = strlen(jmeno[i]);
       
       i++;
       pom++;
    }while (len != 0 );
    for(j = 1 ; j <= i; j++){
       printf("%s\n", jmeno[j]);
    }
    
    
     if (jmeno){
    
                for (i=0; i < i; i++){
                     free(jmeno[i]);
                     jmeno[i]= NULL;
                }
    
                free(jmeno);
                jmeno = NULL;
    
            }
    
    
    return 0;
    }
    Josef Kufner avatar 12.4.2012 19:32 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    indent -kr -i8 -l120 -sob
    Když už píšeš jak prase, tak to aspoň urovnej před zveřejněním.
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 12.4.2012 19:46 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Chtel bych videt prase, ktere takovy kod napise po dvou mesicich uceni se C... nez budu psat elegantne vypadajici kody, tak to jeste nejakou chvili potrva. Nevim, jake byly tve zacatky, ale rekl bych, ze pokud nejsi od narozeni genius, taky jsi psal jako prase. mozna by ses mohl pochlubit svym prvnim programem ;)

    ale ano mas pravdu, budu si davat pozor a pred odeslanim kod ucinit co nejvice citelnym,
    Josef Kufner avatar 12.4.2012 20:30 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Je mi líto, nemám poruce mechaniku na 5.25" diskety a to nejstarší, co jsem našel (8. třída ZŠ), už bylo hezky formátované.
    Hello world ! Segmentation fault (core dumped)
    martin-ux avatar 12.4.2012 21:33 martin-ux | skóre: 18 | Bratislava
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    vidis, a toto si mal v BASICu "vyriesene" :) .. ale moje kazety uz asi nenajdem :/
    ..when you do things right, people won't be sure you've done anything at all..
    13.4.2012 14:32 mlz
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    1/ Použijte fgets

    2/ Pole začínají od 0

    3/ Není deklarováno MAX a ošetření přetečení
    tomes.io avatar 13.4.2012 23:43 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Timhle docela jednoduchym kodem, jsem docill vicemene pozadovaneho cile, jeste dosetrim prekroceni velikosti bufferu reallocovanim, nicmene, porad premyslim jak ukoncit nacitani prazdnym radkem. fgets ukoncuje EOF... strlen v tomto pripade jaksi nefunguje...
     
    
    int main()
    { 
       char mystring [32];
       char buffer[1024];
         
         while(fgets(mystring, 32, stdin) != NULL ){
             
             strcat(buffer, mystring); 
         } 
       
       puts(buffer);     
       return 0;
    }
    pavlix avatar 13.4.2012 23:45 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    fgets ukoncuje EOF
    V dokumentaci se píše něco jiného.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 14.4.2012 00:15 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    "Reads characters from stream and stores them as a C string into str until (num-1) characters have been read or either a newline or the End-of-File is reached, whichever comes first."

    Ok, takze novy radek nebo EOF. Proc se tedy muj cyklus po nevlozeni znaku a odentrovani neukonci?
    14.4.2012 00:52 Voransky | skóre: 8 | Český Krumlov
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    If end-of-file is encountered and no characters have been read into the buffer, the buffer's contents remain unchanged and a null pointer is returned

    Pokud správně chápu, NULL se vrací pouze při dosažení EOF, takže v cyklu by se mělo testovat načtení konce řádky a z toho vyplývající break...
    pavlix avatar 14.4.2012 10:53 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ok, takze novy radek nebo EOF. Proc se tedy muj cyklus po nevlozeni znaku a odentrovani neukonci?

    Protože dokumentace popisuje, kdy se ukončí funkce fgets, ne kdy se ukončí cyklus. Ona to totiž není dokumentace k tvému kódu, ale dokumentace k té funkci.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 14.4.2012 11:43 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ano, chapu. No... a nejaky konkretni napad jak v mem kodu otestovat nacteni prazdneho radku? Dala by se na to vyuzit nejaka standardni funkce? Strlen je v tomto konkretnim kodu uz vzdy 1... zatim me tady bylo vicemene nadavano, ale potreboval bych nejaky konstruktivni hint :)
    14.4.2012 15:44 Zadejte vaše jméno
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Kdyz fgets() nacte prazdny radek zapise do mystring \n, pak je mozne pouzit budto funkci strcmp() ktera porovnava retezce, nebo zkontrolovat jestli je nulty prvek v poli mystring \n...
    pavlix avatar 15.4.2012 08:52 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Ano, chapu. No... a nejaky konkretni napad jak v mem kodu otestovat nacteni prazdneho radku?
    Přímo v načtených datech.
    zatim me tady bylo vicemene nadavano
    Na tohle si dávej pozor, občas si lidi tady takto stěžují a myslí to doslova.
    ale potreboval bych nejaky konstruktivni hint :)
    fgets, pokud nevrátí NULL, načte do bufferu právě jeden řádek zakončený LF (newline, 0x0a). Nebo poslední řádek nezakončený LF (pokud LF chybí), ale to u korektního vstupu neřešíš.

    A ty máš k dispozici pointer na paměť, kam to fgets načítá. Takže po načtení řádku máš pointer na paměť, která po řadě obsahuje dva bajty LF a NUL (0x0a, 0x00). Buď můžeš testovat, že pointer ukazuje na LF, nebo že pointer+1 ukazuje na NUL, nebo že délka řetězce je 1. První mi přijde nejjednodušší a nejrobustnější.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 15.4.2012 15:40 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Diky ted je mi naprosto jasne. Odkrokoval jsem si jednotlive radky v debuggeru, kde jsem to pekne videl, co se kam zapisuje... Takze myslim, ze toto reseni je nejlepsi. Bez zbytecnych mallocu.. vse nahrat do bufferu jako jeden radek.

    Takze k predchozimu kodu, ktery jsem ukoncoval EOF stacilo pripnout jednoduse do smycky:

    if (mystring[0] == '\n') break;

    A problem solved :)
    pavlix avatar 15.4.2012 18:00 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Bez zbytecnych mallocu.. vse nahrat do bufferu jako jeden radek.
    Tak otázka je, kde chceš na ty data získat paměť a kolik. Pokud nevíš při psaní, jak velká data budou (což obvykle nevíš), je potřeba mallocem za běhu získat správný kus paměti. Pokud navíc při prvotní alokaci stále neznáš velikost, je potřeba realokovat.

    Takže bych volání malloc až tak nezatracoval :). Ale jinak gratuluju.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 15.4.2012 22:23 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    MNo, jeste jsem zapomnel na jednu "malickost". Budu potrebovat cist radky z buferu, Radek za radkem. Moc nerozumim resp, nevim jak implementovat tu radu:
    Druhou možností je použít jednorozměrný buffer a seznam offsetů, kde začínají nové řádky (pokud je potřebuješ).

    Prostě číst, jak ti to přijde, neřešit konce řádek a nacpat to do jednoho stringu. Pokud ti přijde '\n', tak si můžeš poznamenat do druhého pole jeho pozici + 1 a na jeho místo uložit '\0'. Takže když pak budeš chtít 5. řádek, uděláš:

    char *paty_radek = buffer[offset[5]];
    fce puts() mi vytiskne celu buffe zaraz. ja potrebuju tisknou radek po radku.

    tomes.io avatar 15.4.2012 22:25 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    resp vytisknout radek, nevo provest a pa kzase vytisknout radek. JE to proto, ze musim tisknout 3 obrazky z kruhoveho seznamu soumerne, a ty jeste zarovnavat podle jejich velikosti. fce puts() poto pouzit nemuzu.

    Plan je takovu, z budu tisknout-vykreslovat 3 obrazky radek po radku. to jen aby bylo jasno, proc to chci. Asi budu muset pouzit fci strchr, ale nejak nerozimim, jak pracovat s temi offsety
    pavlix avatar 15.4.2012 22:37 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Já takovéhle věci fakt neřeším. Pokud pracuju s IO, používám read a write, řeknu si, kolik toho chci poslat a hotovo.

    K čemu to potřebuješ vypisovat řádek po řádku? Vždyť jsi psal, že je to obrázek, ne?
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 15.4.2012 22:57 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jake read a write? Takove fce at hledma jak hledam, tak pro C nenachazim (www.cplusplus.com)...

    je to "obrazek" viz uplne prvni post tohoto threadu. proste nejaky blok znaku. Ty jsou nahravany do kruhoveho seznamu, kazdy blok tvori jeden obrazek. Seznam tak tvori "obrazkovou galerii" kterou jde rotovat tak, ze se zobrazuji vzdy tri obrazky.

    Noa kdyz si kazdy obrazek nactu do bufferu, pole, ktere je prvkem seznamu, tak abych je mohl zobrazit vedle sebe, potrebuju je nejak vukreslit vedle sebe. pokud si je vytisknu standardne jako prvky seznamu, tak se mi zobrazi pod sebe.

    Ja je potrebuju mti vedle sebe, viz zelezadani zde:

    http://cecko.eu/public/pictgallery_2012
    tomes.io avatar 15.4.2012 23:04 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    ja uz vim, pouziju strchr(), ktera mi najde '\n', buffer si ulozim do pomocne promenne, za '\n' budu postupne vkladat nuly a vypisovat tak jednotlive prvky.
    Josef Kufner avatar 15.4.2012 23:50 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Na read a write zapomeň (viz man stdio.h, man unistd.h). cplusplus.com je relativně dobrý web, ale je o C++ a ty jsi ještě ani nezvládl C. Doporučuju koupit a přečíst Učebnici jazyka C od Herouta (podle ní to zvládne i dítě na druhém stupni ZŠ).

    Z toho, co je v téhle diskusi už bys měl mít hotové načítání. Neřeš nic, jen udělej, že jeden obrázek je v jednom stringu, který normálně obsahuje '\n'. Tedy tak, jako ho dostaneš na vstupu.

    Implementuj si spojový seznam nebo jakou datovou strukturu to tam máš mít a do té si dej ty obrázky (stringy).

    Vykreslení obrázků udělej tak, že si alokuješ kreslicí buffer, říkejme mu canvas. Velikost canvasu bude odpovídat rozměrům všech oddělovačů a obrázků plus několik znaků '\n' (za každý řádek včetně posledního) plus jeden '\0' na konci. Celý canvas naplníš nějaým ošklivým znakem, který se v obrázcích moc nevyskytuje (memset), pak na konec dáš ukončovací '\0' a na násobky šířky dáš '\n'. Takže když uděláš puts(canvas), tak to vypíše hromadu těch ošklivých znaků ve tvaru, který by měl mít výsledný výstup.

    No a teď už to je snadné, prostě vezmi jeden obrázek po druhém a znak po znaku ho kopíruj na canvas. Když narazíš na '\n', tak pošoupneš ukazovátko na správné místo o řádek níž. Tohle je jen o správném udržování proměnných x a y v jednom foru přes řetězec obrázku a o převodu [x, y] na pozici ve výstupním stringu (i = x + y * (šířka + 1)).

    Na konec uděláš jen ten puts(canvas) a máš hotovo.

    Dobře si to rozčleň na několik funkcí, aby jsi se v tom vyznal.

    Může se to zdát jako zbytečné, alokovat si celý canvas, ale je to přesně tak, jak to dělají grafické programy, jen si ten canvas naalokují v grafické paměti (víceméně).
    Hello world ! Segmentation fault (core dumped)
    pavlix avatar 16.4.2012 00:26 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    I tak se to dá.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 16.4.2012 00:29 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Diky za tip, rano se na to mrknu.

    Jinak Herouta mam oba dily, v soucasnosti mam projity dil prvni a sorry, to NEZVLADNE nikdo bez dalsich zdroju. Didakticky ta ucebnice ma dost mezery, zejmena v tom, ze mnohe ukoly na konci lekce vyzaduji znalost toho, co se jeste neprobiralo. V lepsim pripade se to clovek docte o nejakou kapitolu dal, v horsim pripade to nenajde vubec. Pokud by mel clovek k dispozici jen Herouta, tak C proste neda. Priklady v nem jsou dost jednoduche, povrchni. Vadi mi srovnani s Pascalem, ktery jsem nedelal.

    Ja smaozrejme Herouta pouzivam jako vychoziho, ale k tomu si musim dohledavat info z manualu, webu, for atd., protoze v Heroutovi toho proste spousta chybi. Treba ten linearni seznam. Je tam jen vysvetlen jednoduchy linerani a konec. Clovek bez predchozi znalosti jakehokoliv programovaciho jazyka si proste nedomysli slozitejsi propojeni struktur, pokud neni genius :) A to ja nejsem. Ucim se C intenzivne (v podstate nekolik hodin denne) pouhe dva mesice. Takze o, co je pro mnohe z vas samozrejme, ja musim teprv objevovat a slozite dohledavat.
    Josef Kufner avatar 16.4.2012 01:11 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jsem důkazem toho, že zvládnout se to dá. Tehdy jsem si před C jen chvíli hrál s QBasicem. Měl jsem 386 na 33 MHz se 102MB HDD a 8MB RAM. Jediný další materiál o C byla vestavěná nápověda v IDE od Borlandu (a to jsem tehdá angličtinu zrovna moc neovládal). O Pascalu jsem se dozvěděl až z té Učebnice jazyka C (a vůbec se mi nelíbil). Úkoly jsem tam snad žádné nikdy nedělal. Četl jsem to jak pohádku od začátku do konce a občas si něco zkusil.

    Ale zachovej klid, dva měsíce jsou prd.
    Hello world ! Segmentation fault (core dumped)
    pavlix avatar 16.4.2012 00:21 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jake read a write?
    Posixové funkce pro vstup a výstup. Najdeš v posixovém a linuxovém manuálu...
    $ man 3 read
    $ man 2 read
    $ man 3 write
    $ man 2 write
    
    tak pro C nenachazim (www.cplusplus.com)...
    Njn, na tohle to asi nebude dobrý zdroj.
    Noa kdyz si kazdy obrazek nactu do bufferu, pole, ktere je prvkem seznamu, tak abych je mohl zobrazit vedle sebe, potrebuju je nejak vukreslit vedle sebe. pokud si je vytisknu standardne jako prvky seznamu, tak se mi zobrazi pod sebe.
    To pak jo. No hele, kdybych to chtěl mít efektivní, nejspíš použiju POSIX funkce. Kdybych to chtěl mít ANSI, tak se zase nebudu bát v cyklu použít getc/getchar a putc/putchar a nesrat se s tím.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 16.4.2012 00:31 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Tohle musi byt praveze ANSI, musi to byt prenositelny... takze musim pracovat jen se standardnimi knihovnami...
    pavlix avatar 16.4.2012 00:36 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    No tak tím je to dané. Ale getc a putc fungují vždycky plus ten nápad z canvasem je hezký.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    tomes.io avatar 16.4.2012 00:45 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    No ja si nejsem jisty, jeslti ten canvas odpovida tomu, co po nas chteji v zadani:
    http://cecko.eu/_media/public/pictgallery_2012_navod.png
    pavlix avatar 16.4.2012 00:51 pavlix | skóre: 54 | blog: pavlix
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Canvas je metoda jak toho dosáhnout, nic víc.
    Já už tu vlastně ani nejsem. Abclinuxu umřelo.
    Josef Kufner avatar 16.4.2012 01:15 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jeden canvas na tom obrázku to od řádku ">r" po řádek ">s" (celkem 3 řádky).
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 16.4.2012 09:12 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Jenomze delka obrazku je ruzna... obrazek muze mit vysky treba 10 radku, durhy obrazek 2...cili canvas by musel byt promenlivy podle vysky nejvyssiho obrazku v galerii...coz mi prijde dost narocne na me implementovat..

    asi nejlepsi bude vypisovat prvni tri obrazky radek po radku
    Josef Kufner avatar 16.4.2012 09:41 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    Canvas není proměnlivý, ty si ho jen alokuješ jednou podle toho, jak veliké obrázky tam budeš mít, vykreslíš je a pak ho zahodíš.
    Hello world ! Segmentation fault (core dumped)
    tomes.io avatar 16.4.2012 11:42 tomes.io | skóre: 12 | blog: tomesh
    Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
    No, vzhledem ktomu ,ze deadline pro odevzdani ukolu je dneska, tak se to pokusim vyresit tim tisknutim radek po radku. Ten canvas nestihnu, to je na me zatim celkem slozity, tak rozvinutou abstrakci, abych to hned z fleku pochopil, jeste nemam, to bych si musel rozkreslit a poradne promyslet, abych to pochopil, ale jelikoz se dalsi ukol tyka prave vykreslovani (tentokrat nejakeho bludiste) tak se mi tvuj napad urcite bude hodit, pac bych to mohl pouzit. Ted me ovsem tlaci cas. Takze diky vsem moc.

    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.