NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:1.11.2015 16:13

Nauč se využívat debugger a pak tu nemusíš mít takové zmatené dotazy.

 
Odpovědět
1.11.2015 16:13
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na tomisoka
Michal Kuba:1.11.2015 16:20

No tak v prvním případě to počítá počet projitých argumentů a druhý je pro to prvočíslo, protože když to dám i=1 tak vše se dá dělit jedničkou, takže existuje víc jak 0 dělitelů - tudíž to není prvočíslo..

 
Nahoru Odpovědět
1.11.2015 16:20
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:1.11.2015 17:09

Jde o to, že tam máš jednu proměnnou, kterou si přepisuješ tím druhým cyklem... ;)

Nahoru Odpovědět
1.11.2015 17:09
Chyba je mezi klávesnicí a židlí.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:1.11.2015 17:40

Joo, jasně. Ať už je to céčko nebo dřív když jsem začínal s PHP tak já vždy prehlidnu nějakou takovou defacto drobnost. Jak budu zase u pc tak to opravím a snad se zase pohnu dal. :-)

 
Nahoru Odpovědět
1.11.2015 17:40
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:1.11.2015 20:12

Čím může být způsobena chyba SIGSEGV? Takhle - vše s čísly funguje, když chci zkusit ale zadat znak, vyhodí to chybu neoprávněného přístupu do paměti SIGSEGV.
Pro určení znaku mám zatím tento kus kódu, navíc se jen snažím vypsat, zda-li ho opravdu mám:

else if(isalpha(argv[i][j]))
         {
          printf("Word: %s \n", argv[i][j]);
         }
 
Nahoru Odpovědět
1.11.2015 20:12
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:1.11.2015 20:12

A na začátku mainu si definuji:

char znak;
 
Nahoru Odpovědět
1.11.2015 20:12
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:1.11.2015 20:37

daj sem celý kód - už upravený, predpokladám, že nebude úplne rovnaký ako ten čo si sem dával predtým.

Nahoru Odpovědět
1.11.2015 20:37
I'm not afraid to die on a treadmill
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:1.11.2015 20:42

Už to vypisuje, jde o to, že jsem to vypisoval jako string %s, stačilo to dát jako %c :)

Teď se spíš snažím nějak všechny ty znaky zadané v jednom argumentu nějak "slepit" dohromady jako jedno slovo.. Jdu dobrým směrem, když jsem si dal

char znak[100];

??

 
Nahoru Odpovědět
1.11.2015 20:42
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:1.11.2015 20:44

A potom se to snažím nějak vkládat do toho pole:

znak[j]=argv[i][j];
 
Nahoru Odpovědět
1.11.2015 20:44
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:1.11.2015 20:52

Ano :)

Jinak sigsegv je neoprávněný přístup do paměti.. ;)

Nahoru Odpovědět
1.11.2015 20:52
Chyba je mezi klávesnicí a židlí.
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:1.11.2015 20:53

áno, takto to môžeš spraviť, len nesmieš zabudnúť ako posledný člen poľa znak dať '\0'.
teda predpokladajme, že znak[posledne], je posledný člen, ktorému si už nejakú hodnotu zadal. Potom musiš spraviť toto:

znak[posledne + 1] = '\0';
Nahoru Odpovědět
1.11.2015 20:53
I'm not afraid to die on a treadmill
Avatar
Jozef
Člen
Avatar
Odpovídá na David Novák
Jozef:1.11.2015 20:54

On to aj sám napísal :)

vyhodí to chybu neoprávněného přístupu do paměti

Nahoru Odpovědět
1.11.2015 20:54
I'm not afraid to die on a treadmill
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Jozef
David Novák:1.11.2015 21:02

Aha :D
Já jen viděl SIGSEGV a tak jsem dál nečetl..

Nahoru Odpovědět
1.11.2015 21:02
Chyba je mezi klávesnicí a židlí.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:1.11.2015 21:05

A jak v tom cyklu řeknu, že už je poslední a má to přidat ten koncový znak? Resp. ten znak "slepuje" celé slovo argumentu?

 
Nahoru Odpovědět
1.11.2015 21:05
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:1.11.2015 21:08

napiš to prostě za ten cyklus :)

Nahoru Odpovědět
1.11.2015 21:08
Chyba je mezi klávesnicí a židlí.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:1.11.2015 21:17

No asi se mi to podařilo přidat za to, když zadám jeden znak, tak o to vypíše, ale když více, tak to vypíše pouze první..

if(znak)
             {
              znak[j+1]='\0';
              printf("Word: %c \n",*znak);
             }
 
Nahoru Odpovědět
1.11.2015 21:17
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:1.11.2015 21:24

vypisuje to jeden znak, protože tomu říkáš, že chceš jeden znak.. :D

a proč tam máš tu dereferenci? o.O

Nahoru Odpovědět
1.11.2015 21:24
Chyba je mezi klávesnicí a židlí.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:1.11.2015 21:34
  1. Je tam dobře přidaný ten koncový znak? Je to až mimo ten cyklus, takže by to mělo k tomu "j" přičíst jedničku a dát třeba 4 a ne 1.
  2. Když tam není před tím znakem * nebo něco tak to nevypisuje to co chci. Hvězdičkou to dává aspoň jeden znak :-D
 
Nahoru Odpovědět
1.11.2015 21:34
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:1.11.2015 21:35

keď už máš pole znakov null-terminated, tak používaj %s, teda

printf("Word: %s \n",znak);
Nahoru Odpovědět
1.11.2015 21:35
I'm not afraid to die on a treadmill
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:1.11.2015 21:41

jj, došlo mi potom, že vypisuju znak :-D
Jen mi to v případě čtyřpísmenného slova dá nakonec jakýsi divný znak a někdy to při pětipísmenným slovu vynechá to poslední :-D

 
Nahoru Odpovědět
1.11.2015 21:41
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:1.11.2015 21:45

to proto, že se ti nejspíš provede ještě poslední inkrementace, než podmínka skončí.
zkus dát jen znak[j] = '\0'

Nahoru Odpovědět
1.11.2015 21:45
Chyba je mezi klávesnicí a židlí.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:1.11.2015 21:47

S tímhle už to funguje.. ale myslel jsem, že tam to +1 je správně, aby se právě ten poslední znak nesmazal.. ale tím zpětným lomítkem se nestane, že by se poslední znak přemazal, že?

 
Nahoru Odpovědět
1.11.2015 21:47
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:1.11.2015 21:51

No není to zpětným lomítkem.. tím jen dáváš najevo, že tam opravdu chceš dát nulu a ne znak nula..

Hoď sem ten cyklus a zkus si ho vykrokovat.. Uvidíš, proč tam bude v tomto případě j a ne j+1

Nahoru Odpovědět
1.11.2015 21:51
Chyba je mezi klávesnicí a židlí.
Avatar
Odpovídá na Michal Kuba
Libor Šimo (libcosenior):2.11.2015 6:38

Michal, vidím, že stále tápeš v tých reťazcoch. Ak chceš prečítaj si toto: http://www.freespace.sk/…5%a1kola-r25
Je to časť o reťazcoch a zdrojom článku bola knižka od Herouta.

Nahoru Odpovědět
2.11.2015 6:38
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):2.11.2015 7:38

Vyskúšaj toto:

#include <stdio.h>
#include <ctype.h>

/**
* Funkcia skontroluje, ci retazec obsahuje iba jednu desatinnu botku,
* ak ich obsahuje viac,vrati false
* skontroluje, ci vstupny retazec obsahuje iba cislice a maximalne jednu bodku,
* ak nie, prvy odlisny znak zapise na prvu poziciu retazca
* @param vstupny retazec
* @return 1 (true) alebo 0 (false)
*/
int je_cislo(char *number)
{
    int i, point = 0;

    for (i = 0; number[i] != '\0'; i++) {
        /** spocita pocet bodiek **/
        if (number[i] == '.') {
            point++;
            /** ak je bodiek viac ako 1, return 0 **/
            if (point > 1)
                return 0;
        }
        /** ak je znak iny ako cislica alebo bodka, return 0 **/
        if (!isdigit(number[i]) && number[i] != '.') {
            return 0;
        }
    }
    return 1;
}

int main(int argc, char **argv)
{
    int i;

    for (i = 1; i < argc; i++) {
        if (je_cislo(argv[i])) {
            printf("Retazec %s je cislo.\n", argv[i]);
        }
        else
            printf("Retazec %s nie je cislo.\n", argv[i]);
    }

    return 0;
}
Nahoru Odpovědět
2.11.2015 7:38
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):2.11.2015 7:56

Malá oprava v popise funkcie.
namiesto

  • ak nie, prvy odlisny znak zapise na prvu poziciu retazca

má byť

  • ak nie, vráti false
Nahoru Odpovědět
2.11.2015 7:56
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:2.11.2015 10:47

Snažím se funkcí získat délku řetězce, ale nechce se mi to přeložit:

int strlen(char **znak)
{
 int velikost=0;
  while(znak++ !='\0')
   velikost++;
  return velikost;
}
 printf("Delka: %d\n",strlen(*znak));

Vyzkoušel jsem ještě různě ty ukazatele, ale furt to háže chybu, hlavně u toho, že do strlen vkládám znak a je tam konflikt typů :-(

 
Nahoru Odpovědět
2.11.2015 10:47
Avatar
Libor Šimo (libcosenior):2.11.2015 12:54

int strlen(char *retazec)
-
-
-
main()
{
printf("Delka: %d\n", strlen(retazec));

Nahoru Odpovědět
2.11.2015 12:54
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Michal Kuba
Libor Šimo (libcosenior):2.11.2015 12:56

To som tu už ale písal:

/** vrati pocet znakov v retazci */
int strlen(char *slovo)
{
    int velkost = 0;

    while (*slovo++ != '\0')
        velkost++;

    return velkost;
}
Nahoru Odpovědět
2.11.2015 12:56
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):2.11.2015 13:57

A tu máš funkciu na palindrom:

int je_palindrom(char * retazec)
{
    int i, velkost, pom = strlen(retazec);
    int j = pom - 1;

    for (i = 0; i < pom / 2; i++) {
        if (retazec[i] != retazec[j--])
            return 0;
    }
    return 1;
}
Nahoru Odpovědět
2.11.2015 13:57
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):2.11.2015 14:58

Výpis vstupov argumentami v konzole.

Nahoru Odpovědět
2.11.2015 14:58
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Michal Kuba:2.11.2015 15:19

Díky moc.. Já vím že jeden kód jsi už posílal, ale on mi ne a ne fungovat.. resp. když to dělám teď u sebe v IDE tak to jede, když to pak překládám na terminálu na školním serveru tak to vyhodí chybu právě u toho int strlen ale funguje to potom správně..

 
Nahoru Odpovědět
2.11.2015 15:19
Avatar
Odpovídá na Michal Kuba
Libor Šimo (libcosenior):2.11.2015 15:21

Akú chybu to vyhodí?

Nahoru Odpovědět
2.11.2015 15:21
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Michal Kuba
Libor Šimo (libcosenior):2.11.2015 15:24

Možno treba len premenovať funkciu zo strlen() na niečo iné, napr.: dlzka_retazca(). To preto, ak ten server kontroluje funkcie z knižnice string.h.

Nahoru Odpovědět
2.11.2015 15:24
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Michal Kuba:2.11.2015 15:51

Wow, měl jsi pravdu :) fungovalo to, jen tomu vadil ten název, tak jsem pro pořádek to změnil na delka_slova :-)

Díky :) Už jen udělám rozpoznání data a mám hotovo..

 
Nahoru Odpovědět
2.11.2015 15:51
Avatar
Odpovídá na Michal Kuba
Libor Šimo (libcosenior):2.11.2015 16:47

S datumom to moze byt zlozitejsie. Zalezi na jeho formate. Ak je zarucene, ze bude dd.mm.rrrr, je to jednoduche, ale ak bude moznost aj d.m.rrrr, uz musis pocitat s kazdou moznostou, teda aj s d.mm.rrrr a dd.m.rrrr.

Editováno 2.11.2015 16:48
Nahoru Odpovědět
2.11.2015 16:47
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Libor Šimo (libcosenior)
Michal Kuba:2.11.2015 18:11

bude ve formátu DD-DD-DDD (D=0-9), ale musím ještě určit i den v týdnu (Po-Ne) resp. (Mon-Sun)

 
Nahoru Odpovědět
2.11.2015 18:11
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:2.11.2015 18:24

na to ti môže byť užitočné toto: http://www.tutorialspoint.com/…n_mktime.htm

Nahoru Odpovědět
2.11.2015 18:24
I'm not afraid to die on a treadmill
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:2.11.2015 18:43

nechám si to v záloze, nejdřív udělám v cyklu rozpoznání vůbec toho formátu, zda je to tak zadané.

 
Nahoru Odpovědět
2.11.2015 18:43
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:2.11.2015 18:44

teda formát má být DDDD-DD-DD, ale to je vlastně fuk :-D

 
Nahoru Odpovědět
2.11.2015 18:44
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:2.11.2015 18:58

Lebo neviem, ako by si bez toho, čo som ti posielal, resp. niečoho podbného zistil, o aký deň sa jedná. Dostaneš zadané 17.11.1985 a ako zistíš, či to bol pondelok, utorok...? Pomocou toho čo som posielaj ti to hneď napíše

Nahoru Odpovědět
2.11.2015 18:58
I'm not afraid to die on a treadmill
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:2.11.2015 19:02

Jo, to bezesporu použiju :-)
jen musím někam do svýho kódu, zřejmě hnedka někam na začátek cyklu

if(argc > 0)
    {
        for(i=1;i < argc; i++)
        {
         for(j=0; argv[i][j] != '\0'; j++)
         {
          if(isdigit(argv[i][j]))
          {
           cislo=cislo*10 + (argv[i][j] - '0');
          }
          else if(isalpha(argv[i][j]))
          {
          znak[j]=argv[i][j];
          }
         }
         if(cislo)
           {
            for(k=2; k < cislo; k++)
            {
             if(cislo % k==0)
             {
              prvocislo=0;
              break;
             }
            }
           if(prvocislo)
           {
            printf("Number: %d (prvocislo) \n",cislo);
            cislo=0;
           }
           else
           {
            printf("Number: %d \n",cislo);
            cislo=0;
           }
           }
           else if(znak)
             {
              znak[j]='\0';
              if(je_palindrom(znak))
                printf("Word: %s (palindrom)\n",znak);
              else
                printf("Word: %s \n",znak);
             }
        }
    }

hodit podmínku, která se vykoná, pokud vstup bude ve formátu DDDD-DD-DD a pokud to nebude takový formát, tak se provedou ostatní testy isdigit nebo is alpha.. nebo to je blbost?

 
Nahoru Odpovědět
2.11.2015 19:02
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:2.11.2015 19:06

a ten dátum bude teda zadaný napr. takto: 2015-10-20 ? teda yyyy-mm-dd ? čísla oddelené pomlčkou alebo proste medzerou?

Nahoru Odpovědět
2.11.2015 19:06
I'm not afraid to die on a treadmill
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:2.11.2015 21:35

pomlčkou

 
Nahoru Odpovědět
2.11.2015 21:35
Avatar
Jozef
Člen
Avatar
Odpovídá na Michal Kuba
Jozef:2.11.2015 22:23

Tak v tom prípade to je ľahké. Keď narazíš na pomlčku, vieš, že ide o dátum. (Predpokladám, že nedostaneš vstup "Ahoj_ako" ani nič podobné)

Nahoru Odpovědět
2.11.2015 22:23
I'm not afraid to die on a treadmill
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jozef
Michal Kuba:2.11.2015 22:27

No zkusil jsem otrocky napsat toto:

if(sizeof(argv[i])==10)
            {
                if(!(isdigit(argv[i][1])) &&!(isdigit(argv[i][2])) &&!(isdigit(argv[i][3])) &&!(isdigit(argv[i][4]))&&(argv[i][5]!='-')&&!(isdigit(argv[i][6]))&&!(isdigit(argv[i][7]))&&(argv[i][8]!='-')&&!(isdigit(argv[i][9]))&&!(isdigit(argv[i][10])))
                {
                    break;
                }
                else
                {
                    for(l=0;l<10;l++)
                    {
                        printf("%s\n",argv[i]);
                        /*datum[l]=argv[l];*/
                    }

                }

            }

Jenže to nechce fungovat jak bych chtěl.. prostě to jakoby přeskočí a potom to přijde až na to, že se jedná o číslo a pomlčky to vymaže..

 
Nahoru Odpovědět
2.11.2015 22:27
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Michal Kuba
Michal Kuba:2.11.2015 23:42

tak zjištění a ověření dvojité zda-li se skutečně jedná o tvar YYYY-MM-DD jsem již zvládl, teď ještě konkrétně rozpoznat přesný den v týdnu..

 
Nahoru Odpovědět
2.11.2015 23:42
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Michal Kuba
David Novák:2.11.2015 23:54

Nemáš náhodou za chvíli deadline? :D

Jinak určitě průběžně tam nahrávej aktuální verzi, co tam máš.. Někteří cvičící ti pak dají možnost opravy na získání dalších bodů-- ale musíš tam aspoň něco už mít ;)

Nahoru Odpovědět
2.11.2015 23:54
Chyba je mezi klávesnicí a židlí.
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na David Novák
Michal Kuba:3.11.2015 0:10

Průběžně to tam nahrávám :) Odevzdáno to má být až v neděli, na obhajobu na cviku jsem aspoň částečně ready :-D

 
Nahoru Odpovědět
3.11.2015 0:10
Avatar
Odpovídá na Michal Kuba
Libor Šimo (libcosenior):3.11.2015 12:18

Ako pokračuješ?

Nahoru Odpovědět
3.11.2015 12:18
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 50 zpráv z 102.