- Yettel topik
- Samsung Galaxy A26 - csak a szokásos
- Google Pixel topik
- Samsung Galaxy S24 Ultra - ha működik, ne változtass!
- OnePlus Watch 4 néven újráz az Oppo Watch X3
- Hivatalos a OnePlus Watch 4
- Szívós, szép és kitartó az új OnePlus óra
- Feltalálta a Google a keresőmotort
- Samsung Galaxy A56 - megbízható középszerűség
- Fotók, videók mobillal
-
5700 - 5601
6397 - 6301 6300 - 6201 6200 - 6101 6100 - 6001 6000 - 5901 5900 - 5801 5800 - 5701 5700 - 5601 5600 - 5501 5500 - 5401 5400 - 5301 5300 - 5201 5200 - 5101 5100 - 5001 5000 - 4901 4900 - 4801 4800 - 4701 4700 - 4601 4600 - 4501 4500 - 4401 4400 - 4301 4300 - 4201 4200 - 4101 4100 - 4001 4000 - 2001 2000 - 1
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
-
Frissítve: 2014-04-25 14:12 Téma összefoglaló
Új hozzászólás Aktív témák
-
DrojDtroll
veterán
-
ToMmY_hun
senior tag
-
dobragab
addikt
-
stepboy
csendes tag
-
kispx
addikt
-
stepboy
csendes tag
-
dobragab
addikt
Napi mitírki. Nem nehéz, de azért van benne egy apró csavar. Kérdés: mi a függvény visszatérési értéke?
unsigned set(unsigned *a, unsigned *b) {
*a = 1;
*b = 2;
return *a;
} -
alapz@j
tag
Az egyik elv az, hogy csak akkor valtoztatnak meg szabalyokat/mintakat, amikor arra kifejezetten jo ok van. Tehat ha idaig jo volt az ANSI, es az ujabb feladatokat is meg lehet oldani igy, akkor nem tesznek a fejlesztokre extra mentalis terhet azzal, hogy varialnak.
A C++ (Scala, etc.) egyik fo problemaja, hogy nagyon sok modszerrel meg lehet csinalni ugyanazt. C++-ban irhatsz proceduralis, OO, funkcionalis, etc. programot, ami egyreszt meno+kenyelmes, masreszt sokkal nehezebb megakadalyozni, hogy egy nagyobb projektnel divergaljon a stilus/megkozelitest. A sokfele megkozelites meg azt eredmenyezi, hogy a projekt reszvevoinek 1) allandoan el kell donteni, hogy melyiket alkalmazzak 2) nehezebb ertelmezni a masik kodjat.
Pl. a Java ezert is olyan sikeres -- egy Java kodot _barki_ el tud olvasni. (Ott a komplexitast attoltak a frameworkok szintjere.)
Értem, de azért azt tegyük hozzá, hogy az általa említett Javában is gyakran van szintaktikai változás verziók között - ha jól emlékszem, pl. az 1.5-től jött be a
for (String s : stringArray)forma a korábban használtfor (int i ...) stringArray.get(i)kiváltására és nem okozott ez törést senki életében. -
EQMontoya
veterán
Az egyik elv az, hogy csak akkor valtoztatnak meg szabalyokat/mintakat, amikor arra kifejezetten jo ok van. Tehat ha idaig jo volt az ANSI, es az ujabb feladatokat is meg lehet oldani igy, akkor nem tesznek a fejlesztokre extra mentalis terhet azzal, hogy varialnak.
A C++ (Scala, etc.) egyik fo problemaja, hogy nagyon sok modszerrel meg lehet csinalni ugyanazt. C++-ban irhatsz proceduralis, OO, funkcionalis, etc. programot, ami egyreszt meno+kenyelmes, masreszt sokkal nehezebb megakadalyozni, hogy egy nagyobb projektnel divergaljon a stilus/megkozelitest. A sokfele megkozelites meg azt eredmenyezi, hogy a projekt reszvevoinek 1) allandoan el kell donteni, hogy melyiket alkalmazzak 2) nehezebb ertelmezni a masik kodjat.
Pl. a Java ezert is olyan sikeres -- egy Java kodot _barki_ el tud olvasni. (Ott a komplexitast attoltak a frameworkok szintjere.)
egy Java kodot _barki_ el tud olvasni.
Mondjuk sírhatnékja is lesz tőle az embernek, mert még olaszul is nagyobb entrópia érhető el.

-
emvy
félisten
Az egyik elv az, hogy csak akkor valtoztatnak meg szabalyokat/mintakat, amikor arra kifejezetten jo ok van. Tehat ha idaig jo volt az ANSI, es az ujabb feladatokat is meg lehet oldani igy, akkor nem tesznek a fejlesztokre extra mentalis terhet azzal, hogy varialnak.
A C++ (Scala, etc.) egyik fo problemaja, hogy nagyon sok modszerrel meg lehet csinalni ugyanazt. C++-ban irhatsz proceduralis, OO, funkcionalis, etc. programot, ami egyreszt meno+kenyelmes, masreszt sokkal nehezebb megakadalyozni, hogy egy nagyobb projektnel divergaljon a stilus/megkozelitest. A sokfele megkozelites meg azt eredmenyezi, hogy a projekt reszvevoinek 1) allandoan el kell donteni, hogy melyiket alkalmazzak 2) nehezebb ertelmezni a masik kodjat.
Pl. a Java ezert is olyan sikeres -- egy Java kodot _barki_ el tud olvasni. (Ott a komplexitast attoltak a frameworkok szintjere.)
-
alapz@j
tag
-
maestro87
őstag
"Összetett literális".
Alaptípusokra, mint amilyen az
int, azunsigned long, adouble, tudsz a programkódba beágyazott konstansokat írni. Pl:0,25UL,0x0badc0de,4.6f,0.001. Speciális literal még a string literal, amit így ismersz:"Hello world!\n".Struktúrákra, union-okra, tömbökre C89-ben ilyet csak inicializálásnál tudsz:
struct Pont p = {5, 12};
int arr[] = {1, 2, 3, 5, 8, 13, 21};
p = {12; -5}; // <- ERROR
p.x = 12;
p.y = -5; // <- macerásC99 behoz ezzel kapcsolatban két feature-t, a compound literal és a designated initializer.
Compound literal
Arra való, hogy a programkódban ne csak ilyen alaptípusokat, hanem összetett típusokat is meg lehessen adni egyetlen kifejezésben. Ehhez ugyanaz a szintaxis, mint az inicializálásnál, konyhanyelven annyi különbséggel, hogy a kapcsos zárójel tartalmát az adott típusra kell "cast-olni".
p = (struct Pont){12; -5};
struct Pont Pont_tukroz(struct Pont p)
{
return (struct Pont){p.y, -p.x};
}
struct Pont q = Pont_tukroz((struct Pont){10, 13});printf("%p\n", (int[]){1});
double osszeg = double_osszeg((double[]){1.0, 2.718, M_PI}, 3);Ezek a "változók" temporális objektumok, nincs nevük, nem képezheted a címét, mint ahogy ez is értelmetlen:
printf("%p", &1);Élettartamuk a blokk végéig tart (bezáró
}), nem úgy, mint C++-ban, ahol a pontosvesszőig (jó, nem pont így van a szabványban, de megközelítőleg pontos).Designated initializer
C-ben a struktúrák adattagjait közvetlenül érjük el, szinte mindig név szerint.
void Pont_kiir(struct Pont p)
{
printf("(%d, %d)", p.x, p.y);
}Kivéve: inicializálásnál.
struct Pont p = {5, 12};Ez egyértelműnek tűnik, az
xkoordináta 5 lesz, azypedig 12. De mi történik, ha valami bunkó így definiálta astruct Pont-ot?struct Pont
{
int y;
int x;
}Ilyenkor minden működik tovább, kivéve az inicializálást, akkor pont fordítva történnek a dolgok, mint ahogy az ember elképzelte. Ezért vezették be, hogy a struktúrákat inicializálni is lehessen név szerint:
struct Pont p = {.x = 5, .y = 12};Természetesen compound literal-lal együtt is használható.
p = {.x = 5, .y = 12};És nem csak struktúrákra, tömbökre is.
int arr[] = {[0] = 8, [1] = 13, [2] = 21};Sőt, vegyesen is.
haromszog_rajzol((struct Pont[])
{
[0] = {.x = 12, .y = 5},
[1] = {.x = -12, .y = 5},
[2] = {.x = 0, .y = 0}
});Jó eséllyel ezeket a te fordítód is támogatja, ha GCC vagy Clang, csak -std=c99 kell neki. MSVC a C99 cuccokat a 2015-ös verzió óta zömmel tudja...
EQMontoya: bocsi a magyar változónevek miatt

Köszi a kimerítő és érthető választ!

XC8 fordítót használok, majd megnézem, hogy bekapcsolható-e ez a funkció mert alapból szerintem nem támogatja.
-
stepboy
csendes tag
De, ezzel így semmi baj nincs. Csak ez azért ciki, mert a
tempváltozó csakis azért létezik, hogy a függvénynek cím szerint oda tudd adni. Másra nem kell, ettől rondább lesz a kód.Így már szebb (szerintem):
evil_api_function_call(fp, ptr, (int[]){1});Mert ugye ezt nem írhatod le.
evil_api_function_call(fp, ptr, &1);Így már világos, köszi.
-
dabadab
titán
Linus is csak a hírnevéből él, meg az odaszólogatós leveleiből, amúgy meg faszságot beszél régóta.
Konkrétan az egyik projekten újraírtunk pár C kódot C++-ban, és azon felül, hogy fele annyi kód lett, konkrétan gyorsabb lett, mert jobban tudta optimalizálni a fordító a több rendelkezésre álló információ miatt.
Szóval Torwalds a múltban él és a múltat nézi, így hát seggel megy a jövőbe.
"Linus is csak a hírnevéből él"
Az meg tulajdonképpen teljesen mellékes, hogy a világ legnagyobb és legsikeresebb open source projektjét vezeti

-
dobragab
addikt
De, ezzel így semmi baj nincs. Csak ez azért ciki, mert a
tempváltozó csakis azért létezik, hogy a függvénynek cím szerint oda tudd adni. Másra nem kell, ettől rondább lesz a kód.Így már szebb (szerintem):
evil_api_function_call(fp, ptr, (int[]){1});Mert ugye ezt nem írhatod le.
evil_api_function_call(fp, ptr, &1); -
stepboy
csendes tag
-
dobragab
addikt
"Összetett literális".
Alaptípusokra, mint amilyen az
int, azunsigned long, adouble, tudsz a programkódba beágyazott konstansokat írni. Pl:0,25UL,0x0badc0de,4.6f,0.001. Speciális literal még a string literal, amit így ismersz:"Hello world!\n".Struktúrákra, union-okra, tömbökre C89-ben ilyet csak inicializálásnál tudsz:
struct Pont p = {5, 12};
int arr[] = {1, 2, 3, 5, 8, 13, 21};
p = {12; -5}; // <- ERROR
p.x = 12;
p.y = -5; // <- macerásC99 behoz ezzel kapcsolatban két feature-t, a compound literal és a designated initializer.
Compound literal
Arra való, hogy a programkódban ne csak ilyen alaptípusokat, hanem összetett típusokat is meg lehessen adni egyetlen kifejezésben. Ehhez ugyanaz a szintaxis, mint az inicializálásnál, konyhanyelven annyi különbséggel, hogy a kapcsos zárójel tartalmát az adott típusra kell "cast-olni".
p = (struct Pont){12; -5};
struct Pont Pont_tukroz(struct Pont p)
{
return (struct Pont){p.y, -p.x};
}
struct Pont q = Pont_tukroz((struct Pont){10, 13});printf("%p\n", (int[]){1});
double osszeg = double_osszeg((double[]){1.0, 2.718, M_PI}, 3);Ezek a "változók" temporális objektumok, nincs nevük, nem képezheted a címét, mint ahogy ez is értelmetlen:
printf("%p", &1);Élettartamuk a blokk végéig tart (bezáró
}), nem úgy, mint C++-ban, ahol a pontosvesszőig (jó, nem pont így van a szabványban, de megközelítőleg pontos).Designated initializer
C-ben a struktúrák adattagjait közvetlenül érjük el, szinte mindig név szerint.
void Pont_kiir(struct Pont p)
{
printf("(%d, %d)", p.x, p.y);
}Kivéve: inicializálásnál.
struct Pont p = {5, 12};Ez egyértelműnek tűnik, az
xkoordináta 5 lesz, azypedig 12. De mi történik, ha valami bunkó így definiálta astruct Pont-ot?struct Pont
{
int y;
int x;
}Ilyenkor minden működik tovább, kivéve az inicializálást, akkor pont fordítva történnek a dolgok, mint ahogy az ember elképzelte. Ezért vezették be, hogy a struktúrákat inicializálni is lehessen név szerint:
struct Pont p = {.x = 5, .y = 12};Természetesen compound literal-lal együtt is használható.
p = {.x = 5, .y = 12};És nem csak struktúrákra, tömbökre is.
int arr[] = {[0] = 8, [1] = 13, [2] = 21};Sőt, vegyesen is.
haromszog_rajzol((struct Pont[])
{
[0] = {.x = 12, .y = 5},
[1] = {.x = -12, .y = 5},
[2] = {.x = 0, .y = 0}
});Jó eséllyel ezeket a te fordítód is támogatja, ha GCC vagy Clang, csak -std=c99 kell neki. MSVC a C99 cuccokat a 2015-ös verzió óta zömmel tudja...
EQMontoya: bocsi a magyar változónevek miatt

-
maestro87
őstag
-
dobragab
addikt
sziasztok,
Ezt a példát nem értem.
int temp = 1;
evil_api_function_call(fp, ptr, &temp);C99-ben tudod lokális változónak is képezni a "címét" egy trükkel. Pontosabban: tudsz compound literal segítségével temp tömböt létrehozni egy elemmel, ami viszont már konvertálódik pointerre.
Tehát azt akarod mondani, hogy lokális változó címét nem lehet paraméterként átadni függvényhíváskor?
C99-ben tudod lokális változónak is képezni a "címét" egy trükkel
*temporális. Elírtam.
-
stepboy
csendes tag
Igen.
Kicsit off, de hátha segít valakinek, ezért inkább leírom, ha már eszembe jutott.
int temp = 1;
evil_api_function_call(fp, ptr, &temp);C99-ben tudod lokális változónak is képezni a "címét" egy trükkel. Pontosabban: tudsz compound literal segítségével temp tömböt létrehozni egy elemmel, ami viszont már konvertálódik pointerre.
evil_api_function_call(fp, ptr, (int[]){1});
sziasztok,
Ezt a példát nem értem.
int temp = 1;
evil_api_function_call(fp, ptr, &temp);C99-ben tudod lokális változónak is képezni a "címét" egy trükkel. Pontosabban: tudsz compound literal segítségével temp tömböt létrehozni egy elemmel, ami viszont már konvertálódik pointerre.
Tehát azt akarod mondani, hogy lokális változó címét nem lehet paraméterként átadni függvényhíváskor?
-
EQMontoya
veterán
Linus is csak a hírnevéből él, meg az odaszólogatós leveleiből, amúgy meg faszságot beszél régóta.
Konkrétan az egyik projekten újraírtunk pár C kódot C++-ban, és azon felül, hogy fele annyi kód lett, konkrétan gyorsabb lett, mert jobban tudta optimalizálni a fordító a több rendelkezésre álló információ miatt.
Szóval Torwalds a múltban él és a múltat nézi, így hát seggel megy a jövőbe.
-
dobragab
addikt
Van aki még a
for (int i = 0...-t se tudja elfogadniPéldául Linus Torvalds

-
alapz@j
tag
Viszont ha már szóba jött a
continueakkor megkérdezem, hogy mit gondoltok areturnkifejezés többszöri felhasználásáról egy függvényen belül? Sokan ezt is elítélik, de én előszeretettel térek vissza hibát jelző értékkel argumentum ellenőrzés után kivételkezelést nem támogató függvények esetén.A "no push friday" mozgalmat pedig támogatom
Mennyivel nyugisabb lenne az utolsó munkanap.maestro87 Így már
jobbanjól hangzik, hajrá-hajrá!
Szerintem nincs gond se a goto-val, se a continue-val, se a többszörös return-al. Van aki még a for (int i = 0... -t se tudja elfogadni, mert a C csak ANSI C-lehet, föggvényközbeni deklaráció nélkül. Én meg azt mondom, hogy whatever floats your boat, man...
-
dobragab
addikt
Igen, közben rájöttem, hogy két egymásba ágyazott
if(vagy egyif-ben két feltétel) többet ehet memóriában is.Ha struktúrákat használok az nem nevezhető már objektumorientált programozásnak? Nekem egyszer valaki azt mondta a forráskódomra, hogy olyan mintha C++-ban lenne, pedig akkor még nem is nagyon használtam struktúrákat sem.

(#5673) ToMmY_hun: C++-t Visual Studio-ban szeretném majd használni, azért tanulgatom, nem MCU-hoz.
(#5674) EQMontoya: Sok lúd disznót győz.
Meggyőztetek. 
(#5675) ToMmY_hun: Már azzal is baj van?

C-ben is lehet OO kódot írni, csak nehezebb, öröklést csinálni pedig undorító. Az OOP elveket viszont explicite nem támogatja a C, azaz egy C-s "osztályt" bármikor lehet szarul használni, C++-ban többé-kevésbé a használójára rá lehet kényszeríteni a "jó" használatot. Legalábbis dióhéjban ennyi.
(#5675) ToMmY_hun
C++-ban szerintem gátlástalanul lehet
return-ölni akárhonnan. C-ben vigyázni kell, mert lehet, hogy pl. hibajelzésre használt visszatérés előtt fel kéne szabadítani valami erőforrásokat, és nem történik meg automatikusan. Erre (C-s kivételkezelés) majd fogok szülni egy másik hsz-t, még agotokapcsán. -
maestro87
őstag
++itök mást csinál.continueigazából arra való, hogy ne legyen annyi egymásba ágyazás. A fenti kód így írható át:void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(primes[i]>=2)
{
/* és egy rakás random utasítás */
if(is_prime(primes[i]))
printf("%d\n", primes[i]);
/* meg itt is sok utasítás */
}
}
}A bitb*szogatás nem az én területem, de tudomásom szerint a
continueasm-ben 1 db jump lesz, ugyanúgy, ahogy azifis.C++ C-hez képest nagyon sok mindent tud, amit neked első körben érdemes megnézned, az az objektumorientált tervezés.
Igen, közben rájöttem, hogy két egymásba ágyazott
if(vagy egyif-ben két feltétel) többet ehet memóriában is.Ha struktúrákat használok az nem nevezhető már objektumorientált programozásnak? Nekem egyszer valaki azt mondta a forráskódomra, hogy olyan mintha C++-ban lenne, pedig akkor még nem is nagyon használtam struktúrákat sem.

(#5673) ToMmY_hun: C++-t Visual Studio-ban szeretném majd használni, azért tanulgatom, nem MCU-hoz.
(#5674) EQMontoya: Sok lúd disznót győz.
Meggyőztetek. 
(#5675) ToMmY_hun: Már azzal is baj van?

-
ToMmY_hun
senior tag
Viszont ha már szóba jött a
continueakkor megkérdezem, hogy mit gondoltok areturnkifejezés többszöri felhasználásáról egy függvényen belül? Sokan ezt is elítélik, de én előszeretettel térek vissza hibát jelző értékkel argumentum ellenőrzés után kivételkezelést nem támogató függvények esetén.A "no push friday" mozgalmat pedig támogatom
Mennyivel nyugisabb lenne az utolsó munkanap.maestro87 Így már
jobbanjól hangzik, hajrá-hajrá!
-
EQMontoya
veterán
Én az ilyeneket mindig egy
++i-vel oldottam meg.
Amíg nem találok (csinálok) olyan példát, amiben tényleg hasznos lesz a continue(értsd. lerövidíti a kódot), addig csak olyan felvágós utasításként fogom kezelni.
Felvágós, mert szerintem kevesebben értik vagy később tanulják meg a használatát (mint most én is) és sokszor feleslegesen használják, mint pl. most te is a ++ihelyett.![;]](//cdn.rios.hu/dl/s/v1.gif)
Ráadásul a++iszerintem kevesebb utasításból áll, mint acontinue, mármint asm-re lefordítva.
Bár lehet mindjárt visszavonom az egészet, ahogy jobban nézegetem a kódodat.
Vissza is vontam, mertcontinuenélkül meghívná a függvényt a negatív számokra is, azaz kimaradna a tesztelés.
A C++-t is elkezdtem már tanulgatni, de még nem jöttem rá, hogy mitől jobb a C-nél, mit lehet C++-ban megoldani amit C-ben nem, vagy csak jóval bonyolultabban...
Van, amikor nincs ++i.

Pl, c++.ban:for(const auto& i : my_list) { ... }A continue-ban azt szeretjük, hogy az minden nyelven ugyanúgy működik.
És hidd el, azt mindenki érti, ha pedig a ciklus közepén a ciklusváltozóhoz nyúlsz, az:
-Sokkal kevéssé érthető
-Jobb helyen arconvágnak érte, mert nagyon veszélyes.Pl.
for(int i = 0; i < valami ; ++i)
{
if(zöld(tömb[i]) && pöttyös(tömb[i])) continue;
if(sarga(tömb[i]) && !csikos(tömb[i])) continue;
//do something here...
}Sok sikert ++i-vel.

-
ToMmY_hun
senior tag
Én az ilyeneket mindig egy
++i-vel oldottam meg.
Amíg nem találok (csinálok) olyan példát, amiben tényleg hasznos lesz a continue(értsd. lerövidíti a kódot), addig csak olyan felvágós utasításként fogom kezelni.
Felvágós, mert szerintem kevesebben értik vagy később tanulják meg a használatát (mint most én is) és sokszor feleslegesen használják, mint pl. most te is a ++ihelyett.![;]](//cdn.rios.hu/dl/s/v1.gif)
Ráadásul a++iszerintem kevesebb utasításból áll, mint acontinue, mármint asm-re lefordítva.
Bár lehet mindjárt visszavonom az egészet, ahogy jobban nézegetem a kódodat.
Vissza is vontam, mertcontinuenélkül meghívná a függvényt a negatív számokra is, azaz kimaradna a tesztelés.
A C++-t is elkezdtem már tanulgatni, de még nem jöttem rá, hogy mitől jobb a C-nél, mit lehet C++-ban megoldani amit C-ben nem, vagy csak jóval bonyolultabban...
Kereső algoritmusokban a keresett elem megtalálásakor hasznos lehet a
continue. Olyankor is, amikor előfeltételként vizsgálod a ciklusmagban egy számításigényes művelet elvégzésének szükségességét. (Erre írt példát EQMontoya).A mikrokontrollerek programozásához pedig nagyon kevés, speciális esetben van szükség C++ használatra. Komplexebb problémák megoldása során találkozhatsz vele, úgy mint például orvostechnikai berendezések, robotika stb. A "mitől job" kifejezés pedig nem a legcélszerűbb megfogalmazási módja a kérdésnek, nem jobb és nem is rosszabb, szimplán más a létezésének célja.

-
dobragab
addikt
Én az ilyeneket mindig egy
++i-vel oldottam meg.
Amíg nem találok (csinálok) olyan példát, amiben tényleg hasznos lesz a continue(értsd. lerövidíti a kódot), addig csak olyan felvágós utasításként fogom kezelni.
Felvágós, mert szerintem kevesebben értik vagy később tanulják meg a használatát (mint most én is) és sokszor feleslegesen használják, mint pl. most te is a ++ihelyett.![;]](//cdn.rios.hu/dl/s/v1.gif)
Ráadásul a++iszerintem kevesebb utasításból áll, mint acontinue, mármint asm-re lefordítva.
Bár lehet mindjárt visszavonom az egészet, ahogy jobban nézegetem a kódodat.
Vissza is vontam, mertcontinuenélkül meghívná a függvényt a negatív számokra is, azaz kimaradna a tesztelés.
A C++-t is elkezdtem már tanulgatni, de még nem jöttem rá, hogy mitől jobb a C-nél, mit lehet C++-ban megoldani amit C-ben nem, vagy csak jóval bonyolultabban...
++itök mást csinál.continueigazából arra való, hogy ne legyen annyi egymásba ágyazás. A fenti kód így írható át:void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(primes[i]>=2)
{
/* és egy rakás random utasítás */
if(is_prime(primes[i]))
printf("%d\n", primes[i]);
/* meg itt is sok utasítás */
}
}
}A bitb*szogatás nem az én területem, de tudomásom szerint a
continueasm-ben 1 db jump lesz, ugyanúgy, ahogy azifis.C++ C-hez képest nagyon sok mindent tud, amit neked első körben érdemes megnézned, az az objektumorientált tervezés.
-
maestro87
őstag
void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(i<2) continue;
if(is_prime(i)) printf("%d\n", i);
}
}Így a paraméterként kapott tömb negatív elemeire le sem fut a prímtesztelés, mert ugye nincs is értelme, lehet, hogy felkészítve sincs rá.
Teccikéteni?Hú, de nehezen ment c++ nélkül

Én az ilyeneket mindig egy
++i-vel oldottam meg.
Amíg nem találok (csinálok) olyan példát, amiben tényleg hasznos lesz a continue(értsd. lerövidíti a kódot), addig csak olyan felvágós utasításként fogom kezelni.
Felvágós, mert szerintem kevesebben értik vagy később tanulják meg a használatát (mint most én is) és sokszor feleslegesen használják, mint pl. most te is a ++ihelyett.![;]](//cdn.rios.hu/dl/s/v1.gif)
Ráadásul a++iszerintem kevesebb utasításból áll, mint acontinue, mármint asm-re lefordítva.
Bár lehet mindjárt visszavonom az egészet, ahogy jobban nézegetem a kódodat.
Vissza is vontam, mertcontinuenélkül meghívná a függvényt a negatív számokra is, azaz kimaradna a tesztelés.
A C++-t is elkezdtem már tanulgatni, de még nem jöttem rá, hogy mitől jobb a C-nél, mit lehet C++-ban megoldani amit C-ben nem, vagy csak jóval bonyolultabban...
-
dobragab
addikt
-
EQMontoya
veterán
Jaja, nehéz leszokni róla, gondolom, itt is hiányzott az std::vector, range based for, std::ostream

Na meg szerintem nem is ezt akartad írni

void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(primes[i]<2) continue;
if(is_prime(primes[i])) printf("%d\n", primes[i]);
}
}Óbazz!
Jogos.
Jóvan, péntek van. -
dobragab
addikt
void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(i<2) continue;
if(is_prime(i)) printf("%d\n", i);
}
}Így a paraméterként kapott tömb negatív elemeire le sem fut a prímtesztelés, mert ugye nincs is értelme, lehet, hogy felkészítve sincs rá.
Teccikéteni?Hú, de nehezen ment c++ nélkül

Jaja, nehéz leszokni róla, gondolom, itt is hiányzott az std::vector, range based for, std::ostream

Na meg szerintem nem is ezt akartad írni

void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(primes[i]<2) continue;
if(is_prime(primes[i])) printf("%d\n", primes[i]);
}
} -
EQMontoya
veterán
Nem vagyok már annyira kezdő, kb 5 éve hobbi szinten programozgatok mikrokontrollereket.

Nekem újra fordítja (már amikor bírja a szerverük).
De a kedvedért most gyorsan lefuttattam CodeBlocks-ban is, és az van amit mondtam, semmivel sem másabb a kimenetcontinuenélkül. Szerintem nézd át azt a kódot még egyszer.
Acontinueitt csak annyit csinál, hogy a feltételt még egyszer leellenőrzi a hatására ami már nem fog teljesülni a feltételben lévőa = a + 1miatt. Tehát itt semmi szerepét nem látom, ellenben az én példámmal ahol azifelőtt van értékadó utasítás is.void print_primes(int * primes, int lenght)
{
for(int i = 0; i < lenght; ++i)
{
if(i<2) continue;
if(is_prime(i)) printf("%d\n", i);
}
}Így a paraméterként kapott tömb negatív elemeire le sem fut a prímtesztelés, mert ugye nincs is értelme, lehet, hogy felkészítve sincs rá.
Teccikéteni?Hú, de nehezen ment c++ nélkül

-
ToMmY_hun
senior tag
Nem vagyok már annyira kezdő, kb 5 éve hobbi szinten programozgatok mikrokontrollereket.

Nekem újra fordítja (már amikor bírja a szerverük).
De a kedvedért most gyorsan lefuttattam CodeBlocks-ban is, és az van amit mondtam, semmivel sem másabb a kimenetcontinuenélkül. Szerintem nézd át azt a kódot még egyszer.
Acontinueitt csak annyit csinál, hogy a feltételt még egyszer leellenőrzi a hatására ami már nem fog teljesülni a feltételben lévőa = a + 1miatt. Tehát itt semmi szerepét nem látom, ellenben az én példámmal ahol azifelőtt van értékadó utasítás is.Oké, igazad van. Valóban figyelmetlen voltam
Kicsit félrevezető a TutorialsPoint-os kód, szerintem nem túl célszerű így demonstrálni a continue működését. -
maestro87
őstag
Nem vagyok már annyira kezdő, kb 5 éve hobbi szinten programozgatok mikrokontrollereket.

Nekem újra fordítja (már amikor bírja a szerverük).
De a kedvedért most gyorsan lefuttattam CodeBlocks-ban is, és az van amit mondtam, semmivel sem másabb a kimenetcontinuenélkül. Szerintem nézd át azt a kódot még egyszer.
Acontinueitt csak annyit csinál, hogy a feltételt még egyszer leellenőrzi a hatására ami már nem fog teljesülni a feltételben lévőa = a + 1miatt. Tehát itt semmi szerepét nem látom, ellenben az én példámmal ahol azifelőtt van értékadó utasítás is. -
ToMmY_hun
senior tag
Lehet online futtatni a kódot és ha kitörlöd a
continue-t ugyanaz lesz a kimenet. Aza = a + 1miatt nem printeli ki a 15-öt, nem acontinuemiatt.Értem, tehát akkor a
continueután elölről kezdődik a ciklus.
Akkor viszont ez a helyes példa kód a használatára:#include <stdio.h>
int main ()
{
/* local variable definition */
int a = 10;
/* do loop execution */
do
{
a++;
if( a == 15)
{
/* skip the iteration */
continue;
}
printf("value of a: %d\n", a);
} while( a < 20 );
return 0;
}Kimenetek:
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
value of a: 20continuenélkül itt tényleg kiírja a 15-öt is.Már van is egy ötletem hol tudnám ezt használni a jelenlegi kódom optimalizálására. Köszi.

"Lehet online futtatni a kódot és ha kitörlöd a continue-t ugyanaz lesz a kimenet."
Ahogy nézem nem fordítja újra a kódot az "Execute" hatására. Kezdőként inkább saját gépen játszadozz, abból is sok hasznos tapasztalatot lehet gyűjteni.

-
maestro87
őstag
Lehet online futtatni a kódot és ha kitörlöd a
continue-t ugyanaz lesz a kimenet. Aza = a + 1miatt nem printeli ki a 15-öt, nem acontinuemiatt.Értem, tehát akkor a
continueután elölről kezdődik a ciklus.
Akkor viszont ez a helyes példa kód a használatára:#include <stdio.h>
int main ()
{
/* local variable definition */
int a = 10;
/* do loop execution */
do
{
a++;
if( a == 15)
{
/* skip the iteration */
continue;
}
printf("value of a: %d\n", a);
} while( a < 20 );
return 0;
}Kimenetek:
value of a: 11
value of a: 12
value of a: 13
value of a: 14
value of a: 16
value of a: 17
value of a: 18
value of a: 19
value of a: 20continuenélkül itt tényleg kiírja a 15-öt is.Már van is egy ötletem hol tudnám ezt használni a jelenlegi kódom optimalizálására. Köszi.

-
ToMmY_hun
senior tag
Én ugyan C-ben még nem használtam
gotoutasítást, de sosem értettem, hogy miért félnek tőle az emberek.
Még talán assembly-ben is megkérdőjelezik a használatát, pedig ott tudtommal más megoldás nem nagyon van ciklusok létrehozására.Viszont a
continueutasítást valaki eltudná magyarázni, mert ebből nem nagyon értem. Ugyanaz lesz a kimenetcontinue-val és nélküle is, akkor meg minek bele?
Nem ugyanaz, mert a 15-öt nem printeli ki,
continuenélkül pedig megtenné. Annyi a lényege, hogy ciklusmagban lévőcontinueutasítás hatására a ciklustörzsből azonnal visszaugrik a végrehajtás a ciklus fejére. -
maestro87
őstag
Beszélgessünk a
goto-ról!Általános vélemény a
goto-ról, hogy kerülni kell, mint egyszeri kockának a napfényt, különben lesül a képünk. Sokan viszont azt mondják, hogy agotohasználata bizonyos esetekben egyszerűsíti és átláthatóbbá teszi a kódot, és egyáltalán nem lesz tőle spagettikód, ha ésszel használjuk. Ugyanúgy, ahogy acontinueés abreakis. Utóbbinál szerencsétlen, hogy ciklusoknál ésswitch-nél tök mást jelent, úgyhogy az szerintem is a gonosztól származik.Nekem erről egyértelmű a véleményem, de előbb halljuk, mit mondtok ti

Én ugyan C-ben még nem használtam
gotoutasítást, de sosem értettem, hogy miért félnek tőle az emberek.
Még talán assembly-ben is megkérdőjelezik a használatát, pedig ott tudtommal más megoldás nem nagyon van ciklusok létrehozására.Viszont a
continueutasítást valaki eltudná magyarázni, mert ebből nem nagyon értem. Ugyanaz lesz a kimenetcontinue-val és nélküle is, akkor meg minek bele?
-
EQMontoya
veterán
Beszélgessünk a
goto-ról!Általános vélemény a
goto-ról, hogy kerülni kell, mint egyszeri kockának a napfényt, különben lesül a képünk. Sokan viszont azt mondják, hogy agotohasználata bizonyos esetekben egyszerűsíti és átláthatóbbá teszi a kódot, és egyáltalán nem lesz tőle spagettikód, ha ésszel használjuk. Ugyanúgy, ahogy acontinueés abreakis. Utóbbinál szerencsétlen, hogy ciklusoknál ésswitch-nél tök mást jelent, úgyhogy az szerintem is a gonosztól származik.Nekem erről egyértelmű a véleményem, de előbb halljuk, mit mondtok ti

Szerintem C-ben lehet értelme, mert nem tudsz annyira egységbe zárni, és emiatt az adott ponton a lényegre koncentráló kódot írni, C++-ban szigorúan tilos, még akkor is, ha nem használunk exception-t.
-
maestro87
őstag
emp.dojegy három elemű tömb, amit inicializálni csak akkor tudsz, amikor létrehozod azempváltozót.Employee emp = {
"John Sample", 0, 2500,
{1, 1, 1970},
{1, 1, 1970},
{1, 1, 1970}
};Külön inicializálni már nem tudod, csak értéket adhatsz neki. Illetve nem is neki, mert C-ben nincs tömbök közötti értékadás, hanem az elemeinek, mégpedig egy létező dátumot:
date date0 = {1, 1, 1970};Ezután adhatsz értéket az
emp.dojelemeinek.emp.doj[0] = date0;
emp.doj[1] = date0;
emp.doj[2] = date0;Itt segítségedre lehet a C99 compound literal:
emp.doj[0] = (date){1, 1, 1970};Ha kinullázni szeretnéd egy struktúra adattagjait, akkor ez nem szabványos, normális fordító nem eszi meg:
date date0 = {};Ez viszont igen:
date date0 = {0};Így se jó, hogy külön adok az struktúra tömb elemeinek értéket.

Ha kiveszem az értékadást, akkor lefordítja, más különben nem.
Csak akkor jó ha egyesével adok minden legbelső elemnek is értéket, az meg nem játszik.Ez a C99 compound literal tulajdonképpen mire is jó?
-
ToMmY_hun
senior tag
Beszélgessünk a
goto-ról!Általános vélemény a
goto-ról, hogy kerülni kell, mint egyszeri kockának a napfényt, különben lesül a képünk. Sokan viszont azt mondják, hogy agotohasználata bizonyos esetekben egyszerűsíti és átláthatóbbá teszi a kódot, és egyáltalán nem lesz tőle spagettikód, ha ésszel használjuk. Ugyanúgy, ahogy acontinueés abreakis. Utóbbinál szerencsétlen, hogy ciklusoknál ésswitch-nél tök mást jelent, úgyhogy az szerintem is a gonosztól származik.Nekem erről egyértelmű a véleményem, de előbb halljuk, mit mondtok ti

Nekem az a tapasztalatom, hogy a spagetti kód nem a
gotomiatt lesz olyan, amilyen. A megfelelő szépérzékkel és odafigyeléssel bizonyos esetekben valóban szebb és átláthatóbb kódot lehet írni vele, de amiatt, mert nagyon nagy odafigyelést igényel, a használata nem célszerű. Viszont vannak olyan programnyelvek, amelyeknél agotomegkerülhetetlen. Ilyen például a VBA (Visual Basic for Applications), amelyben a hibakezeléshez biztosan, de ha jól emlékszem bizonyos esetekben acontinuehelyett is csakgotohasználható. Egyébként egy jól formázott és strukturált kódnál nem hiszem hogy nagy jelentősége lenne a kérdésnek. Nem szokás több száz soros függvényeket írni, sokkal célszerűbb kisebb darabokra vágni azokat, hiszen így sokkal átláthatóbb és nem utolsó sorban könnyen tesztelhető kód lesz az eredmény. -
dobragab
addikt
Beszélgessünk a
goto-ról!Általános vélemény a
goto-ról, hogy kerülni kell, mint egyszeri kockának a napfényt, különben lesül a képünk. Sokan viszont azt mondják, hogy agotohasználata bizonyos esetekben egyszerűsíti és átláthatóbbá teszi a kódot, és egyáltalán nem lesz tőle spagettikód, ha ésszel használjuk. Ugyanúgy, ahogy acontinueés abreakis. Utóbbinál szerencsétlen, hogy ciklusoknál ésswitch-nél tök mást jelent, úgyhogy az szerintem is a gonosztól származik.Nekem erről egyértelmű a véleményem, de előbb halljuk, mit mondtok ti

-
EQMontoya
veterán
Elég baba lett ez az új formázás.

-
dobragab
addikt
Nem tudom működésre bírni.

Eddig csak úgy ment, hogy a fő struktúrán kívül is deklaráltam illetve extern taggal kivittem másik fájlba, de akkor szerintem az nem ugyanaz a változó volt mint a struktúrában lévő. Egyébként eeprom-ba íráshoz kellene, hogy a struktúrában lévő elemeket egy függvényhívással be tudjam írni, ne kelljen minden elemnél külön meghívni az eeprom-ba író függvényt.emp.dojegy három elemű tömb, amit inicializálni csak akkor tudsz, amikor létrehozod azempváltozót.Employee emp = {
"John Sample", 0, 2500,
{1, 1, 1970},
{1, 1, 1970},
{1, 1, 1970}
};Külön inicializálni már nem tudod, csak értéket adhatsz neki. Illetve nem is neki, mert C-ben nincs tömbök közötti értékadás, hanem az elemeinek, mégpedig egy létező dátumot:
date date0 = {1, 1, 1970};Ezután adhatsz értéket az
emp.dojelemeinek.emp.doj[0] = date0;
emp.doj[1] = date0;
emp.doj[2] = date0;Itt segítségedre lehet a C99 compound literal:
emp.doj[0] = (date){1, 1, 1970};Ha kinullázni szeretnéd egy struktúra adattagjait, akkor ez nem szabványos, normális fordító nem eszi meg:
date date0 = {};Ez viszont igen:
date date0 = {0}; -
maestro87
őstag
Nem tudom működésre bírni.

Eddig csak úgy ment, hogy a fő struktúrán kívül is deklaráltam illetve extern taggal kivittem másik fájlba, de akkor szerintem az nem ugyanaz a változó volt mint a struktúrában lévő. Egyébként eeprom-ba íráshoz kellene, hogy a struktúrában lévő elemeket egy függvényhívással be tudjam írni, ne kelljen minden elemnél külön meghívni az eeprom-ba író függvényt. -
buherton
őstag
Ezt így nem fordítja le.
Szintaktikai hiba, nincs azonosító a deklarációban stb.
Pontosabban az én kódom így néz ki lefordítva erre a példára:header fájlban:
typedef struct
{
int date;
int month;
int year;
} date;
typedef struct
{
char ename[20];
int ssn;
float salary;
date doj[3];
} Employee;
Employee emp;A main függvénybe írva ezt, nem működik:
emp.date[]=
{
{,,},
{,,},
{,,}
};A pointer-est hogy gondoltad?
Így próbáld meg
mp.doj[]=
{
{,,},
{,,},
{,,}
};Valahogy így:
typedef struct
{
int date;
int month;
int year;
} date;
typedef struct
{
char ename[20];
int ssn;
float salary;
date (*doj)[3];
} Employee;
date foo = ...;
Employee emp;
emp.doj[0] = &foo;Nem próbáltam lefordítani.
-
maestro87
őstag
Ezt így nem fordítja le.
Szintaktikai hiba, nincs azonosító a deklarációban stb.
Pontosabban az én kódom így néz ki lefordítva erre a példára:header fájlban:
typedef struct
{
int date;
int month;
int year;
} date;
typedef struct
{
char ename[20];
int ssn;
float salary;
date doj[3];
} Employee;
Employee emp;A main függvénybe írva ezt, nem működik:
emp.date[]=
{
{,,},
{,,},
{,,}
};A pointer-est hogy gondoltad?
Utolsót elírtam. Természetesen immáron emp.doj[]-t írtam nem emp.date[]-t.
-
maestro87
őstag
Ezt így nem fordítja le.
Szintaktikai hiba, nincs azonosító a deklarációban stb.
Pontosabban az én kódom így néz ki lefordítva erre a példára:header fájlban:
typedef struct
{
int date;
int month;
int year;
} date;
typedef struct
{
char ename[20];
int ssn;
float salary;
date doj[3];
} Employee;
Employee emp;A main függvénybe írva ezt, nem működik:
emp.date[]=
{
{,,},
{,,},
{,,}
};A pointer-est hogy gondoltad?
-
buherton
őstag
Sziasztok!
Adott egy hasonló struktúra (ezt a netről szedtem):
struct Employee
{
char ename[20];
int ssn;
float salary;
struct date
{
int date;
int month;
int year;
}doj[3];
}emp = {"Pritesh",1000,1000.50,{{22,6,1990},{10,7,1980},{27,9,1970}}};A kérdésem az lenne, hogy csak a date struktúra tömböt (doj változót) hogyan lehet egy másik fájlban alapértékekkel feltölteni? Külön-külön tudom hogy kell az elemekre hivatkozni, de én egyszerre szeretném feltölteni, az értékeket kapcsos zárójelek között megadva.
A tippem ez lenne, de valamiért nem akar működni:
extern struct date doj[3] =
{
{22,6,1990},
{10,7,1980},
{27,9,1970},
};Annyi eltérés van az én kódomban, hogy én typedef-fel kívül hoztam létre a "date" struktúrát.
Előre is köszi a válaszokat!
Definiálod a struktúrát, létrehozod a változót és majdan így adsz annak értéket valahogy: emp.date[] = {}; Érdemes memsettel rögötn nullázni is.
MOD: miért nem pointer a date és akkor a probléma le lenne tudva. Sőt jobb, ha egy láncolt listát csinálsz és kész.
-
maestro87
őstag
Sziasztok!
Adott egy hasonló struktúra (ezt a netről szedtem):
struct Employee
{
char ename[20];
int ssn;
float salary;
struct date
{
int date;
int month;
int year;
}doj[3];
}emp = {"Pritesh",1000,1000.50,{{22,6,1990},{10,7,1980},{27,9,1970}}};A kérdésem az lenne, hogy csak a date struktúra tömböt (doj változót) hogyan lehet egy másik fájlban alapértékekkel feltölteni? Külön-külön tudom hogy kell az elemekre hivatkozni, de én egyszerre szeretném feltölteni, az értékeket kapcsos zárójelek között megadva.
A tippem ez lenne, de valamiért nem akar működni:
extern struct date doj[3] =
{
{22,6,1990},
{10,7,1980},
{27,9,1970},
};Annyi eltérés van az én kódomban, hogy én typedef-fel kívül hoztam létre a "date" struktúrát.
Előre is köszi a válaszokat!
-
dobragab
addikt
-
EQMontoya
veterán
sziasztok,
[link] - alábbi feladatot sikerült megoldanom, de mégsem tiszta néhány dolog, így inkább kérdezek

az a verzió, ami működik:
_______________________________________
int amper( char *line)
{
char *tok, *amp;
int szam, szorzo, eredmeny;
tok=strtok(line, " ");
szam=atoi(tok);
amp=strtok(NULL, "\0");
if((strcmp(amp, "A")) == 0){
eredmeny = (szam);
}
if((strcmp(amp, "kA")) == 0){
eredmeny = (szam*1000);
}
if((strcmp(amp, "mA")) == 0){
eredmeny = (szam/1000);
}
return eredmeny;
}az a verzió, ami valamiért nem:
_______________________________________
int amper( char *line)
{
char *amp;
int szam, szorzo, eredmeny;
sscanf(line, "%d %s", &szam, amp);
// printf("szam: %d\tegyseg: %s\n", szam, amp);
if((strcmp(amp, "A")) == 0){
eredmeny = (szam);
}
if((strcmp(amp, "kA")) == 0){
eredmeny = (szam*1000);
}
if((strcmp(amp, "mA")) == 0){
eredmeny = (szam/1000);
}
return eredmeny;
}gondoltam, csak gyorsabb volna egyetlen művelettel tárolni mindkét értéket. erre való az sscanf vagy tévedek? valamiért mégis kifagy a program ezzel a verzióval...
tárgytalan, bocsi....az amp itt tömb, nem mutató.....
A kapcsolat nem biztonságos
Rendszergazdát picsánrúg, feladatot máshová felteszi...

-
bepken
veterán
sziasztok,
[link] - alábbi feladatot sikerült megoldanom, de mégsem tiszta néhány dolog, így inkább kérdezek

az a verzió, ami működik:
_______________________________________
int amper( char *line)
{
char *tok, *amp;
int szam, szorzo, eredmeny;
tok=strtok(line, " ");
szam=atoi(tok);
amp=strtok(NULL, "\0");
if((strcmp(amp, "A")) == 0){
eredmeny = (szam);
}
if((strcmp(amp, "kA")) == 0){
eredmeny = (szam*1000);
}
if((strcmp(amp, "mA")) == 0){
eredmeny = (szam/1000);
}
return eredmeny;
}az a verzió, ami valamiért nem:
_______________________________________
int amper( char *line)
{
char *amp;
int szam, szorzo, eredmeny;
sscanf(line, "%d %s", &szam, amp);
// printf("szam: %d\tegyseg: %s\n", szam, amp);
if((strcmp(amp, "A")) == 0){
eredmeny = (szam);
}
if((strcmp(amp, "kA")) == 0){
eredmeny = (szam*1000);
}
if((strcmp(amp, "mA")) == 0){
eredmeny = (szam/1000);
}
return eredmeny;
}gondoltam, csak gyorsabb volna egyetlen művelettel tárolni mindkét értéket. erre való az sscanf vagy tévedek? valamiért mégis kifagy a program ezzel a verzióval...
tárgytalan, bocsi....az amp itt tömb, nem mutató.....
-
LógaGéza
veterán
-
EQMontoya
veterán
-
LógaGéza
veterán
Üdv!
Kicsit ide is tartozik a kérdésem, hátha itt találok megoldást, Arduino topikban már próbálkoztamSzóval ezt szeretném életre kelteni. Amikor a LEDSign.ino-t fordítanám, akkor kiakad a következő hibával:
LEDSign:195: error: 'lineInput' was not declared in this scopeHogyan tudnám ezt megoldani? Annyira jöttem rá, hogy maga a lineInput a mellette lévő LineInput.ino-ban van leírva. Hogy miért, azt nem tudom, de biztos oka volt rá a fejlesztőnek

Köszönöm előre is a segítséget!

Sztornó, túl egyszerű volt a megoldás... Meg kellett nyitni az IDE-ben egy másik fülön a LineInput.ino-t...

-
LógaGéza
veterán
Üdv!
Kicsit ide is tartozik a kérdésem, hátha itt találok megoldást, Arduino topikban már próbálkoztamSzóval ezt szeretném életre kelteni. Amikor a LEDSign.ino-t fordítanám, akkor kiakad a következő hibával:
LEDSign:195: error: 'lineInput' was not declared in this scopeHogyan tudnám ezt megoldani? Annyira jöttem rá, hogy maga a lineInput a mellette lévő LineInput.ino-ban van leírva. Hogy miért, azt nem tudom, de biztos oka volt rá a fejlesztőnek

Köszönöm előre is a segítséget!

-
bepken
veterán
"utolsó sor után nincs új sor, ahogy kéri is a feladatban"
Nem, nem ezt kéri. Azt kéri, hogy azután ne legyen üres sor. A \n-nek attól még ott kellene lennie az utolsó sor végén is.
Egyébként valami rettenetesen béna compare toolt használhatsz, mert egy sima diff ezt mondja:
$ diff ref.txt out.txt
13c13
< ****
---
> ****
\ No newline at end of fileEnnyi.
Ha megnézed őket mondjuk egy hexa editorral, hogy láss minden byte-ot, akkor is látszik, hogy összesen ennyi különbség van.
Sőt, ha megnézem a forráskódodat, akkor is látszik, hogy ez a gond

hogyaza....korábban puts("\n"); -val próbálkoztam a legvégén putchar('\n'); helyett és olyankor dupla soremelést tett a végére (ami nyilván hibás) - viszont ha meg csak putchar-ral zártam a végét, akkor a két hatos közé nem tett üres sort. innentől meg csak forgattam magam, hogy végülis a feladat is ezt várja. ráadásul ahogy bemásoltam ide is, parancssorban kiíratva a kimenet is teljesen azonos volt (jól sejtem, hogy a cmd tesz be automatikusan egy üres sort, ha hiányzik a fájl végéről és úgy írja ki a fájl tartalmát? mert akkor ez kavart be)
na lényeg, hogy végül ez volt a kínja. köszönöm szépen a segítséget!

(tudom, hogy nagy hiba, de windows alatt tanulom a C-t, itt meg hirtelen csak ilyen compare cuccot találtam. mondjuk itt is van sokféle kapcsoló, lehet találnék olyat, ami pontosabban megtalálja a különbséget)
-
dabadab
titán
csak bemásoltam, hogy hogyan is kell kinéznie, de sorra megyezik a két kimenet (utolsó sor után nincs új sor, ahogy kéri is a feladatban) - vagy legalábbis én értelmezésem szerint ezt kéri a feladat.
és esküszöm nem értem, miért nem jó ez így, de file compare eredményt is tudok mutatni:
E:\program\2\Új mappa>fc /n out.txt out2.txt
Comparing files out.txt and OUT2.TXT
***** out.txt
1: ***
2: *
3: ***
4: * *
5: ***
6:
***** OUT2.TXT
1: ***
2: *
3: ***
4: * *
5: ***
6:
*****
***** out.txt
7: ****
8: *
9: *
10: ****
11: * *
12: * *
13: ****
***** OUT2.TXT
7: ****
8: *
9: *
10: ****
*****
***** out.txt
***** OUT2.TXT
11: * *
12: * *
13: ****
*****__________________________________________________
ez meg a két fájl egymás után:
E:\program\2\Új mappa>more out.txt
***
*
***
* *
***
****
*
*
****
* *
* *
****
E:\program\2\Új mappa>more out2.txt
***
*
***
* *
***
****
*
*
****
* *
* *
****
E:\program\2\Új mappa>bocsi, ha értetlenkedek, de nagyon idegesít a dolog és szeretném megérteni a problémát. én kétszer ugyanazt a kimenetet látom

szerk.: out.txt az enyém, OUT2.txt pedig a referencia
"utolsó sor után nincs új sor, ahogy kéri is a feladatban"
Nem, nem ezt kéri. Azt kéri, hogy azután ne legyen üres sor. A \n-nek attól még ott kellene lennie az utolsó sor végén is.
Egyébként valami rettenetesen béna compare toolt használhatsz, mert egy sima diff ezt mondja:
$ diff ref.txt out.txt
13c13
< ****
---
> ****
\ No newline at end of fileEnnyi.
Ha megnézed őket mondjuk egy hexa editorral, hogy láss minden byte-ot, akkor is látszik, hogy összesen ennyi különbség van.
Sőt, ha megnézem a forráskódodat, akkor is látszik, hogy ez a gond

-
bepken
veterán
csak bemásoltam, hogy hogyan is kell kinéznie, de sorra megyezik a két kimenet (utolsó sor után nincs új sor, ahogy kéri is a feladatban) - vagy legalábbis én értelmezésem szerint ezt kéri a feladat.
és esküszöm nem értem, miért nem jó ez így, de file compare eredményt is tudok mutatni:
E:\program\2\Új mappa>fc /n out.txt out2.txt
Comparing files out.txt and OUT2.TXT
***** out.txt
1: ***
2: *
3: ***
4: * *
5: ***
6:
***** OUT2.TXT
1: ***
2: *
3: ***
4: * *
5: ***
6:
*****
***** out.txt
7: ****
8: *
9: *
10: ****
11: * *
12: * *
13: ****
***** OUT2.TXT
7: ****
8: *
9: *
10: ****
*****
***** out.txt
***** OUT2.TXT
11: * *
12: * *
13: ****
*****__________________________________________________
ez meg a két fájl egymás után:
E:\program\2\Új mappa>more out.txt
***
*
***
* *
***
****
*
*
****
* *
* *
****
E:\program\2\Új mappa>more out2.txt
***
*
***
* *
***
****
*
*
****
* *
* *
****
E:\program\2\Új mappa>bocsi, ha értetlenkedek, de nagyon idegesít a dolog és szeretném megérteni a problémát. én kétszer ugyanazt a kimenetet látom

szerk.: out.txt az enyém, OUT2.txt pedig a referencia
-
dabadab
titán
közben elérhető ujra az oldal (egy ideig csak)
tehát megnéztem és van egy ilyen rész a leírásban: "Mindegyik sorban közvetlenül soremelés követi a legutoljára kiírt csillag karaktert (azaz nem szerepelnek a sorok végén szóközök). A tesztesetekhez tartozó kimeneteket egy-egy üres sor választja el egymástól. Figyelem: az utolsó számjegyet nem követi üres sor!"példa kimenet:
***
*
***
* *
***
****
*
*
****
* *
* *
****ezt én sima '\n' megoldásnak értelmezem. öhm vagy miért jobb neki a \r

A kettő között annyi a különbség, hogy a tiedben a legutolsó sor végén nincs \n, a megadott referenciánál meg van.
-
EQMontoya
veterán
közben elérhető ujra az oldal (egy ideig csak)
tehát megnéztem és van egy ilyen rész a leírásban: "Mindegyik sorban közvetlenül soremelés követi a legutoljára kiírt csillag karaktert (azaz nem szerepelnek a sorok végén szóközök). A tesztesetekhez tartozó kimeneteket egy-egy üres sor választja el egymástól. Figyelem: az utolsó számjegyet nem követi üres sor!"példa kimenet:
***
*
***
* *
***
****
*
*
****
* *
* *
****ezt én sima '\n' megoldásnak értelmezem. öhm vagy miért jobb neki a \r

\r\n: windows standard
\n: linux standardEnnek oda-vissza konvertálására van a dos2unix parancs benne minden bashban.

-
bepken
veterán
Nem lehet, hogy azert nem fogadja el, mert a felso reszen a fuggoleges sza'r utan (bal oldalt elso csillag) utan nincsen a maradek resz szokozzel kitoltve, hanem egybol a sorvege jel jon?
Ranezesre ugyanaz, de diff mar attol fuggoen mutatja jonak vagy sem, hogy mi a whitespace-ekre vonatkozo beallitasa vayg default-ja.
[Mondjuk ettol pont rovidebb lenne...]közben elérhető ujra az oldal (egy ideig csak)
tehát megnéztem és van egy ilyen rész a leírásban: "Mindegyik sorban közvetlenül soremelés követi a legutoljára kiírt csillag karaktert (azaz nem szerepelnek a sorok végén szóközök). A tesztesetekhez tartozó kimeneteket egy-egy üres sor választja el egymástól. Figyelem: az utolsó számjegyet nem követi üres sor!"példa kimenet:
***
*
***
* *
***
****
*
*
****
* *
* *
****ezt én sima '\n' megoldásnak értelmezem. öhm vagy miért jobb neki a \r

-
EQMontoya
veterán
Sorvége jelek (\r\n vs \n) is különbözhetnek, amit nem fogsz látni, de a méret mégsem stimmel.

Csak tipp, a fileokat nem tudom megnézni innen. -
axioma
veterán
sziasztok,
egy újabb feladattal kapcsolatban lenne kérdésem hozzátok: [link]
ez pedig a megoldásom: [link]
ha lementem a példa kimenetet és összehasonlítom az én kimenetemmel, akkor ránézésre teljesen egyezik. feladat szerint pedig annyi az elvárás, hogy minden "hatos" egy sorral legyen elválasztva, de utolsó után már nem kell üres sor.
szerintem (!) az enyém ennek megfelel - bár file compare szerint az én kimeneti fájlom "hosszabb"....valószínűleg ezért van az, hogy a progcont se fogadja el.
mi lehet ennek az oka?
köszi előre is,
bepkenNem lehet, hogy azert nem fogadja el, mert a felso reszen a fuggoleges sza'r utan (bal oldalt elso csillag) utan nincsen a maradek resz szokozzel kitoltve, hanem egybol a sorvege jel jon?
Ranezesre ugyanaz, de diff mar attol fuggoen mutatja jonak vagy sem, hogy mi a whitespace-ekre vonatkozo beallitasa vayg default-ja.
[Mondjuk ettol pont rovidebb lenne...] -
bepken
veterán
ja....vizsga van ma, ilyenkor lelövik valamiért az egészet...
feladat nagyjából: bemenet első sora a feldolgozandó esetek száma. minden sorra egy N•M méretű "hatost" kell kirajzolni '*' karakterekből. N páratlan, N >= 5, illetve M >= 3
példa bemenet:
2
5 3
7 4 -
dabadab
titán
sziasztok,
egy újabb feladattal kapcsolatban lenne kérdésem hozzátok: [link]
ez pedig a megoldásom: [link]
ha lementem a példa kimenetet és összehasonlítom az én kimenetemmel, akkor ránézésre teljesen egyezik. feladat szerint pedig annyi az elvárás, hogy minden "hatos" egy sorral legyen elválasztva, de utolsó után már nem kell üres sor.
szerintem (!) az enyém ennek megfelel - bár file compare szerint az én kimeneti fájlom "hosszabb"....valószínűleg ezért van az, hogy a progcont se fogadja el.
mi lehet ennek az oka?
köszi előre is,
bepken"egy újabb feladattal kapcsolatban lenne kérdésem hozzátok: [link]"
404

-
bepken
veterán
sziasztok,
egy újabb feladattal kapcsolatban lenne kérdésem hozzátok: [link]
ez pedig a megoldásom: [link]
ha lementem a példa kimenetet és összehasonlítom az én kimenetemmel, akkor ránézésre teljesen egyezik. feladat szerint pedig annyi az elvárás, hogy minden "hatos" egy sorral legyen elválasztva, de utolsó után már nem kell üres sor.
szerintem (!) az enyém ennek megfelel - bár file compare szerint az én kimeneti fájlom "hosszabb"....valószínűleg ezért van az, hogy a progcont se fogadja el.
mi lehet ennek az oka?
köszi előre is,
bepken -
dobragab
addikt
Üdv!
Szerintem akkor jársz legjobban, ha előbb C-t tanulod meg, onnan már az AVR-specifikus dolgok könnyebben jönnek. C-t meg szerintem innen érdemes, elsősorban előadások anyagai.
-
bear_
aktív tag
Sziasztok,
AVR-t szeretnék programozni C nyelven, ehhez keresek könyvet, tutorialt, akár angolul is. Sajnos amit a neten találtam nem igazán "kezdő" barát.
Előre is köszi

-
alapz@j
tag
Ha már optimalizálunk, akkor csináljuk rendesen:
switch(c)
{
case 'a':
case 'e:
case 'i':
case 'o':
case 'u':
case 'A':
case 'E:
case 'I':
case 'O':
case 'U':
return 1;
default:
return 0;
}vagy ha van valakinek türelme egy 256 elemű tömböt teleírni egyesekkel meg nullákkal:
return maganhangzok[ c ];
Na, a babakódom

#include <string.h>
char maganhangzok[] = "aeiouAEIOU";
char betuk[256];
void setup_betuk(void) {
memset(betuk, 0, 256);
size_t len = strlen(maganhangzok);
for (size_t x = 0; x < len; ++x) betuk[maganhangzok[x]] = 1;
}
inline char maganhangzo_e(char x) {
return betuk[x];
} -
alapz@j
tag
Ha már optimalizálunk, akkor csináljuk rendesen:
switch(c)
{
case 'a':
case 'e:
case 'i':
case 'o':
case 'u':
case 'A':
case 'E:
case 'I':
case 'O':
case 'U':
return 1;
default:
return 0;
}vagy ha van valakinek türelme egy 256 elemű tömböt teleírni egyesekkel meg nullákkal:
return maganhangzok[ c ];
Nem kell kézzel megcsinálni, memset-eled nullával a betuk[256]-ot aztán egy ciklussal a magánhangzók ascii értékeinek megfelelő bájtokba egyeseket írsz

-
matthew95(2)
senior tag
Üdv!
Esetleg van valaki itt aki c-t át tudna kódolni c#-ba? Elég fontos illetve sürgős lenne
Nem hosszú kód, esetleg ha van valaki mindenképp írjon legyen szíves. Előre is köszi 
-
dobragab
addikt
-
EQMontoya
veterán
Babakódot írunk C-ben.

Ha gyorsra akarom írni, C++-ban fogom, és egy csomó dolgot beletolok fordítási időben. -
dabadab
titán
Ha már optimalizálunk, akkor csináljuk rendesen:
switch(c)
{
case 'a':
case 'e:
case 'i':
case 'o':
case 'u':
case 'A':
case 'E:
case 'I':
case 'O':
case 'U':
return 1;
default:
return 0;
}vagy ha van valakinek türelme egy 256 elemű tömböt teleírni egyesekkel meg nullákkal:
return maganhangzok[ c ];
-
alapz@j
tag
Írjsz egy függvényt, ami megmondja egy char-ról, hogy magánhangzó-e:
#include <ctype.h>
#include <stdio.h>
static char * maganhangzok = "aeiou";
int maganhangzo(char c)
{
int i = 0;
for(; i < strlen(maganhangzok); ++i)
{
if(maganhangzok[i] == tolower(c)) return 1;
}
return 0;
}Ha ez megvan, akkor az eredeti tömbbön végigfutsz ezzel, és megnézed, hogy mennyi magánhangzód van.
Ezt követően azt szétszeded két tömbre, amit aztán használsz.
Utána pedig a feltöltésnél karbantartasz két indexet, és azokat lépteted annak függvényében, hogy a ciklusváltozód páros vagy páratlan.int i=0;
int msh_idx = 0;
int mgh_idx = 0;
for(;i<celtomb_hossza -1 ; ++i)
{
if(i%2 == 0)
{
celtomb[i] = msh_tomb[msh_idx];
msh_idx = (msh_idx + 1) % msh_tomb_hossza; //strlen?
}
else
{
celtomb[i] = mgh_tomb[mgh_idx];
mgh_idx = (mgh_idx + 1) % mgh_tomb_hossza; //strlen?
}
}
//lezaro nulla ne maradjon le! :)for(size_t i = 0; i < strlen(maganhangzok); ++i)
Ezt a formát azért nem ajánlanám, mert minden egyes iterációban kiértékeli az strlen()-t, ami eléggé lelassítja a működést.
-
armin80
csendes tag
sziasztok!
a következő feladatban kérnék segítséget:
van 3 karaktertömböm (pl.: byte elso[]="szia", byte masodik[]="hello",...), amit 3 másodpercenként szeretnék egymás után kiíratni.
köszi! -
EQMontoya
veterán
char str1[]="AEBCD", str2[37]= {0};
Ebből a sorból derül ki ez, nem? Tehát van egyszer AE, valamint BCD és a lezáró nulla. Ezeket kell bedobálni a második stringbe, ami 37 elemű, tehát str2[0]...str2[36]. A nulladik hely gondolom párosnak számít, bár most nekem az nem világos, hogy ha végig nézi az első stringet, abban van 5 darab betű. Ezeket beírja az str2 megfelelő helyeire:
str2[0] → B
str2[1] → A
str2[2] → C
str2[3] → E
str2[4] → D
str2[5] → \0akkor a második string miért nem csak 6 elemű? Vagy most a "while(*p1)" az nem csak az első string végéig fut? És a lezáró nullával mi lesz?
Ja most látom, hogy a kérdés éppen erre irányul, hogy hogyan töltse fel végig a stringet. Akkor a feladat adott: van 5 karaktered és a lezáró nulla, az első 36 helyre írd be a megfelelő magánhangzót vagy mássalhangzót attól függően, hogy páros vagy páratlan indexen állsz-e, majd végül a 37. helyre dobd be a lezáró nullát.
Írjsz egy függvényt, ami megmondja egy char-ról, hogy magánhangzó-e:
#include <ctype.h>
#include <stdio.h>
static char * maganhangzok = "aeiou";
int maganhangzo(char c)
{
int i = 0;
for(; i < strlen(maganhangzok); ++i)
{
if(maganhangzok[i] == tolower(c)) return 1;
}
return 0;
}Ha ez megvan, akkor az eredeti tömbbön végigfutsz ezzel, és megnézed, hogy mennyi magánhangzód van.
Ezt követően azt szétszeded két tömbre, amit aztán használsz.
Utána pedig a feltöltésnél karbantartasz két indexet, és azokat lépteted annak függvényében, hogy a ciklusváltozód páros vagy páratlan.int i=0;
int msh_idx = 0;
int mgh_idx = 0;
for(;i<celtomb_hossza -1 ; ++i)
{
if(i%2 == 0)
{
celtomb[i] = msh_tomb[msh_idx];
msh_idx = (msh_idx + 1) % msh_tomb_hossza; //strlen?
}
else
{
celtomb[i] = mgh_tomb[mgh_idx];
mgh_idx = (mgh_idx + 1) % mgh_tomb_hossza; //strlen?
}
}
//lezaro nulla ne maradjon le! :) -
dobozs
csendes tag
char str1[]="AEBCD", str2[37]= {0};
Ebből a sorból derül ki ez, nem? Tehát van egyszer AE, valamint BCD és a lezáró nulla. Ezeket kell bedobálni a második stringbe, ami 37 elemű, tehát str2[0]...str2[36]. A nulladik hely gondolom párosnak számít, bár most nekem az nem világos, hogy ha végig nézi az első stringet, abban van 5 darab betű. Ezeket beírja az str2 megfelelő helyeire:
str2[0] → B
str2[1] → A
str2[2] → C
str2[3] → E
str2[4] → D
str2[5] → \0akkor a második string miért nem csak 6 elemű? Vagy most a "while(*p1)" az nem csak az első string végéig fut? És a lezáró nullával mi lesz?
Ja most látom, hogy a kérdés éppen erre irányul, hogy hogyan töltse fel végig a stringet. Akkor a feladat adott: van 5 karaktered és a lezáró nulla, az első 36 helyre írd be a megfelelő magánhangzót vagy mássalhangzót attól függően, hogy páros vagy páratlan indexen állsz-e, majd végül a 37. helyre dobd be a lezáró nullát.
Igen, ez lenne a feladat.
-
#36268800
törölt tag
char str1[]="AEBCD", str2[37]= {0};
Ebből a sorból derül ki ez, nem? Tehát van egyszer AE, valamint BCD és a lezáró nulla. Ezeket kell bedobálni a második stringbe, ami 37 elemű, tehát str2[0]...str2[36]. A nulladik hely gondolom párosnak számít, bár most nekem az nem világos, hogy ha végig nézi az első stringet, abban van 5 darab betű. Ezeket beírja az str2 megfelelő helyeire:
str2[0] → B
str2[1] → A
str2[2] → C
str2[3] → E
str2[4] → D
str2[5] → \0akkor a második string miért nem csak 6 elemű? Vagy most a "while(*p1)" az nem csak az első string végéig fut? És a lezáró nullával mi lesz?
Ja most látom, hogy a kérdés éppen erre irányul, hogy hogyan töltse fel végig a stringet. Akkor a feladat adott: van 5 karaktered és a lezáró nulla, az első 36 helyre írd be a megfelelő magánhangzót vagy mássalhangzót attól függően, hogy páros vagy páratlan indexen állsz-e, majd végül a 37. helyre dobd be a lezáró nullát.
-
EQMontoya
veterán
Van két stringed, az egyikből kiolvasod sorban a karaktereket és
ha magánhangzót találsz, akkor azt beírod a másik string páratlan indexű helyeire (string2: [1] ... [3] ... [5]),
...aAeEiIoOuU
ha mássalhangzót találsz, akkor azt beírod a másik string páros indexű helyeire (string2: [2] ... [4] ... [6]),
...egyebek.Olyasmit nem kell vizsgálni vajon, hogy biztosan betűk másolódjanak az új stringbe?
És felteheted, hogy ugyanannyi mássalhangzó és magánhangzó van a forrás stringben?
-
#36268800
törölt tag
Van két stringed, az egyikből kiolvasod sorban a karaktereket és
ha magánhangzót találsz, akkor azt beírod a másik string páratlan indexű helyeire (string2: [1] ... [3] ... [5]),
...aAeEiIoOuU
ha mássalhangzót találsz, akkor azt beírod a másik string páros indexű helyeire (string2: [2] ... [4] ... [6]),
...egyebek.Olyasmit nem kell vizsgálni vajon, hogy biztosan betűk másolódjanak az új stringbe?
-
dobragab
addikt
Esetleg használhatnád ezt az oldalt, hogy átláthatóbb legyen a kód!
Vagy legalább a Programkód formázást így.

void sztring (char*, char*);
int main()
{
char str1[]="AEBCD", str2[37]= {0};
sztring (str1,str2);
return 0;
}
void sztring (char *p1, char *p2)
{
int i=0;
while (*p1)
{
if (*p1=='A' || *p1=='E')
{
if (! (i%2) )
{
*p2=*p1;
p2++;
i++;
}
}
if (*p1=='B' || *p1=='C' || *p1=='D')
{
if (i%2)
{
*p2=*p1;
p2++;
i++;
}
}
p1++;
}
} -
#36268800
törölt tag
Sziasztok!
Egy feladat megoldásban kellene a segítség, mert elakadtam.
A feladat az lenne, hogy egy stringet kell feltölteni egy másik string karaktereiből, úgy hogy a páratlan indexen magánhangzó a pároson mássalhangzó van, viszont nem tudom, hogy kellene megvalósítani, hogy végig töltse fel a stringet.
void sztring (char*, char*);
int main()
{
char str1[]="AEBCD", str2[37]={0};sztring(str1,str2);
return 0;
}void sztring (char *p1, char *p2)
{
int i=0;while(*p1)
{
if(*p1=='A' || *p1=='E')
{
if(!(i%2))
{
*p2=*p1;
p2++;
i++;
}
}
if(*p1=='B' || *p1=='C' || *p1=='D')
{
if(i%2)
{
*p2=*p1;
p2++;
i++;
}
}
p1++;
}
}most eredménynek csak annyit kapok, hogy a str2: AB viszont úgy kellene feltölteni, hogy ABECAD stb de ezt nem tudom, hogy kell megoldani, köszönöm a segítséget.
Esetleg használhatnád ezt az oldalt, hogy átláthatóbb legyen a kód!
-
EQMontoya
veterán
Sziasztok!
Egy feladat megoldásban kellene a segítség, mert elakadtam.
A feladat az lenne, hogy egy stringet kell feltölteni egy másik string karaktereiből, úgy hogy a páratlan indexen magánhangzó a pároson mássalhangzó van, viszont nem tudom, hogy kellene megvalósítani, hogy végig töltse fel a stringet.
void sztring (char*, char*);
int main()
{
char str1[]="AEBCD", str2[37]={0};sztring(str1,str2);
return 0;
}void sztring (char *p1, char *p2)
{
int i=0;while(*p1)
{
if(*p1=='A' || *p1=='E')
{
if(!(i%2))
{
*p2=*p1;
p2++;
i++;
}
}
if(*p1=='B' || *p1=='C' || *p1=='D')
{
if(i%2)
{
*p2=*p1;
p2++;
i++;
}
}
p1++;
}
}most eredménynek csak annyit kapok, hogy a str2: AB viszont úgy kellene feltölteni, hogy ABECAD stb de ezt nem tudom, hogy kell megoldani, köszönöm a segítséget.
Én a feladatot sem értem, megpróbálod megfogalmazni magyarul?

-
dobozs
csendes tag
Sziasztok!
Egy feladat megoldásban kellene a segítség, mert elakadtam.
A feladat az lenne, hogy egy stringet kell feltölteni egy másik string karaktereiből, úgy hogy a páratlan indexen magánhangzó a pároson mássalhangzó van, viszont nem tudom, hogy kellene megvalósítani, hogy végig töltse fel a stringet.
void sztring (char*, char*);
int main()
{
char str1[]="AEBCD", str2[37]={0};sztring(str1,str2);
return 0;
}void sztring (char *p1, char *p2)
{
int i=0;while(*p1)
{
if(*p1=='A' || *p1=='E')
{
if(!(i%2))
{
*p2=*p1;
p2++;
i++;
}
}
if(*p1=='B' || *p1=='C' || *p1=='D')
{
if(i%2)
{
*p2=*p1;
p2++;
i++;
}
}
p1++;
}
}most eredménynek csak annyit kapok, hogy a str2: AB viszont úgy kellene feltölteni, hogy ABECAD stb de ezt nem tudom, hogy kell megoldani, köszönöm a segítséget.
-
DrojDtroll
veterán
Akkor jobb az fscanf visszatérési értékeit nézegetni?
-
dobragab
addikt
-
#36268800
törölt tag
Mi a véleményetek a megoldási menetemről? Jó úton indultam el szerintetek?
-
dobragab
addikt
Akkor menj fájlvégjelig. Én az ilyesmit !feof()-al szoktam csinálni.
feof-fal óvatosan, nem jóstehetség! Nem tudja kitalálni, hogy a következő beolvasás el fog-e halni (azaz a fájl végén vagyunk-e), hanem azt adja vissza, hogy az előző beolvasás EOF miatt halt-e el. Azaz könnyű rosszul használni, így tud még egy hibás adat bekerülni a lista végére.
-
DrojDtroll
veterán
Arra gondoltam, hogy egy láncolt listába beolvasom a sorok tartalmát, tehát a struktúrám valahogy úgy nézne ki, hogy
typedef struct lottoHet{
int szam1;
int szam2;
int szam3;
int szam4;
int szam5;
struct lottoHet *next;
}lottoHet;miután ez megvan, végigpörgetem a listát és megszámoltatom egy 90 elemű tömbben, hogy egy-egy számot hányszor húztak ki az eddigi évek során. Puszta kíváncsiságból szeretném megírni a programot. Nyilván minimális eltérés lesz egy-egy darabszám között, mivel "90 alatt az 5" a lottó 5ös valószínűsége.
Egyéni szórakozás...Alapvetően nem gondoltam arra, hogy megszámolnám a sorokat, inkább találja ki a program, legyen okosabb annál, mintsem hogy mindent "a szájába rágjak".
Akkor menj fájlvégjelig. Én az ilyesmit !feof()-al szoktam csinálni.
-
#36268800
törölt tag
Javasolt valami whitespace-szel elválasztani a számokat. A scanf és társai ilyenkor nem tesznek különbséget egy ill. több különböző típusú whitespace között. Azaz ha a fájlban épp tabot vagy fájl végét sikerült használnod, azt is meg fogja enni space-ként.
1 2 3 4 5
6 7 8 9 10
...Az fscanf visszatérési értékét érdemes vizsgálni, ami a fájl végét illeti. Azt adja vissza, hány formátumsztringbeli értéket töltött fel sikeresen. Ha 5 számról volt szó, akkor sikeres beolvasásnál 5-öt ad vissza.
Primitív példakód:
int szamok[5];
while(fscanf(fp, "%d %d %d %d %d", szamok, szamok+1, szamok+2, szamok+3, szamok+4) == 5)
{
// egy sor feldolgozása
}Nem tudom, mennyire ismered a C-t, meg pontosan mit akarsz vele csinálni. Javasolt csinálni egy Lottoszam struktúrát, ha bármi komolyabbat csinálni kell vele. És lehet ciklusban olvasni az 5 db számot, csak akkor macerásabb a hibakezelés...
Ha mind el kell tárolni, akkor ismét érdekes kérdés következik:
1. ismerjük előre a darabszámot (fájl elejére oda van-e írva): VLA vagy malloc
2. nem ismerjük: nyújtózkodó tömb, láncolt lista, maximális pufferméret, stb.Szóval ez a C legmacerásabb problémája.
Arra gondoltam, hogy egy láncolt listába beolvasom a sorok tartalmát, tehát a struktúrám valahogy úgy nézne ki, hogy
typedef struct lottoHet{
int szam1;
int szam2;
int szam3;
int szam4;
int szam5;
struct lottoHet *next;
}lottoHet;miután ez megvan, végigpörgetem a listát és megszámoltatom egy 90 elemű tömbben, hogy egy-egy számot hányszor húztak ki az eddigi évek során. Puszta kíváncsiságból szeretném megírni a programot. Nyilván minimális eltérés lesz egy-egy darabszám között, mivel "90 alatt az 5" a lottó 5ös valószínűsége.
Egyéni szórakozás...Alapvetően nem gondoltam arra, hogy megszámolnám a sorokat, inkább találja ki a program, legyen okosabb annál, mintsem hogy mindent "a szájába rágjak".
-
dobragab
addikt
Javasolt valami whitespace-szel elválasztani a számokat. A scanf és társai ilyenkor nem tesznek különbséget egy ill. több különböző típusú whitespace között. Azaz ha a fájlban épp tabot vagy fájl végét sikerült használnod, azt is meg fogja enni space-ként.
1 2 3 4 5
6 7 8 9 10
...Az fscanf visszatérési értékét érdemes vizsgálni, ami a fájl végét illeti. Azt adja vissza, hány formátumsztringbeli értéket töltött fel sikeresen. Ha 5 számról volt szó, akkor sikeres beolvasásnál 5-öt ad vissza.
Primitív példakód:
int szamok[5];
while(fscanf(fp, "%d %d %d %d %d", szamok, szamok+1, szamok+2, szamok+3, szamok+4) == 5)
{
// egy sor feldolgozása
}Nem tudom, mennyire ismered a C-t, meg pontosan mit akarsz vele csinálni. Javasolt csinálni egy Lottoszam struktúrát, ha bármi komolyabbat csinálni kell vele. És lehet ciklusban olvasni az 5 db számot, csak akkor macerásabb a hibakezelés...
Ha mind el kell tárolni, akkor ismét érdekes kérdés következik:
1. ismerjük előre a darabszámot (fájl elejére oda van-e írva): VLA vagy malloc
2. nem ismerjük: nyújtózkodó tömb, láncolt lista, maximális pufferméret, stb.Szóval ez a C legmacerásabb problémája.
-
DrojDtroll
veterán
akkor ha a fájlbeolvasást le akarod egyszerűsíteni akkor beírod a fájl elejére hogy hány sor van benne
először beolvasod ezt a számot majd indítasz két egymásba ágyazott ciklust.
a külső addig meg ahány sor van, a belső pedig az öt számot olvassa be,
ha szóköz van közte az a legjobb mert akkor elég egy sima scanf
-
#36268800
törölt tag
Egy statikus fájlal kell dolgozni, vagy mindig változik?
Tulajdonképpen hetente változik a sorok száma, hiszen akkor húzzák ki az újabb számokat (manuálisan szerkesztem a fájlt).
Az oszlopok száma mindig 5, mivel ötös lottóról van szó.
-
DrojDtroll
veterán
Sziasztok!
Lottószámokat szeretnék beolvasni egy szövegfájlból. A számok 5 db oszlopban vannak megadva. A következő dolgokra szeretnék választ kapni:
-hogyan válasszam szét az oszlopokat? Jelenleg tabulátorral vannak tagolva, de ezt nyilván lehet bármilyen egyéb karakterre módosítani: szóköz, vessző, pontosvessző, stb.
-meddig olvassam a fájlt? Tegyek a végére valamilyen fájlvége jelet? Pl. -1 megfelelne? Van más konvenció erre?
-milyen módon lehet a számokat szépen beolvasni? Régebben készítettem egy hasonló programot és abban úgy oldottam meg, hogy beolvasott a progi egy teljes sort, aztán szétdarabolta a tartalmát. Nagyjából ilyen formában: "szöveg1";"szöveg2";"szöveg3";"szöveg4"endline - egy ilyen sort beolvasott egy elegendően nagy tömbbe, majd ráküldtem egy daraboló függvényt, ami pontosvesszőkig olvasta be a tartalmat és szétdobálta megfelelő változókba a "szövegeket". Mivel az egyetemen a laborvezetőm semmilyen érdemi kommentárt nem fűzött a dologhoz, fogalmam sincs, hogy ez mennyire számított elegáns vagy jó megoldásnak... az összkép tulajdonképpen megvolt (Legyen Ön Is Milliomos játék), és így ennyi.Köszönöm előre is a segítséget!
Egy statikus fájlal kell dolgozni, vagy mindig változik?
-
#36268800
törölt tag
Sziasztok!
Lottószámokat szeretnék beolvasni egy szövegfájlból. A számok 5 db oszlopban vannak megadva. A következő dolgokra szeretnék választ kapni:
-hogyan válasszam szét az oszlopokat? Jelenleg tabulátorral vannak tagolva, de ezt nyilván lehet bármilyen egyéb karakterre módosítani: szóköz, vessző, pontosvessző, stb.
-meddig olvassam a fájlt? Tegyek a végére valamilyen fájlvége jelet? Pl. -1 megfelelne? Van más konvenció erre?
-milyen módon lehet a számokat szépen beolvasni? Régebben készítettem egy hasonló programot és abban úgy oldottam meg, hogy beolvasott a progi egy teljes sort, aztán szétdarabolta a tartalmát. Nagyjából ilyen formában: "szöveg1";"szöveg2";"szöveg3";"szöveg4"endline - egy ilyen sort beolvasott egy elegendően nagy tömbbe, majd ráküldtem egy daraboló függvényt, ami pontosvesszőkig olvasta be a tartalmat és szétdobálta megfelelő változókba a "szövegeket". Mivel az egyetemen a laborvezetőm semmilyen érdemi kommentárt nem fűzött a dologhoz, fogalmam sincs, hogy ez mennyire számított elegáns vagy jó megoldásnak... az összkép tulajdonképpen megvolt (Legyen Ön Is Milliomos játék), és így ennyi.Köszönöm előre is a segítséget!
Új hozzászólás Aktív témák
-
5700 - 5601
6397 - 6301 6300 - 6201 6200 - 6101 6100 - 6001 6000 - 5901 5900 - 5801 5800 - 5701 5700 - 5601 5600 - 5501 5500 - 5401 5400 - 5301 5300 - 5201 5200 - 5101 5100 - 5001 5000 - 4901 4900 - 4801 4800 - 4701 4700 - 4601 4600 - 4501 4500 - 4401 4400 - 4301 4300 - 4201 4200 - 4101 4100 - 4001 4000 - 2001 2000 - 1
-
Fórumok
Mobilarena - mobil fórumok
Okostelefonok Mobiltelefonok Okosórák Autó+mobil Üzlet és Szolgáltatások Mobilalkalmazások Tartozékok, egyebek Mobilarena blogokPROHARDVER! - hardver fórumok
Notebookok TV & Audió Digitális fényképezés Alaplapok, chipsetek, memóriák Processzorok, tuning Hűtés, házak, tápok, modding Videokártyák Monitorok Adattárolás Multimédia, életmód, 3D nyomtatás Tabletek, E-bookok Nyomtatók, szkennerek PC, mini PC, barebone, szerver Beviteli eszközök Egyéb hardverek PROHARDVER! BlogokIT café - infotech fórumok
Infotech Hálózat, szolgáltatók OS, alkalmazások SzoftverfejlesztésGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokLOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendFÁRADT GŐZ - közösségi tér szinte bármiről
Tudomány, oktatás Sport, életmód, utazás, egészség Kultúra, művészet, média Gazdaság, jog Technika, hobbi, otthon Társadalom, közélet Egyéb Lokál PROHARDVER! interaktív
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Jelentősen ronthat a memóriahiányon egy holnap kezdődő sztrájk
- gban: Ingyen kellene, de tegnapra
- E-book olvasók
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Büszke apukák és anyukák topikja
- Yettel topik
- Robotporszívók
- Samsung Galaxy A26 - csak a szokásos
- BMW topik
- Google Pixel topik
- További aktív témák...
- 27% - Sapphire PULSE Radeon RX 7800 XT 16GB GDDR6 Videokártya!
- Dell Latitude 3380 - Core i3 6006U, 4-8GB DDR4 RAM, gyári töltő, számla, 6 hó gar
- 27% - ÚJ Kingston FURY Beast 64GB (2x32GB) DDR5 5600MHz KF556C36BBEK2-64
- Apple iPhone 15 Pro 128GB eladó! 86% akku, Patika állapot, 12 hónap garancia
- Apple iPhone 16 Pro Max 256GB eladó! 94% Akku, Szép állapot, 12 hó gar
- iPhone 14 Plus 85% 128GB (1év Garancia)
- ÁRGARANCIA! Épített KomPhone Ultra 9 285K 32/64GB RAM RTX 5080 16GB GAMER PC termékbeszámítással
- 27% - Intel Core i9-13900K 24-Core 4.3GHz LGA1700 (36M Cache, up to 5.80 GHz) Processzor!
- Apple MacBook Pro 16 M1 Max (2021) 32GB/1TB SSD szép állapotú 79% akku 595 ciklus
- G.SKILL TRIDENT Z RGB 16GB (2x8GB) DDR4 3200MHz F4-3200C16D-16GTZR
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest




on me. 



Mennyivel nyugisabb lenne az utolsó munkanap.
![;]](http://cdn.rios.hu/dl/s/v1.gif)


Még talán assembly-ben is megkérdőjelezik a használatát, pedig ott tudtommal más megoldás nem nagyon van ciklusok létrehozására.



