-
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
LOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokMobilarena - 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ésFÁ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
É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
-
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
-
stepboy
csendes tag
-
dabadab
titán
-
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
-
stepboy
csendes tag
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
-
alapz@j
tag
-
dobragab
addikt
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
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
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
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
++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
É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
-
dobragab
addikt
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
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
-
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
-
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
-
maestro87
őstag
É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
-
maestro87
őstag
-
ToMmY_hun
senior tag
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
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
-
maestro87
őstag
-
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
-
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
-
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
-
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
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
"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
-
EQMontoya
veterán
-
bepken
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

-
EQMontoya
veterán
-
axioma
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...] -
bepken
veterán
-
dabadab
titán
-
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
-
alapz@j
tag
-
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
-
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
-
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
Í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
-
#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
-
#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
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
Esetleg használhatnád ezt az oldalt, hogy átláthatóbb legyen a kód!
-
EQMontoya
veterán
-
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
-
dobragab
addikt
-
#36268800
törölt tag
-
dobragab
addikt
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
-
#36268800
törölt tag
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
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
-
#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
LOGOUT - lépj ki, lépj be!
LOGOUT reakciók Monologoszféra FototrendGAMEPOD - játék fórumok
PC játékok Konzol játékok MobiljátékokMobilarena - 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ésFÁ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!
- Macbook Pro 14" M1 Pro 2021 - 10 GPU, 14 CPU, 16 GB / 1 TERA - garancia (112)
- Macbook Pro 13" M1 - 2021 gyártás - 8/256GB, touchbar - 37 ciklus, garancia (106)
- Macbook Pro 13" M1 2020 - 8 GB / 512 GB, touchbar - garancia (29)
- Apple iPhone 11 Pro Max 64GB, Kártyafüggetlen, 1 Év Garanciával
- Apple iPhone 14 128GB, Kártyafüggetlen, 1 Év Garanciával
- ÚJ ASUS Vivobook 15 - 2.8K OLED 120Hz - i5-1335U - 16GB - 1TB - Win11 - Garancia
- Dell Precision 5511,15.6"FHD,i5-10400H,16GB DDR4,256GB SSD,WIN11,LTE kártya
- HIBÁTLAN iPhone 13 256GB Starlight-1 ÉV GARANCIA - Kártyafüggetlen, MS4676, 100% AKKSI
- LG UltraWide UltraGear 34GN850P-B Monitor! 3440x1440 / 160Hz / 1ms / FreeSync / G-Sync
- Honor 90 Lite 256GB, Kártyafüggetlen, 1 Év Garanciával
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest


on me. 






![;]](http://cdn.rios.hu/dl/s/v1.gif)
Jogos.
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.

