- One mobilszolgáltatások
- Kirakatba tette a Google a Pixel 10-eket
- Itt egy pár fotó az iPhone 17 sorozatról
- Profi stratégiára vált a Galaxy S26
- Huawei Mate 9 - Mate evangéliuma
- Samsung Galaxy A56 - megbízható középszerűség
- Kikristályosodik a Razr 60
- Bemutatkozott a Poco X7 és X7 Pro
- Huawei Watch Fit 3 - zöldalma
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
Hirdetés
Talpon vagyunk, köszönjük a sok biztatást! Ha segíteni szeretnél, boldogan ajánljuk Előfizetéseinket!
-
Mobilarena
Új hozzászólás Aktív témák
-
Jester01
veterán
Ha mindenáron substr, akkor fordítva van a 2 paraméter: start, hossz.
Tehát substr(i, 1) kell. De mivel karakterről van szó, ezért simán indexelheted is a stringet. A string indexelés egyébként 0tól kezdődik.
Amúgy ha szavakat kell számolni, akkor figyelembe kell venni, hogy több szóköz is lehet a szavak között. -
Jester01
veterán
Akkor a szóköz nem is kell ide: fscanf...''%d %d''...?
Nem, de így olvashatóbb. Egyébként nyugodtan próbáld ám ki magadtól.
Ez itt miben különbözne C++ ban ha ez nem az?
Bár a C++ kompatibilis a C-vel de C++-ban igazából streameket illik használni, valahogy így:
ifstream f(''be.txt'');
f >> MaxTeher;
f >> csomiszam;
for (i=0;i<csomiszam;i++) f >> s[ i ]; -
Jester01
veterán
Igen, ha a 3. sorba is %d-t írsz, és a ciklusba nem <= összehasonlítás kell, mert úgy eggyel többet fog olvasni mint amennyi van.
MOD #2228-ra: ez C kód, nem C++. Biztos le van írva a könyvben is hogy mûködik a scanf. A szóközt nem kell explicit kihagyni mert a scanf átlépi magától. Ha pontosan egy karaktert akarsz beolvasni akkor egyébként az fgetc függvény a barátod.
[Szerkesztve] -
Jester01
veterán
A %d az 54-et fogja belerakni, mert whitespace (szóköz, soremelés) határig olvas.
#include <stdio.h>
int main(int argc, char* argv[])
{
int x;
FILE* f = fopen(argv[1], ''r'');
while(fscanf(f, ''%d'', &x) == 1) printf(''%d\n'', x);
fclose(f);
return 0;
}
be.txt:
1.54..2
123.....45
A szókózöket ponttal jelöltem, mert a fórummotor különben kitörli õket.
Futtatás eredménye:
1
54
2
123
45
[Szerkesztve] -
-
Jester01
veterán
-
Jester01
veterán
#include <stdio.h>
int main (int argc, char *argv[])
{
FILE *be;
int c;
char *t[256] = { 0, };
t[(unsigned char) 'á'= ''a''';
t[(unsigned char) 'Á'= ''A''';
be = fopen (argv[1], ''r'');
while ((c = fgetc (be)) != EOF)
{
if (t[c] == NULL)
{
fputc(c, stdout);
} else {
fputs(t[c], stdout);
}
}
fclose (be);
return 0;
} -
Jester01
veterán
válasz
bambano #2159 üzenetére
1. nem mindegy, hogy mit szokik meg.
2. Nem az fgetc-nél kell a cast, az valóban úgy van ahogy írtad. Hanem a táblázat feltöltésénél, ahol karakter konstansot használsz. Itt, ni:
t['á']=''a''';
3. Nekem megy. Ellentétben a tieddel, mert az - mint említettem - túlolvas és aztán mínusz egyet (EOF) használ tömb indexnek.
[Szerkesztve] -
Jester01
veterán
válasz
bambano #2156 üzenetére
1. A változókat gondolom a main-be lokálisan akartad tenni
2. Mint említettem az unsigned char cast szükséges. Pl. x86 linuxon gcc 4.0 esetén (most ez van kéznél) a char az signed és emiatt nem mûködik a progi.
3. az feof tesztelés így nem jó, túlolvas. Egyszerûen az fgetc visszatérési értékét kell EOF-fal összehasonlítani.
Bocs a kötözködésért.
Még egy apró gondolkoznivaló a kérdezõnek: vigyázz milyen kódlapot használsz. -
Jester01
veterán
Nem lesz jó, mert az str_out tömbbe nem indexelhetsz ugyanúgy i-vel. Hiába írod, hogy str_out[i+1] a következő iterációban felülírod, mivel a ciklusfejben i++ van.
Vezess be egy másik változót, ami kimenő index.
Amúgy a táblázatos megoldás szerintem is jobb lenne.
MOD: de csak egy dimenzió kell. Az index a bemenő karakter, az elem pedig a helyettesítés. Pl ilyesmi lehet
char* tabla[255] = {0, }
tabla[(unsigned char)'á'= ''a''';
tabla[(unsigned char)'é'= ''e''';
...
Vigyázni kell, hogy unsigned char legyen, mert különben elképzelhető, hogy pont az ékezetes karakterek negatív kódot kapnak ami tömb indexelésnél nem túl hasznos.
[Szerkesztve] -
Jester01
veterán
válasz
Forest_roby #2124 üzenetére
Vita egy szál se. Szakmai vita meg különben is hasznos
A C egy viszonylag alacsony szintû nyelv, amiben (mmint magában a nyelvben) tulajdonképpen nincs is string kezelés a konstansokat leszámítva (az is csak kényelmi szolgáltatás, hogy ne karakterenként kelljen inicializálni a tömböket). Az összes mûvelet a c libraryban van. Az említett összefûzés pedig különösen problémás, hiszen az új stringnek helyett kell foglalni. Minthogy dinamikus memóriakezelés sincs (ez is a lib dolga) így ezt nem lehet megcsinálni. Ez így jó is, mert a lib cserélgetésével tetszõleges környezetben használható marad a nyelv. Enélkül bajos lenne pl. a kernelt C-ben írni.
MOD: ja és még egy dolog: mivel a C nem rejti el a részleteket a programozó már kb. ránézésre tudja, mi zajlik. Észreveszed, hogy az a string összefûzés egy bonyolult dolog lehet tehát esetleg át kellene írni olyanra a kódot, hogy kevesebbre legyen szükség (ha éppen számít a sebesség).
[Szerkesztve] -
Jester01
veterán
persze elotte megnezi, hogy egyenlo-e a hosszuk
... ami annyira nem persze, mivel c-ben nem éri meg 2x végignézni a stringet szerintem.
MOD: meg a glibc írói szerint sem
__STRING_INLINE int
strcmp (__const char *__s1, __const char *__s2)
{
register unsigned long int __d0, __d1;
register int __res;
__asm__ __volatile__
(''cld\n''
''1:\n\t''
''lodsb\n\t''
''scasb\n\t''
''jne 2f\n\t''
''testb %%al,%%al\n\t''
''jne 1b\n\t''
''xorl %%eax,%%eax\n\t''
''jmp 3f\n''
''2:\n\t''
''sbbl %%eax,%%eax\n\t''
''orb $1,%%al\n''
''3:''
: ''=a'' (__res), ''=&S'' (__d0), ''=&D'' (__d1)
: ''1'' (__s1), ''2'' (__s2)
: ''cc'');
return __res;
}
[Szerkesztve] -
Jester01
veterán
válasz
Forest_roby #2113 üzenetére
Egy megoldás lehetne az, hogy strcmp -vel összehasonlítom, de nem akarok ágyúval lőni verébre.
Erre pedig ez a megoldás. -
Jester01
veterán
válasz
Forest_roby #2039 üzenetére
Ez a C átka. A stringeket cím szerint adja át, a számokat érték szerint. Vagyis a %s egy pointert vár. Ha a szám nulla (vagyis üres volt a szövegmező) akkor ez egy null pointer lesz amit külön lekezel a printf. De ha valami más számot adsz át, akkor bizony arról a - jó eséllyel érvénytelen - memóriacímről megpróbál olvasni, és így lesz segfault. Egyébiránt a gcc fordításidőben észreveszi az ilyen hibát, ha a -Wall kapcsolót használod (ez mindig jó ötlet):
callbacks.c:231: warning: format argument is not a pointer (arg 4) -
Jester01
veterán
válasz
Forest_roby #2035 üzenetére
Mail megjött.
Ez a smiley kell neked azt hiszem:
A debug üzenetedbe hal beleA számot ne %s-el írd ki, mert az nem jó
g_message(''A szöveg hossza: %d\n'', gtk_text_buffer_get_char_count(textview_buffer)); -
Jester01
veterán
válasz
Forest_roby #2033 üzenetére
> wget 'http://www.uw.hu/admin/webftp/PHPFTP_main.php?phpftp_cmd=get&phpftp_file=myeditor-0.1.tar.gz'
...
Length: 0 [application/octetstream] -
Jester01
veterán
válasz
Forest_roby #2030 üzenetére
Ide vele! Valami a widget struktúrával lehet, ha a target NULL...
-
Jester01
veterán
válasz
Forest_roby #2028 üzenetére
A 2 warning szerintem 2 cast-tal orvosolható. A szöveg hosszát pedig a gtk_text_buffer_get_char_count függvénnyel egyszerûen le tudod kérdezni.
Azt, hogy mi a baj a te kódoddal így ránézésre nem tudom, ha adsz teljes forrást ami lefordul akkor esetleg megnézem. -
Jester01
veterán
válasz
Forest_roby #2015 üzenetére
Természetesen van. Szerinted a touch-ot miben írták?
FILE* F = fopen(''/tmp/empty.txt'', ''w'');
fclose(F); -
Jester01
veterán
válasz
Forest_roby #1999 üzenetére
callbacks.c:16: warning: passing arg 1 of `strlen' from incompatible pointer type
MOD: plusz az az strcpy( *alap, uj ); nem kell oda.
[Szerkesztve] -
Jester01
veterán
válasz
Forest_roby #1982 üzenetére
Legegyszerűbb, ha az alap stringed dinamikusan foglalod és az összefűzésnél dupla pointert adsz be.
void osszefuzes(char** alap, const char* plus)
{
char* uj = ...
...
free(*alap);
*alap = uj;
}
Hívás példa:
char* alap = strdup(''vmi'');
osszefuzes(&alap, ''mas'');
printf(''%s\n'', alap);
osszefuzes(&alap, ''vege'');
printf(''%s\n'', alap);
free(alap); -
Jester01
veterán
válasz
Forest_roby #1979 üzenetére
Jah, figyelmetlen voltam
Szóval:
GtkWidget *a_checkbutton = lookup_widget(GTK_WIDGET(button),
''a_checkbutton'');
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(a_checkbutton)) == TRUE) g_message(''TRUE\n'');
Persze az is jó amit én írtam, csak ez szebb. -
Jester01
veterán
válasz
Forest_roby #1977 üzenetére
a_checkbutton->active == TRUE
-
Jester01
veterán
Linux alatt lehet. Win alatt is biztos van rá progi. Ha meg máshogy nem, akkor csinálj pl. titkosított rart (esetleg tömörítés nélkül) és írd rá úgy.
MOD: anno win2kra írtam egy drivert ami tudta olvasni a titkosított lemezeket amiket linux alatt gyártottam. Sajna xpvel nem ment, biztos megváltozott valami api. Illetve a titkosító progiból is készítettem parancssoros verziót ami elvileg win alatt is fut (mivel semmi extra nincs benne).
[Szerkesztve] -
Jester01
veterán
válasz
Forest_roby #1965 üzenetére
Vagy eleve karakterenként olvasod (fgetc) vagy pedig a beolvasott soron végigmész karakterenként.
-
Jester01
veterán
válasz
Forest_roby #1908 üzenetére
apt-get install libgtk2.0-dev
(debian) -
Jester01
veterán
válasz
Forest_roby #1906 üzenetére
gtk2 ..... -ból rengeteg dolog van telepítve a gépre.
... csak valószínűleg pont az nem, ami kell
Nézd meg a config.log-ba mit írt, mit keres és miért nem találta.
Amúgy a weboldalad most éppen nem elérhető. -
Jester01
veterán
válasz
Forest_roby #1903 üzenetére
Először is: a configure nem fut le, hibát dob:
checking for PACKAGE... configure: error: Package requirements (gtk+-2.0 >= 2.0. 0) were not met.
Tehát nem csinálja meg a makefile-t, mert hiányzik neki a gtk.
Másodszor: Az egy dolog, hogy a makefile nem készül el, de úgy látom maga a make program sincs telepítve.
Megoldás mindkét problémára: Tedd fel a megfelelő csomago(ka)t.
[Szerkesztve] -
Jester01
veterán
Ja, hogy devcpp volt a tettes, akkor nem szóltam
Mindesetre a system parancs használatától lehetőleg tartózkodni kell ha platformfüggetlen programot akar írni az ember. Ha meg nem platformfüggetlen, akkor meg tessék használni a megfelelő függvényeket/apikat és ne egy külső progit indítani (tipikus példa a pause és a cls).
Jelen esetre ez nyilván nem vonatkozik, ez csak az én áltános meglátásom. -
Jester01
veterán
1. using namespace
C++ban lehetőség van névterek használatára, hogy a névütközést el lehessen kerülni. (namespace akarmi { ... } )
Az alap könyvtár az ''std'' névteret használja. Using nélkül pl. ki kellene írni mindenhol, hogy std::cout. A using használatával az adott névtér elemeire közvetlenül lehet hivatkozni. Bizonyos (tipikusan régebbi) fordítók nem támogatják a névtereket vagy pedig az std névteret automatikusan úgy kezelik mintha lenne rá using.
2. a main paraméterei
A main függvény helyes prototítpusa az int main(int argc, char *argv[]), ahol argc a parancsori argumentumok száma és argv az argumentumok tömbje. A 0. indexű elem tipikusan a program neve. A függvény visszatérési értéke pedig egy int ami egy tetszőleges kód, tipikusan 0 a sikeres lefutás jelzésére.
A void main() forma véletlenül működik, mivel a C hívási konvenció ezt lehetővé teszi. Ilyenkor a parancssor nem érdekes és a visszatérési érték pedig valami véletlen szám lesz. Használata nem javasolt, visszatérési értéket mindig célszerű megadni, ha pedig nem akarod használni a parancssort, akkor egy int main(int, char**) sorral ez korrekten megtehető.
3. cstdlib
Igen, ebben a C stdlib függvényei érhetők el, többek között a system is. (Ez a példa szerintem nem volt szerencsés a kollega úr részéről, bár tény, hogy nem egyszerű billentyű lenyomásra várni C++ban.)
4. EXIT_SUCCESS
Ez egy előredefinált konstans a sikeres lefutás jelzésére (0). Lásd 2. pont.
MOD: hú de nagyon lassú voltam
[Szerkesztve] -
Jester01
veterán
Itt valami telepítési probléma lett ...
Egyébként mint már említettem Cucka progija helyes, a te verziód az sajnos nem:
t.cpp:3: error: '::main' must return 'int'
t.cpp: In function 'int main()':
t.cpp:5: error: 'cout' was not declared in this scope
A könyvet nem kell kidobni, csak a using-ot kell mindig beírni, illetve a main függvényből int-et kell visszaadni. -
Jester01
veterán
Csak a szokásos probléma: a fórummotor cseréli az idézőjelet két aposztrófra.
Vagyis Cucka példája jó, csak idézőjel kell. (gondolom copy&paste volt).
Ez linux alatt is ugyanez lenne (főleg mivel a devcpp gcc alapú ha jól tudom.)
MOD: Ha nem vagy linuxos, akkor miért Tux az avatarod? Mert aranyos?Engem nem zavar, nyugodtan hagyhatod, csak mást sugall...
[Szerkesztve] -
Jester01
veterán
válasz
Forest_roby #1858 üzenetére
Veszel egy 64 bites procit
MOD: hopp, tévedésben vagyok. A (nem létezõ) long long int mûködik 32 bites gépen is. Neked csak annyi baj volt, hogy a kiírásban nem %lld formátumot használtál.
[Szerkesztve] -
Jester01
veterán
válasz
Gergello #1777 üzenetére
Oprendszer? http protokollt kézzel implementálni azért nem teljesen triviális, windózban vannak rá függvények, gondolom más oprendszerre is vannak libek.
Ha nem szükséges c-ben csinálni, akkor én simán scriptből futtatnék parancssoros letöltő progit (pl. wget). Persze ez a megoldás c-ből is járható, csak nem szép. -
Jester01
veterán
Rövid összefoglalás:
- a programban használt string konstansok (meglepő módon) const char* típusúak, és nem írhatóak
- strcpy nem foglal helyet az új stringnek, azt neked kell megtenni (ha ezt elmulasztod, akkor felülírod a memóriát amiből véletlenszerű segfaultok vagy egyéb nehezen kideríthető hibák lesznek)
- strcat kényelmi szolgáltatásként adja vissza a beadott pointert, de az nem változik. Vagyis azt nem kell használni. -
Jester01
veterán
válasz
emitter #1685 üzenetére
Ez a bufferelés egy nagy káosz nekem. Nem igazán értem ki kivel van.
Elõször ott van ugye a buflevel. Gondolom ez mondja meg mennyi byte van már a bufferben. Utána van egy ciklus ami wi->bufsize-ig futAz snd_pcm_writei pedig már readbytes mennyiséget küld a hangkártyának.
-
Jester01
veterán
válasz
emitter #1685 üzenetére
Azért ugrik meg a procihasználat, mert megállított állapotban nyilván nem kellene a select writefds közé a socket. Hiszen hiába is tudnál írni a hálózatra ha egyszer nem akarsz. Szóval most a select rögtön visszatér, hogy hajrá küldjél adatot, te viszont nem csinálsz semmit. Vagyis ott pörög a szerencsétlen.
A többit még nézem, majd jövök -
Jester01
veterán
-
Jester01
veterán
-
-
Jester01
veterán
válasz
emitter #1658 üzenetére
A castolás nem konvertál, az (int)''1'' eredménye nem 1 lesz, hanem a stringre mutató pointer értéke. Stringbõl számot strtol, strtoul, strtod (hibakezelés miatt ajánlott) vagy az atoi, atol, atoll, atof illetve sscanf függvényekkel lehet. Visszafelé sprintf, snprintf.
-
-
Jester01
veterán
válasz
emitter #1634 üzenetére
Icipicit elrontottad. Elõször is betettél egy cout << ''\nloadWav OK\n''; sort a saját megtévesztésedre, mivel nem ellenõrzöd a visszatérési értéket és így akkor is OK-ot ír ha nem is ...
Másrészt a loadWav függvényben kevered az exit és a return használatát, bizonyos hibákra kilépsz másokra pedig 0-t adsz vissza.
Ugyanakkor van egy cout << ''\nftell: '' << ftell(handle); sor a loadWav végén ami nem fut le, ebbõl észrevehetted volna, hogy idõ elõtt visszatér a függvény. -
Jester01
veterán
Igen, ez a tömb-pointer ekvivalencia miatt van. Jelen esetben írhattad volna db + 1 alakban is, csak ez kevésbé olvasható. Az a lényeg, hogy a második elemre mutató pointert kell átadni. Ezt vagy az & operátorral vagy pointer aritmetikával lehet. Egy elem olvasásakor az & operátor jobban kifejezi mi történik, több elem olvasásakor viszont éppen a pointer aritmetika a kifejezõbb (szvsz). A fordítónak persze édesmindegy.
-
Jester01
veterán
Azért, mert a srand(time(NULL)) egy másodpercen belül ugyanarra az értékre inicializálja a véletlenszám generátort. Ha a progid indíthatják egy másodpercen belül többször, akkor más kezdőértéket kell keresni. Egy futás alatt viszont csak egyszer szabad meghívni a srandot. Tehát nem minden alkalommal amikor véletlenszámok kellenek.
MOD: ja és a leírás kifejezetten nem ajánlja az alsó bitek használatát (vagyis a maradékképzést)
[Szerkesztve] -
Jester01
veterán
válasz
emitter #1595 üzenetére
Azzal nem mész semmire, neked a library forrása kell. Egyébként a /usr/lib/libSDL_mixer.so.x.x fájlban lesz, de az nem a forráskód. Ha függvénykönyvtárat használsz, akkor az ahhoz tartozó headerben csak a deklarációk (prototípusok) vannak, a definíciók (implementáció) a könyvtárba van belefordítva. A könyvtár forráskódja, (amibõl a library készül) nem kell ahhoz, hogy magát a libraryt másik program használja. Ezért nem is szokás felrakni. Csak azoknak kell, akik magát a libraryt akarják újrafordítani (fejlesztõk).
-
Jester01
veterán
válasz
emitter #1588 üzenetére
Na látod ez a baj. A fordító is ezen a véleményen van, hogy neki biza senki nem árulta el mi a szösz ez a struktúra. Überbrutálnagyhekk, de meg lehet próbálni, hogy az általad beszúrt struct Mix_Music definíciót átnevezed _Mix_Music-ra, mert nem lehet tudni, hogy a library ugyanazt a struktúrát használja-e (a sok #ifdef miatt).
-
Jester01
veterán
válasz
emitter #1584 üzenetére
Ez most úgy látom a typedef nélküli verzió. Akkor nyilván sizeof(struct Mix_Music) kell. De valahol még mindig gáz van, hiszen pl. a Mix_PlayMusic prototípusa a fordító szerint hivatkozik a Mix_Music típusra. Szóval valamelyik headerben benne kell legyen. Keresd tovább
Új hozzászólás Aktív témák
● olvasd el a téma összefoglalót!
- One mobilszolgáltatások
- A fociról könnyedén, egy baráti társaságban
- Gaming notebook topik
- Horgász topik
- AMD GPU-k jövője - amit tudni vélünk
- Futás, futópályák
- Háztartási gépek
- OTP Bank topic
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Amlogic S905, S912 processzoros készülékek
- További aktív témák...
- Gigabyte 15 G5 Gamer FHD IPS 144Hz i5-12500H 12mag 4.5Ghz 16GB 512GB Nvidia RTX 3050 Win11 Garancia
- Layer 2 Plus (Layer 3 Lite) Passzív rack switch, 24x1G + 4x10G SFP+ , SFP-kkel FS S3900-24T4S-R
- Eladó/Lenovo X240 Ultrabook/I5-4300U/8GB DDR3/Win 10Pro/12,5"!!!
- LG OLED55C9 prémium TV - 140cm, 4k, 120Hz - apró vizuális hibával
- Erős Gamer / Munka PC i7-14700, RTX 3070 Ti, 32GB RAM, 1TB SSD
- Nvidia Quadro P400/ P600/ P620/ P1000/ T400/ T600/ T1000 - Low profile (LP) + RTX A2000 6/12Gb
- LG 45GR95QE - 45" Ívelt OLED / 2K WQHD / 240Hz 0.03ms / NVIDIA G-Sync / FreeSync Premium / HDMI 2.1
- GÉMER! Dell G15 5520 i7-12700H 14magos! RTX 3060 3070 szint! 32GB RAM 1000GB SSD FHD 120Hz Gar. 2026
- Akció! Apple MacBook Pro 16 M4 Pro - M4 Pro 24GB 512GB SSD garanciával hibátlan működéssel
- Acer TravelMate P214 i3-1115G4 8GB 256GB 14" FHD 1év garancia
Állásajánlatok
Cég: FOTC
Város: Budapest