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 17:02 | Pozvánky

Přijďte si popovídat o open source obecně a openSUSE konkrétně s dalšími uživateli a vývojáři. Oslava nového vydání openSUSE Leap se uskuteční 16. prosince od 17:00 v nových prostorách firmy SUSE v Praze. K dispozici bude nějaké občerstvení a DVD pro ty, kdo je sbírají nebo ještě mají mechaniku. Po párty v kanceláři se bude pokračovat v některé z hospod v okolí.

Miška | Komentářů: 7
dnes 14:55 | Zajímavý software

Byla vydána verze Alpha 1.0 otevřeného operačního systému pro chytré hodinky AsteroidOS. Podporovány jsou hodinky LG G Watch, LG G Watch Urbane, Asus ZenWatch 2 a Sony Smartwatch 3. Ukázka ovládání hodinek na YouTube. Jaroslav Řezník přednášel o AsteroidOS na chytrých hodinkách (videozáznam) na letošní konferenci OpenAlt.

Ladislav Hagara | Komentářů: 0
dnes 13:30 | Zajímavý software

Byly uvolněny zdrojové kódy známé rogue-like hry DoomRL. Počátky hry jsou v roce 2002. Je napsána ve FreePascalu a zdrojový kód je nyní k dispozici na GitHubu pod licencí GNU GPL 2.0. Autor pracuje na nové hře Jupiter Hell, která je moderním nástupcem DoomRL a na jejíž vývoj shání peníze prostřednictvím Kickstarteru.

Blaazen | Komentářů: 0
dnes 13:15 | Pozvánky

Přijďte s námi oslavit vydání Fedory 25. Na programu budou přednášky o novinkách, diskuse, neřízený networking atd. Release Party se bude konat 16. prosince v prostorách společnosti Etnetera. Na party budou volně k dispozici také propagační materiály, nová DVD s Fedorou 25 a samozřejmě občerstvení. Přednášky budou probíhat v češtině. Pro více informací se můžete podívat na web MojeFedora.cz. Jen připomínám, že tentokrát jsme zavedli

… více »
frantisekz | Komentářů: 0
včera 16:38 | Komunita

Byly zveřejněny videozáznamy přednášek a workshopů z letošní konference OpenAlt konané 5. a 6. listopadu v Brně. K videozáznamům lze přistupovat ze stránky na SuperLectures nebo přes program konference, detaily o vybrané přednášce nebo workshopu a dále kliknutím na ikonku filmového pásu. Celkově bylo zpracováno 65 hodin z 89 přednášek a workshopů.

Ladislav Hagara | Komentářů: 0
včera 11:30 | Komunita

Bylo oznámeno, že bude proveden bezpečnostní audit zdrojových kódů open source softwaru pro implementaci virtuálních privátních sítí OpenVPN. Audit provede Matthew D. Green (blog), uznávaný kryptolog a profesor na Univerzitě Johnse Hopkinse. Auditována bude verze 2.4 (aktuálně RC 1, stabilní verze je 2.3.14). Audit bude financován společností Private Internet Access [reddit].

Ladislav Hagara | Komentářů: 4
včera 06:00 | Komunita

Na YouTube byl publikován Blender Institute Reel 2016, ani ne dvouminutový sestřih z filmů, které vznikly za posledních 10 let díky Blender Institutu. V institutu aktuálně pracují na novém filmu Agent 327. Dění kolem filmu lze sledovat na Blender Cloudu. Videoukázka Agenta 327 z června letošního roku na YouTube.

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

Minulý týden byly vydány verze 1.2.3 a 1.1.7 webového poštovního klienta Roundcube. V oznámení o vydání bylo zmíněno řešení bezpečnostního problému nalezeného společností RIPS a souvisejícího s voláním funkce mail() v PHP. Tento týden byly zveřejněny podrobnosti. Útočník mohl pomocí speciálně připraveného emailu spustit na serveru libovolný příkaz. Stejně, jak je popsáno v článku Exploit PHP’s mail() to get remote code execution z roku 2014.

Ladislav Hagara | Komentářů: 1
8.12. 16:00 | Nová verze

Byla vydána verze 0.98 svobodného nelineárního video editoru Pitivi. Z novinek lze zmínit například přizpůsobitelné klávesové zkratky. Videoukázka práce s nejnovější verzí Pitivi na YouTube.

Ladislav Hagara | Komentářů: 1
8.12. 15:00 | Zajímavý software

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

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

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: 876×
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: 60 | 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: 60 | 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 | Švédsko
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 | Švédsko
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: 53 | 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).
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
Josef Kufner avatar 12.4.2012 23:35 Josef Kufner | skóre: 66
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: 53 | 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é.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
Josef Kufner avatar 13.4.2012 10:56 Josef Kufner | skóre: 66
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: 53 | 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á.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
12.4.2012 14:34 Marble | skóre: 27 | blog: marble | Švédsko
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: 66
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: 66
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: 66
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: 66
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: 66
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: 66
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: 66
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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ší.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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?
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 66
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: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
I tak se to dá.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 66
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: 53 | 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.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | 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ý.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
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: 53 | blog: pavlix
Rozbalit Rozbalit vše Re: "obrazek" pro kruhovy seynam v C
Canvas je metoda jak toho dosáhnout, nic víc.
GentooFedoraSCRAM – Jsem open source vývojář, nikoli markeťák ⇒ názory zde uvedené jsou jen mé vlastní.
Josef Kufner avatar 16.4.2012 01:15 Josef Kufner | skóre: 66
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: 66
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.