C Ahoj, prosím dokázal by mi někdo poradit, jak ošéfovat tuto magickou chybu "two or more data type" potřebuji na začátek do funkce nacpat to E a nejspíše mi něco uniká :D Předem moc díky :)
Máš tam include všeho potřebného? (stdarg.h a stdio.h)
jasné v error.h
Mě se to přeloží i běží bez problémů
Super, aspoň vím, že to funguje :D Také mě napadlo, že by to mohlo být překladačem .. co tam používáš za parametry při překladu po GCC ?
Spustil jsem to narychlo přes Code::Blocks, ale s "gcc -o test main.c" to taky frčí :D mám verzi 5.4.0
Super, jdu to vyzkoušet a kodit a kodit :D Díky moc :)
C Neni tu nejakej Cckar/Cckarka co se nudi? Na neco bych se rad zeptal :) danke (edit: genderova vyvazenost)
c jakto, ze tento kus kodu probehne bez chyboveho hlaseni o pristupech do pameti? https://ctrlv.cz/pE1J funguje to pro 999 999 cyklu nejvic, pak segmentation fault zkouseno na merlin, eva. Na obou bez chyb http://pastebin.com/i837PScQ
https://ctrlv.cz/pE1J
Valgrind ti tyto chybné přístupy vypíše všechny. A jestli zadáváš na příkazové řádce při spouštění tohoto ručně 999 999 argumentů, tak asi máš hodně volného času :D
no, tech uz jsem nebral z argc :D ale tak jaktoze to zapise dobre i precte? zapise to spravne hodnoty a precte to taky spravne v printf
Malloc ti může reálně přidělit místo pár bytů klidně i celý blok paměti, kam můžeš zapisovat i číst, ale minimálně o velikosti dané mallocem. Proto to jede v těch případech.
ok, to dava smysl, dik (y)
malloc(0) ti vrati pointer, ktory je bud NULL, alebo je to validny pointer, ktory ale nemozno dereferencovat. To co ty robis nie je vobec koser. Ten pointer zjavne ukazuje do nejakej alokovanej pamate, ktora ale nie je urcena na to, aby tam hocikto zapisoval. Ta pamat je urcite sucastou nejakej stranky, k segfault zjavne dojde az ked sa snazis zapisat mimo tuto stranku (pripadne nejaku suvislu sekvenciu stranok).
Zobrazit všechny odpovědi (1)
me je prave jasne, ze toto neni koser, bez reallocu, ale prave proto jsem nechapal, kdyz to fungovalo
akym sposobom si tomu nastavil tych 999 999 cyklov?
Zobrazit všechny odpovědi (1)
strtol argvp[1]
Malloc s arumentem sizeof (int) ti vrátí adresu v paměti, kterou ti vyhradi pro přesne jeden int, takže nemáš žádné pole (nemůžeš napsat ptr [] ) ale můžeš pouze zapisovat ten jeden int Viz: *ptr = 42; To že ti bylo umožněno přepsat dalších N int-bajtovych části paměti je zvláštní a nebezpečných
Zobrazit všechny odpovědi (2)
no to ja vim :D proto se tu ptam, jakto, ze je to vubec mozne.. A slo to i na merlinovi i na eve
merlin hm..ale na eve by som to necakal, ta je prisnejsia na alokaciu.. :D
C [Funkce isdigit()] Ahoj, prosim o radu zkusenejsi programatory. Je normalni, ze mi funkce isdigit() vraci hodnotu 2048, pokud je dany znak cislice? Vsude na internetu jsem nasla, ze ma vracet TRUE, prip. 1, tak nevim, jestli je to uplne normalni :D Diky za radu :)
To asi jo, jen jsem to mela napsane trosku jinak a delalo mi to problemy, tak jsem to zkoumala a prisla jsem na to, ze jednicku teda fakt nevraci.
je to preto že c nepozná bool (true/false). tak ak isdigit() je true vráti nenulovú hodnotu.
Zobrazit všechny odpovědi (3)
Stdbool.h :)
Dávid Bolvanský no áno ale ani po použití tejto knižnice nebude vracať true a false.
to ano, len ak niekto preferuje booleany namiesto return 0/1 tak moze pouzit stdbool.h
Aha, tak super, dekuju :)
manuálové stránky jsou nejlepší přítel programátora... hned po tužce a papíru ^^ Smrčka je nezmiňoval jen tak
Zobrazit všechny odpovědi (3)
v nasem rocniku tam tehdy nekdo hodil cele zadani 3. projektu a nechal si ho tam vyresit... dont do that
ZP projekty su trivialne ked uz sa clovek nauci kodit v Ccku, je dobre sa ta naucit uz teraz, a nie az na zlozitejsich predmetoch ktore vas stretnu v letnaku (IOS2), resp v druhaku (IFJ, IAL, ...). Odporucam si vsetko pekne nastudovat a nenechat stack overflow riesit za vas (ako zdroj informacii je SO super).
Jakub Chlebík nemyslim tak ze ti to niekto vyriesi ale ze stackoverflow je skvely zdroj informacii ked ti nieco nefunguje
Kdyby náhodou někoho zajímal konkrétní důvod, proč isdigit() vrací 2048 - je to proto, ze isXYZ funkce v ctype.h fungují tak, že někde je definována tabulka s maskami pro každý znak; něco jako: int ctypes[256] = { ... masky pro kazdy znak }; a samotná isdigit() funkce může vypadat pak takto: int isdigit(int c) { return ctypes[c] & DIGIT_FLAG; } kde DIGIT_FLAG má hodnotu 2048. Pokud v ctypes[c] je nastavený flag DIGIT_FLAG, po vymaskování (operátorem &) s DIGIT_FLAG dá opět DIGIT_FLAG. Pokud nastavený není, výsledek po vymaskování je 0.
Můžu se prosím zeptat, nač používáte isDigit, když to pokud vím přijímá stejně jeden char? Není lepší třeba kontrolovat rovnou ASCII hodnotu?
Nevim proc, zadnou vyhodu v tom asi nevidim. Proste jsem ji pouzila :D
for cyklus a isdigit = celkem dobrá kombinace :D
Tak do for cyklu se da zapracovat i ta ASCII hodnota
myslím že kódování je krásnej příklad toho, kde není jen jedno správný řešení ;) takže je fuk jak se k tomu dopracuješ, dokud to dělá to co má a není to zbytečně dlouhé ;)
Ono je to nakonec asi stejně jedno :) Záleží spíš na tom, jestli chceš udělat Smrčkovi radost a opravdu vše v prvním projektu udělat sám, nebo využít již hotových řešení v povolených hlavičkových souborech (tuším ctypes).
Zobrazit všechny odpovědi (1)
Radost mu tím určitě neuděláš. Proč programovat něco co už někdo jiný napsal?
Ja už to mám cele hotové až na 1 vec. Neviem ako porovnať číslo s INT_MAX a zistiť či je vetšie ako intmax. Neviete niekto ako to urobiť ?
Zobrazit všechny odpovědi (2)
Inkludni climits.h a normálně to porovnej s INT_MAX ... :D
Máš namysli zjistit, jestli se číslo vejde do dat. typu integer? vzít výsledek výrazu jako unsigned a porovnat ho s polovinou max. hodnoty unsigned int. je třeba se zamyslet nad správným přiřazením. unsigned int INT_MAX = 0; INT_MAX--; long INT_REAL = INT_MAX/2; rozsah int bude -(INT_REAL+1) až INT_REAL btw něco bude asi i v limits.h
C UNIX GNU socket procesy Proces MAIN běží ... vy něm je vytvořený socket, už se na něm poslouchá. při accept se vytvoří fork() proces A a mimo jiné se mu předá informace o všech otevřených soketech. MAIN běží ve smyčče mezi listen() a accept() a vytváří nové a nové procesy B, C, D, E, ... každý z těchto procesů má seznam s FD socketů a snaží se dát write() na všechny existující sockety se zprávou typu "Jsem proces C a žiju". PROBLÉM: forknutý proces může psát pouze do socketů které vznikly dřív než on. při procesech A B C D A nemůže psát nikomu (sama sobě si nepíšou) B jen A C jen A a B D všem A, B, C při pokusu A write() do C hodí write() chybu -1. OTÁZKA: To ty sockety jsou nějak chráněné či co? Kde může být chyba? Jak z toho ven?
Odporucam pozorne precitat manualove stranky fork-u. Hlavne cast o zdielani file descriptorov. Akonahle zavolas fork, tak vznika kopia procesu. File descriptory otvorene v jednom z procesov po forku nebudu validne v tom druhom.
Aha, myslel jsem že mi stačí pouze posílat FD ... podobně jak pointer - když ho máš, ať jsi kdokoliv, můžeš číst. Myslel jsem že bude jen problém někde s oprávněním. Nějaký nápad co s tím?
No, hlavne zvazit ci je potrebne aby tie procesy o sebe navzajom vedeli. A ak teda nutnie musia, tak by som pouzil ich parent ako taky multiplexer na komunikaciu. V podstate by si tam vytvoril nieco ako zbernicu. Pripadne vyuzit unix domain sockety a zase pomocou ich parenta ustavit spojenie medzi 2 procesmi. Pripadne si aj rozmysliet, ci je fork nutny, ci by neboli lepsie thready, alebo iny druh IPC. Ale neviem co presne sa snazis dosiahnut, takze ma napadaju len genericke riesenia.
skús nepoužiť processy, myslím že to nieje najlepšie riešenie, použi radšej ako spomenul Marek Milkovič thready (pthread_t) a nebudeš mať problémy s unix právami a komunikáciou medzi processmy
Zkusil jsem ty vlákna ... asi to bude jedno z možnách řešení ale nedokáži je zprovoznit natolik že ani nerozumím chybám které mi gcc vrací ... , vše je tam typu pthread_t nebo void nebo void* a vlastně asi pořádně nechápu jak s tím pracovat. tedy nic pro mě. podíval jsem se na teorii ke komunikaci mezi fork()nutými procesy, třeba přes pipe. To ale předpokládá naslouchání a blbě se naslouchá 2 věcem naráz v sekvenčním programu. Takže buď mě osvítí nějaká spásná myšlenka nebo se na to vykašlu :(
myslím že to máš zle navrhnuté, malo by to fungovať server-client, procesy ktoré forkuješ majú prístup len k svojmu accepnutému socketu (len na server, main), server ktorý acceptuje connectiony má prístup ku všetkým clientom ... ty sa snažíš zapisovať na client-client socket a máš problémy ..
server - řekněme MAIN pouze naslochá a když někdo promuví, forkne se, aby člověk mohl mluvit a on sám dál naslouchat. pak se sejde pár lidí, ale ti chtějí mluvit mezi sebou, ne s procesem. Takže proces koukne do tabulky socket FD a zprávu kterou dostal upraví (přidá značku) a pošle na všechny ostatní výstupy které komunikují s lidmi. koncept? easy though. Provedení se trochu zaseklo ...
tí "ludia" nemôžu komunikovať medzi sebou, pretože o sebe nevedia, o nich vie len server (main) ktorý tú tabulku vytvoril, možno ti pojde zapisovať do tých socketov lebo to máš na jednej machine ale cez network prístup ku všetkým socketom nemáš, server by mal mať teda pre každý socket jeden process alebo thread na ktorom bude počúvať zo client socketu a keď dostane nejaký message, prepošle ho všetkým v tabulke
no MAIN proces a fork()nuté procesy by spolu mohly komunikovat třeba přes pipe. Ale jak zvládne MAIN zaráz posouchat jestli nepřišel další člověk a zaráz naslouchat pipe?
Napriklad tak ze v nom budu bezat 2 vlakna.
server a client by mali byt 2 processy, pokial zvladnes tak mozes forkom, ale kazdy by mal mat zvlášť thread na reading zo socketu
Jo, tohle už vypadá reálněji. MAIN bude mít 2 vlákna: 1. pro komunikaci s vlákny a write() do socketů 2. pro naslouchání a zpracování nových účastníků fork()nuté procesy by byly téměř stejné, jen by výstup posílali pomocí pipe na MAIN ----------- Ok, nechám tomu zase pár dní, potřebuji pobrat a procivičit threading, zkusím to poskládat dohromady a napíšu jak to dopadlo.
C Viete niekto odporučiť nejakú stránku z ktorej dobre učí C?
linuxsoft
http://www.sallyx.org/sally/c/
Bývalej spolužák má něco na stránce též http://www.itnetwork.cz/cplusplus
Mohu také doporučit toho Herouta co nám ukazovala, dobře se z něj učít, nahnal jsem za 2 dny pololetí v prváku na střední :D
Lynda.com
nepodarilo sa mi nájsť na nete tú jeho najnovšiu publikáciu z 2013
tam se nic nemění, to je pořád stejný
tipujem že to sú iba dotlače s tým istým obsahom :D
Mám půjčenou knížku od Herouta vydání 2013 (z knihovny na fitu) a v předmluvě mluví o změnách, které v různých vydání provedl. A píše, že uvedené informace nebylo potřeba nějak moc měnit. Jenom prý byla nejvíce rozšířená kapitola o strukturách. Takže si myslím, že půjčení staršího vydání nic nepokazíš :-D
Skus si dat na youtube bamboo , to je tiez pohodd
stackoverflow.com :D
Ideální stránka pro začátek tvoření projektů na FITu. Je tam všechno od Linuxu přes časté chyby až po Code::Blocks IDE. Koukni se sem, až budeš C trochu ovládat. ;) http://jaknaprojekty.davidm.cz/
http://c.learncodethehardway.org/book/
C Sepsal jsem menší návod, jak na projekty v C. Na co si dát pozor (jaké funkce nepoužívat), jak řešit časté problémy apod. Text je primárně určen pro prváky, ale jistě se najde někdo i zde, pro koho bude přínosem.
http://blog.nechutny.net/?detail=11
„... a nastává "střelba do nohy".” :D (y)
Hodilo by se dopsat, že UTF-8 není kompatibilní se string.h metodami jako je strlen, atd... Já na to přišel po půlhodině googlení.
nutno poznamenať, že pristup k argv[argc] je podľa C99 validný; Žiadne porno (ani študijne materialy) by sa zmazať nemali ani horieť by to nemalo začať, pretože: "argv[argc] shall be a null pointer."
Ok, dík za upozornění - opravím
C Ahoj, je nějaký způsob, jak v C pracovat s řetězcem (nebo proměnnou), který vytvořím v jiné funkci? (bez použití malloc) Předem děkuji
ukazatel?
http://cec.truni.sk/stoffov/dynamicke-udajove-struktury/Cast1/pointers_funkcie2.html
celkom fajn je to aj v ppt od kreslikovej(prednaska o ukazateloch)
Přesně. Příklad zde - hodnota v "cislo" (přejmenované na "znak") se zvetsi o 1. Nikoliv jen v lokální proměnné fce "inkrementuj", ale v proměnné typu int kdesi v paměti na adrese "&cislo" void inkrementuj(int *znak) { *znak++; } int funkce(argumenty) { int cislo = 46; inkrementruj(&cislo); } -------------------------- int cislo = proměnná INT (hodnota 42) &cislo = adresa proměnné - INT (hodnota je pořadové číslo bloku paměti na RAM (zjednodušeně) - např 11538642) pokud změníš &cislo tak řekneš OS že proměnná &cislo je (4)bajtova posloupnost 1 a 0 zacinajici od cisla, ktere jsi zadal - bude to cist jinde v pameti !!! mam adresu int adresa = &cislo adresa = 376356862 (říkám OS že ji má hledat jinde) *adresa = 36753 přistupuji k OBSAHU proměnné. do "adresa" dám číslo "36753" ----------------------- Je ti to jasné?
Akurat si daj pozor na platnost premennej. Az by niekoho napadlo vytvorit si premennu vo funkcii bez malloc a vracat ukazatel na nu, tak si uvedomte ze premenna je na zasobniku, a pri navrate funkcie sa odstrani, teda navrateny ukazatel sa stane neplatnym. V tom pripade jedinym riesenim je alokovat na hlade cez malloc.
všem vám moc děkuji :) faramos CZ - hezky jsi to popsal a možná jsem to konečně pochopil. Teď už jen procvičovat, aby to v hlavě zůstalo. Díky moc :)
Len upozorním, že ak chcete inkrementovať číslo na ktoré ukazuje ukazatel (42 inkrementovať na 43) musíte použiť (*znak)++; Pretože príkaz *znak++; vám inkrementuje adresu ukazatela a to na čo ukazuje sa nijak nezmení. ;)
a len pre zaujimavost dodam ze ++*znak je v poriadku:) rovnaka logika ako v prispevku hore.
C Caute, stretli ste sa niekto s tym, ze pri volani funkcie clock_gettime mi gcc hadze warning: implicit declaration of function ‘clock_gettime’. Samozrejme ze mam includnutu time.h . Nepozna ani enum ktorym sa pouziva ako prvy parameter. Avsak ked pouzivam iba clock() nema problem s prekladom. kontroloval som time.h, vyzera byt vporiadku (obsahuje funkcie ktore volam) a rovnaky warning vypisuje aj Merlin
Skontroloval by som nasledovnu vec podla man page: "On POSIX systems on which these functions are available, the symbol _POSIX_TIMERS is defined in <unistd.h> to a value greater than 0."
no v <unistd.h> sa spomina iba v komente: _POSIX_TIMERS POSIX.4 clocks and timers are supported. myslim si vsak ze je to run time zalezitost a treba sa na tu konstatntu pytat pomocou sysconf() ked som vsak googlil okolo clock_gettimer, luida radili pri linkovani pouzit prepinac -lrt , no skor mam pocit ze chceli vsetko linkovat do kniznice a to ma uplne zmiatlo
Tak predsa som nasiel este jeden pekny riadok v man page. "Feature Test Macro Requirements for glibc (see feature_test_macros(7)): clock_getres(), clock_gettime(), clock_settime(): _POSIX_C_SOURCE >= 199309L" co uz asi riesi tvoj problem PS: Inak povedane, ak sa snazis pisat co najviac prenositelny kod tak tuto funkciu obid
o prenositelnost nejde skor ma zarazilo ze to nejde... v podstate potrebujem iba merat cas za ktory sa vykona isty usek kodu, poznas nieco spolahlivejsie, presne aspon na milisekundy
Tak bud #define _POSIX_C_SOURCE 199309L predtym ako cokolvek includnes (alebo ako prepinac do prekladacu cez -D), ale mal by postacit aj clock() ak to potrebujes len na urcitu cast kodu, ak na cely kod tak aj systemova utilita time.
clock() to som pouzival predtym, ale vie to iba presnost na sekundy
ten define od Mareka funguje a ano includujem
<sys/time.h> som skusal ale s rovnakym vysledkom ako <time.h>
dakujem vam obom :)
... a na vsetko ostatne tu je MasterCard
C Mám takový dotaz: mám 2 texťáky, který mají 6 informací, (oddělené tabulátorama) já potřebuju vzít tyto texťáky, rozdělit to do tabulky a pak vzít 4. a 5. sloupec a porovnat, jestli jsou v obou texťákách stejný, není na to nějaká funkce, co by to řadila podle těch tabulátorů do tabulky? Díky
struct + http://www.cplusplus.com/reference/cstring/strtok/
C jak by šlo naalokovat flexible array char data[]; ??
ak to mas v strukture tak si alokuj proste viac miesta
man realloc