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í
×
včera 02:20 | Zajímavý článek

David Revoy, autor open source webového komiksu Pepper&Carrot nebo portrétu GNU/Linuxu, upozorňuje na svém blogu, že nový Inkscape 0.92 rozbíjí dokumenty vytvořené v předchozích verzích Inkscape. Problém by měl být vyřešen v Inkscape 0.92.2 [reddit].

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

Øyvind Kolås, hlavní vývojář grafických knihoven GEGL a babl, které využívá grafický program GIMP, žádá o podporu na Patreonu. Díky ní bude moci pracovat na vývoji na plný úvazek. Milník 1000 $, který by stačil na holé přežití, se již téměř podařilo vybrat, dalším cílem je dosažení 2500 $, které mu umožní běžně fungovat ve společnosti.

xkomczax | Komentářů: 12
21.1. 23:54 | Pozvánky

DevConf.cz 2017, již devátý ročník jedné z největších akcí zaměřených na Linux a open source ve střední Evropě, proběhne od pátku 27. ledna do neděle 29. ledna v prostorách Fakulty informačních technologií Vysokého učení technického v Brně. Na programu je celá řada zajímavých přednášek a workshopů. Letos je povinná registrace.

Ladislav Hagara | Komentářů: 0
21.1. 22:11 | Nová verze

Byla vydána verze 1.0.0 emulátoru terminálu Terminology postaveného nad EFL (Enlightenment Foundation Libraries). Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
20.1. 17:00 | Nová verze

Byl vydán Docker 1.13. Přehled novinek na YouTube a v poznámkách k vydání na GitHubu. Docker umožňuje běh aplikací v softwarových kontejnerech (Wikipedia).

Ladislav Hagara | Komentářů: 4
20.1. 15:51 | Komunita

Mozilla.cz informuje, že nástroje pro webové vývojáře se možná oddělí od Firefoxu a stanou doplňkem. Nástroje pro webové vývojáře prošly velkým přepisem a tým, který se stará o jejich vývoj, by uvítal možnost jejich častějších aktualizacích nezávisle na vydávání nových verzí Firefoxu.

Ladislav Hagara | Komentářů: 10
20.1. 07:00 | Humor

Čtenářům AbcLinuxu vše nejlepší k dnešnímu Dni zvýšení povědomí o tučňácích (Penguin Awareness Day).

Ladislav Hagara | Komentářů: 0
20.1. 06:00 | Komunita

Bylo spuštěno hlasování o přednáškách a workshopech pro letošní InstallFest, jenž proběhne o víkendu 4. a 5. března v Praze. Současně byla oznámena změna místa. InstallFest se letos vrací zpět na Karlovo náměstí do budovy E.

Ladislav Hagara | Komentářů: 0
20.1. 02:48 | Komunita

Greg Kroah-Hartman potvrdil, že Linux 4.9 je jádrem s prodlouženou upstream podporou (LTS, Long Term Support). Podpora je plánována do ledna 2019. Aktuální jádra s prodlouženou podporou jsou tedy 3.2, 3.4, 3.10, 3.12, 3.16, 3.18, 4.1, 4.4 a 4.9.

Ladislav Hagara | Komentářů: 0
20.1. 00:11 | Zajímavý článek

Výrobce síťových prvků, společnost Netgear, spustila nový program, který slibuje vývojářům, expertům, ale i běžným uživatelům vyplacení finanční odměny za nalezení bezpečnostních chyby v jejich produktech. Za nalezení zranitelnosti v hardware, API nebo mobilní aplikaci nabízí odměnu od 150 do 15 tisíc dolarů (dle závažnosti).

Michal Makovec | Komentářů: 0
Jak se stavíte k trendu ztenčování přenosných zařízení (smartphony, notebooky)?
 (10%)
 (2%)
 (74%)
 (3%)
 (10%)
Celkem 363 hlasů
 Komentářů: 25, poslední 21.1. 13:34
Rozcestník
Reklama

Dotaz: cyklus while a podivne spravanie

13.12.2005 19:55 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
cyklus while a podivne spravanie
Přečteno: 89×
mam strasne neprijemny problem ktory ma brzdi pri zadani do skoly a preto hladam pomoc...neviem akym zazrakom ale ked tento program pustim a zadam 'b' tak mi do premennej pocet ulozi 1...avsak ked ten cyklus bezi dalej tak mne z neznameho dovodu premennu pocet vynuluje.. :(
#include malloc.h
#include stdio.h
#include stdlib.h
typedef struct {
  char meno[10];
  char priez[20];
  int oscislo;
  char znamka;
} STUD;

void vlozStud(int *pocet) {
  (*pocet)++;
}
  

int main() {
  
  int pocet;
  char vyber;
  
  pocet=0;
	
  STUD *student;
  student=(STUD *) malloc(1*sizeof(student));
  
 
  printf("%d\n",pocet);
  while (vyber!='x') { 
    scanf("%s",&vyber);
    if(vyber=='b') vlozStud(&pocet);
    printf("%d",pocet);
  }
  
  printf("%d",pocet);
  
  return (0);
}
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."

Odpovědi

13.12.2005 20:00 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
zabudol som ze pracujem v Anjute pod linuxami a najhorsie je ze pod win to ide :(
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
David Watzke avatar 13.12.2005 20:07 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Nehodí kompilátor nějakej warning? Nepíšou se includy mezi < a >?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
13.12.2005 20:09 zabza | skóre: 52 | blog: Nad_sklenkou_cerveneho
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
no to je jasný, jenže zkus si to zadat na ABCLinuxu s těma < a > ... :-)
13.12.2005 20:18 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
No a na co jsou asi nad polem pro zadávání příspěvku tlačítka '<' a '>'? Pro ty línější nabízím pomůcku, kterou jsem kdysi vyrobil kvůli starému redakčnímu systému Intervalu, ale hodí se i zde.
13.12.2005 20:21 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
hmm....ospravdlnujem sa to som si nevsimol ... :)
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
13.12.2005 20:08 zabza | skóre: 52 | blog: Nad_sklenkou_cerveneho
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
hint: kterým znakem končí v c-čku stringy?
13.12.2005 20:22 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
hmm...no nerozumiem resp. asi neviem na to vobec odpoved
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
Martin Tůma avatar 13.12.2005 21:10 Martin Tůma | skóre: 38 | blog: RTFM | Praha
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie

Snažíš se zapsat řetězec na místo znaku. I když z klávesnice zadáš jenom "b", tak funkce scanf("%s", &vyber) na adresu &vyber uloží "b\0" (C-čkové řetězce jsou zakončeny znakem "\0"). A ten nulovej znak přepíše něco, co už nepatří k tomu charu. (V tvém případě proměnnou pocet)

To, že na windows to funguje je způsobený pravděpodobně "zarovnávánim" proměných v paměti, který provádí překladač - zapisuješ někam, kde by stejně nic nebylo.

Každý má právo na můj názor!
13.12.2005 20:14 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
  scanf("%s",&vyber);

Tak takové věci si raději hodně rychle odvykněte. Termín buffer overflow už jste slyšel? Tohle by byla sebevražda i kdyby proměnná vyber nebyla typu char.

13.12.2005 20:23 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
ok beriem a budem pamatat ale ako to ma byt spravne? resp. ako to riesit??
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
David Watzke avatar 13.12.2005 20:24 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Jak to má být správně? Takhle to je i v učebnici... no, v jiném spojení.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
13.12.2005 20:27 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Máte pointer na proměnnou typu char a na místo, kam ukazuje, zkopírujete zadaný řetězec. Takže prvním znakem naplníte tu proměnnou a zbytkem přepíšete pár bytů za ním. Když budete mít štěstí, bude to pár jiných proměnných. Když ne, mohou se začít dít podivuhodné věci… V případě tazatele to zřejmě odnesla proměnná pocet, která se nacházela na zásobníku hned nad vyber.
13.12.2005 20:39 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
hmm...ok tak prosim ako to zapisat spravne? ale inak len tak mimo ze to pod win ide a to ma tiez hneva lebo pod win sa mi moc ten program pisat nechce...resp. nemam to cim prelozit a v com pisat...prosim dalo by sa navrhnut nejake riesenie konkretne presny zapis? inak ked tam dam namiesto scanf("%s",&vyber) scanf("%c",&vyber) tak mi to nevynuluje premennu pocet ale ten cyklus ide vzdy dvakrat namiesto toho aby si zakazdym vypytal zadat znak...
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
13.12.2005 20:48 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Asi byste si měl nejdřív zjistit, co vlastně děláte. Tedy nastudovat si z jakékoli učebnice jazyka C něco o tom, jaká je standardní reprezentace řetězců v jazyce C, co je to pointer a co dělá funkce scanf(). Bez toho to nepůjde a pokud si toto nastudujete, bude vám hned jasné, v čem je problém. Fórum vám může pomoci s konkrétním problémem, ale základy jazyka si musíte nastudovat sám.
13.12.2005 21:10 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
no mne je jasne to ze pod windowsackym compilerom to ide tak preto ma zaujima v com je problem....mne je jasne co je pointer aj co robi scanf ale ked mi nieco nejde tak skusam a vidim ze to pod win ide :(
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
13.12.2005 21:25 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Na začátku cyklu proměnná "vyber" není inicializována, takže je celkem náhoda, že to nějak funguje. Dále, "vyber" nesmí být "char", ale "pointer na char", tedy
char *vyber;
No a když je to takhle inicializováno, tak je potřeba paměť naalokovat
int N = 20;
vyber = (char *) malloc (N * sizeof(char));
a po použití uvolnit
free(vyber);
Přičemž NIKDY nepoužívej scanf() tak jak jsi to zapsal. Když už to mermomocí musíš napsat právě takto, tak aspoň
scanf ("%19s", vyber);
Abys omezil možnost buffer-overflow.
13.12.2005 22:05 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
ok dakujem velmi pekne skusim .....ale aj tak ma zaraza ze pod win to v poho funguje...a ze nie je inicializovana to som len zabudol moja chyba ale mam to tam.. :)
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."
13.12.2005 22:27 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
To, že to ve windows funguje, je opravdu náhoda. Každá platforma je trochu jiná. Céčko je trochu zrádné v tom, že špatně napsaný program někdy funguje, jindy zase ne, chová se "záhadně" v závislosti na ledasčem a dost špatně se hledají chyby.

Kdo s Céčkem teprve začíná, tak má dvojnásob složitou situaci. Jednak tápe, ale také používá "školské" ukázkové příklady, které jsou paměťově nenáročné a všechno se odehrává v zásobníku. Tam vznikají pravé záhady.

Zatímco když hrábneš někam daleko do paměti, která není tvoje, tak tě systém hned odstřelí a člověk hned ví, na čem je (teda někdy).

No nic, zkus tohle řešení:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>

typedef struct {
  char meno[10];
  char priez[20];
  int oscislo;
  char znamka;
} STUD;

void vlozStud(int *pocet) {
  (*pocet)++;
}


int main() {
  
  int pocet, N = 20;
  char *vyber;
  STUD *student;
  
  pocet=0;
	
  student=(STUD *) malloc(1*sizeof(student));
  vyber = (char *) malloc(N*sizeof(char));
 
  printf("%d\n",pocet);
  
  while(1){ 
    scanf("%19s", vyber);
    if (!strcmp(vyber, "x")) break;
    if (!strcmp(vyber, "b")) vlozStud(&pocet);
    printf("%d",pocet);
  }
  
  printf("%d",pocet);
  free(student);
  free(vyber);
  return (0);
}
(Chtěl jsem napsat ten program slušněji, ale to už bych ho příliš měnil.)
14.12.2005 08:27 Martin
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Tak zkuste ten svůj původní program spustit pod windows a místo jednoho písmenka jich zadejte najednou třeba dvacet a vsadil bych se že ten program spadne i pod windows, protože si něco přepíšete.

Nebo zkuste mezi
int pocet;
char vyber;

vložit nějakou proměnou, kterou dále v programu nijak nepoužijete (doufám, že ji kompilátor bez optimalizace nevyhodí, pokud ano, tak ji nějak nesmyslně použijte, aby zůstala v tom programu zachována). A spusťte program pod linuxem a zadejte jedno písmenko a program najednou bude chodit v pořádku.

14.12.2005 11:59 oxymoron | skóre: 16 | blog: oxymoron | Bratislava
Rozbalit Rozbalit vše Re: cyklus while a podivne spravanie
Dakujem vsetkym velmi pekne za odpovede :)
Born to be root ... :-D | "..žebrák není ten, kto svobodu si získal, z toho se stává král.."

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.