- Sub-ZeRo: Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- Lenry: Windows 11 telepítése inkompatibilis gépre
- Tomasz72: Ventilátor upgrade
- sziku69: Fűzzük össze a szavakat :)
- sziku69: Szólánc.
- Luck Dragon: Asszociációs játék. :)
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- Gurulunk, WAZE?!
- M0ng00se: Hardvert áruhitelre?
- D1Rect: Nagy "hülyétkapokazapróktól" topik
Új hozzászólás Aktív témák
-
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. -
válasz
alapz@j #5690 üzenetére
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.)
-
dobragab
addikt
válasz
stepboy #5685 üzenetére
De, ezzel így semmi baj nincs. Csak ez azért ciki, mert a
temp
vá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);
-
dobragab
addikt
válasz
maestro87 #5683 üzenetére
"Ö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
x
koordináta 5 lesz, azy
pedig 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
-
stepboy
csendes tag
válasz
dobragab #5550 üzenetére
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
válasz
dobragab #5679 üzenetére
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. -
alapz@j
tag
-
dobragab
addikt
válasz
maestro87 #5676 üzenetére
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 agoto
kapcsán. -
maestro87
őstag
válasz
dobragab #5672 üzenetére
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
continue
akkor megkérdezem, hogy mit gondoltok areturn
kifejezé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
válasz
maestro87 #5671 üzenetére
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
válasz
maestro87 #5671 üzenetére
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
válasz
maestro87 #5671 üzenetére
++i
tök mást csinál.continue
igazá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
continue
asm-ben 1 db jump lesz, ugyanúgy, ahogy azif
is.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
válasz
EQMontoya #5667 üzenetére
É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
++i
helyett.
Ráadásul a++i
szerintem 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, mertcontinue
né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
válasz
EQMontoya #5667 üzenetére
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
válasz
maestro87 #5665 üzenetére
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
-
maestro87
őstag
válasz
ToMmY_hun #5664 üzenetére
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 kimenetcontinue
nélkül. Szerintem nézd át azt a kódot még egyszer.
Acontinue
itt 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 + 1
miatt. Tehát itt semmi szerepét nem látom, ellenben az én példámmal ahol azif
előtt van értékadó utasítás is. -
-
maestro87
őstag
válasz
ToMmY_hun #5662 üzenetére
Lehet online futtatni a kódot és ha kitörlöd a
continue
-t ugyanaz lesz a kimenet. Aza = a + 1
miatt nem printeli ki a 15-öt, nem acontinue
miatt.Értem, tehát akkor a
continue
utá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: 20continue
né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.
-
maestro87
őstag
válasz
dobragab #5657 üzenetére
Én ugyan C-ben még nem használtam
goto
utasí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
continue
utasí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? -
maestro87
őstag
-
ToMmY_hun
senior tag
válasz
dobragab #5657 üzenetére
Nekem az a tapasztalatom, hogy a spagetti kód nem a
goto
miatt 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 agoto
megkerülhetetlen. Ilyen például a VBA (Visual Basic for Applications), amelyben a hibakezeléshez biztosan, de ha jól emlékszem bizonyos esetekben acontinue
helyett is csakgoto
haszná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 agoto
haszná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 abreak
is. 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
válasz
maestro87 #5654 üzenetére
emp.doj
egy három elemű tömb, amit inicializálni csak akkor tudsz, amikor létrehozod azemp
vá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.doj
elemeinek.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
válasz
buherton #5653 üzenetére
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
válasz
buherton #5650 üzenetére
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! -
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
Ü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
válasz
dabadab #5640 üzenetére
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
válasz
dabadab #5638 üzenetére
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
-
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
-
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
-
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
válasz
dabadab #5623 üzenetére
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];
} -
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 lenneNem hosszú kód, esetleg ha van valaki mindenképp írjon legyen szíves. Előre is köszi
-
dabadab
titán
válasz
alapz@j #5622 üzenetére
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 ];
-
armin80
újonc
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
válasz
#36268800 #5618 üzenetére
Í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! :) -
#36268800
törölt tag
válasz
EQMontoya #5617 üzenetére
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.
-
#36268800
törölt tag
válasz
EQMontoya #5613 üzenetére
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
válasz
#36268800 #5614 üzenetére
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!
-
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.
-
dobragab
addikt
válasz
DrojDtroll #5607 üzenetére
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.
-
#36268800
törölt tag
válasz
dobragab #5605 üzenetére
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
válasz
#36268800 #5603 üzenetére
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
válasz
DrojDtroll #5602 üzenetére
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ó. -
#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
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Keresünk dokkolókat
- Bitcoin miner Bitmain Antminer S9 S9I 13.5 - 14 Th 1250W eladó
- Jogtiszta Microsoft Windows / Office / Stb.
- ÁRGARANCIA!Épített KomPhone Ryzen 7 5700X 16/32/64GB RAM RX 7600 8GB GAMER PC termékbeszámítással
- BESZÁMÍTÁS! Gigabyte B760M i5 14600KF 64GB DDR4 512GB SSD RTX 3080 10GB Corsair 4000D Airflow 1000W
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: CAMERA-PRO Hungary Kft
Város: Budapest