- Android alkalmazások - szoftver kibeszélő topik
- Honor Magic6 Pro - kör közepén számok
- Samsung Galaxy S23 és S23+ - ami belül van, az számít igazán
- Motorola Edge 50 Neo - az egyensúly gyengesége
- Magisk
- Apple iPhone 16 Pro - rutinvizsga
- Samsung Galaxy S21 és S21+ - húszra akartak lapot húzni
- Samsung Galaxy Watch (Tizen és Wear OS) ingyenes számlapok, kupon kódok
- Hat év támogatást csomagolt fém házba a OnePlus Nord 4
- Honor 400 - és mégis mozog a kép
Új hozzászólás Aktív témák
-
axioma
veterán
válasz
TheProb #4585 üzenetére
Lehetne rekurzivan, de ez a feladat sztem pont nem alkalmas arra, hogy lasd, mire valo a rekurzio (az "ugyanaz a feladat" helyett itt pont a rekurzio melysege szerinti if-es szetagazasok vannak). Itt inkabb a helyedben a kulso if-ben (az 'a' erteke pozitiv es 4000 alatti) tennek ciklust, akkor nem szamit a sorrendje az if-eknek. Sot, ha jobban megnezed, akkor az if-ek igazabol nem kene kulon kezeljek azt, hogy nincs mar tobb kiirando, lehet mindig 1-gyel csokkenteni az n-et, mert megteheto hogy a 0 az nem fuz semmit az outputhoz (me'gis lesz 0. elem minden statikus tombben, ami az ures string ""). Vagy nezheted ugy, hogy az n-re nincs is szukseged, csak az 'a'-ra, aminek egy ciklusban mindig csak a legfelso szamjegyet ertekeled ki (es magat az a-t modositod, nem az n-et). Igazabol a szamkent kezeles se feltetlen kene, ha marad stringben, akkor cimezheted az (inp-'0')-val a statikus tombodet... Es raadasul me'g a tombjeidet is szervezhetned tombbe, akkor az i. karakterhez az i. tombbol kell venned ezt az erteket (nyilvan ekkor hatulrol kezdve szamozva, de length-1 -tol lefele szamolva a ciklust). Ebbol mar eleg kompakt kis kod keletkezne.
-
axioma
veterán
válasz
TheProb #4583 üzenetére
Hat akkor az a baj, ami ott else-ben van (en is jol atneztem felette, ugy tunt mintha az futna le - nem veletlen a minden egy utasitasos blokkot is zarojelparba szokas) az rakna' at az outputba... az egyeseknel ottmarad a romai-ban... amelyikben meg nem volt egyes, az rafut erre, ott meg tok foloslegesen ujra atmasolja.
szerk. jo, lehet a tomb jo (es nem csak mukodo
), vegulis a * es a [] "valahol" egyenertekuek, lehet hogy csak tolem idegen szokas.
-
axioma
veterán
válasz
TheProb #4580 üzenetére
Eloszor is a 12. sorban (4*n, char) a parameter es nem char*, bar ez nem okozhatja elvileg a hibat (bar odaillobb lenne egy +1 is az elsohoz, a 888 lezaro nullaja miatt).
Masodszor en nem vagyok ennyire benne a C-s stringfuggvenyekben es most utananezni sincs kedvem, de a feltuno kulonbseg az, hogy az n==1-nel nem strcat-olsz. Azt gyanitanam, hogy a stringvegzodest jelzo nullat az a fuggveny rantja a tobbinel helyre. -
dabadab
titán
válasz
TheProb #4419 üzenetére
A C az gyakorlatilag platformfuggetlen assembler, ami tamogat strukturalt programozast is, manapsag mar leginkabb csak par specialis helyen hasznaljak.
A C++ ennek eggyel jobban elvont valtozata, ami tamogatja a nyolcvanas meg kilencvenes evek, sot, a 2011-es C++11 szabvany (amit olyan nagyon sok helyen meg nem hasznalnak) egyre inkabb a XXI. sz. elejenek mindenfele dolgait (objektumorientalt programozas, template-ek, ill. parhuzamos programozas, stb), de meg mindig nativ kodot futtat. Nekem ugy tunik, hogy manapsag ez a fo nyelv, ha nagy projekteket csinalnak.
A C# meg tulajdonkeppen a Java Microsoft-fele valtozata, meg egy fokkal elvontabb, virtualis gepek programozasara szantak es persze a Microsoft-vilagon kivul nem nagyon mukodik.
-
buherton
őstag
válasz
TheProb #4408 üzenetére
Amit írtál az mind OOP nyelv. Ha android, akkor Java. Ha windows phone, akkor .net, ha iPhone akkor objective C. A Java mellett szól, hogy mindenen fut, amin van Java virtuális gép, de lassú és sok memóriát igényel, és az Oracle-höz vagy kötve. A C++-ban teljes szabadság uralkodik, mert sem céghez, sem oprendszerhez, sem platformhoz nem vagy kötve, és annyira nem vészes. A .net alatt teljes zártság és kötöttség van. Viszont ha windowson kívül másra nem akarsz fejleszteni, akkor talán még ez a legjobb választás.
-
Karma
félisten
válasz
TheProb #4401 üzenetére
Az strcat_s azért jó, mert odafigyel arra, hogy a célterületből véletlenül se szaladjon ki. Ha egy négy hosszú blokkba beleírnád azt, hogy "MCCXXXIV", akkor az strcat kifut és felrobban, a safe változat beírja hogy "MCC" és csöndben megy tovább.
A debuggert használod most is, csak tud sok hasznos dolgot még
Például a programsoraid mellett bal oldalt kattintasz, breakpointot raksz be, aminél a program megáll és lépésenként követheted a menetét.
buherton: Tényleg előfordulhatnak felesleges warningok, de ez egyáltalán nem az! Konkrétan elkerülhető lett volna a crash. Az strcat_s tényleg nem szabványos, de az strncat igen, ami szintén egy biztonságos alternatíva más platformon.
Meg úgy egyébként a warningok azért vannak, mert valamit rosszul csinál az ember. Tanulásnál különösen fontos megérteni hogy mit...
-
buherton
őstag
válasz
TheProb #4401 üzenetére
Fel kell venni azt a bizonyos szemüveget, amivel a fontos és jelentéktelen warningokat ki lehet válogatni. Szerintem a strcat_s egy beépített függvény a VS-nek, így inkább javaslat lesz, mint valós warning. A standradban egészen biztosan nincs ilyen. Nem kell azzal foglalkozni. Függően attól, hogy merre szeretnél tovább tanulni én javasolnám a mingw (GCC) + eclipse kombót. A VS nagyon lekorlátoz. Gyakorlatilag csak PC-re és csak Windowsra tudsz fejleszteni. GCC + Eclipse-szel gyakorlatilag minden platformra tudsz fejleszteni.
IDE - Integrated Development Environment, a debuggerrel pedig lépkedni tudsz a kódban futás közben. Meg tudod nézni, hogy az adott változónak mi az értéke. Meg is lehet változtatni. Break pointokkal meg lehet állítani a program futását. Nagyon hasznos ha algoritmusbeli hibát szeretnél kidebbugolni.
-
Karma
félisten
válasz
TheProb #4399 üzenetére
Túl kevés memóriát foglalsz, ezért robban fel. n = 4, de az eredmény bőven hosszabb ennél
Ha azt nézzük, hogy egy számjegy római alakja maximum 4 karakter lehet, a 4*n+1 byte biztosan elég lesz. Arra átírtam a callocot, és ki is írta az eredményt hiba nélkül.
Egyébként megéri IDE-vel debuggolni a programot. Egyrészt menet közben látod hogy melyik változód milyen értéket vesz fel, másrészt egy kicsit több infód lesz az összeomlásról is, nem csak hogy "kifagy".
-
TheProb
veterán
válasz
TheProb #4398 üzenetére
-átírva calloc-ra
- említett else-es gondok (elvileg) megoldva
= cmd továbbra is lefagyu.i.: Nem kéne a romai tömb-be az átalakított sztring után 1 lezáró nulla? Nekem azt mondták, ha az nincs a szting végén akkor szar a char tömb? (vagy ezt is orvosolja a calloc a kinullázott bitekkel?)
-
Karma
félisten
válasz
TheProb #4393 üzenetére
2) Mert amikor a malloc lefoglalja a területet, az még korábbi szeméttel van tele. Bármi lehet ott, beleértve a Shakespeare összest
Azért kell a 0, hogy biztosan üres string legyen belőle.
Alternatívái a memset függvény (az egész területet egységesen nullázhatod vele, illetve a malloc helyett calloc fv. kapásból tiszta területet ad.
-
dabadab
titán
válasz
TheProb #4390 üzenetére
A fobb gondok:
1. A visszateresi ertek.
A char az egyetlen egy darab karakter. Ha tobb karakterre (stringre) van szukseged (marpedig itt arra van) akkor char*-ot kell visszaadnod, mert jelenleg a fuggveny csak a szam legelso karakteret adja vissza.
2. Memoriafoglalas
Annyi memoriat foglalsz a romai szamoknak, amennyibe pont belefer a szam arab szamokkal. Ezzel egyreszt ket gond is van:
1. a romai szamoknak jo esellyel tobb hely kell
2. a string vegere meg oda kellene fernie a lezaro nullanak. Ugyanis C-ben ugy neznek ki a stringek, hogy van a szoveg es a vegen ott ven egy 0 erteku byte (nem egy '0' karakter!), hogy lehessen tudni, hogy hol a vege3. Stringkezeles
Az elejen a nullat a legelso helyre kell beirni (romai[0]=0), onnan kezdve az strcat az gondjat viseli. A te megoldasodnal meg ott marad az elso n darab helyen valami memoriaszemet es az strcat az utan fogja irni a dolgait.
4. nullas szamjegyek
Gondold vegig, hogy mit ir ki ez az ezresnel kisebb helyiertekeken, ha mondjuk 1000-et konvertalsz at vele
5. Az else ag
Ha legalabb ketjegyu a szam, akkor nem fogja kiirni az egyes helyierteku szamokat
6. Memoriafelszabaditas
Ha azt akarod, hogy a hivo lassa is, hogy mit irtal, akkor semmikeppen se szabaditsd fel azt a memoriat, amit eppen vissza akarsz adni neki.
A freenek hiba eseten lenne ertelme (mivel akkor nem adnad neki vissza a romai pointert, igy "elveszne" az a memoria (memory leak)), de itt mondjuk jobb, ha csak akkor foglalod le, ha mar eldontotted, hogy at tudod konvertalni a szamot.Igy hirtelen ennyi.
-
Karma
félisten
válasz
TheProb #4387 üzenetére
Az előző álláspontomat szem előtt tartva azért csak kifejtem egy kicsit.
Az alapprobléma az, hogy C-ben és más alacsonyabb szintű nyelveken a memóriakezelést tudatosan kell csinálni, mert nincs az ember alatt védőháló. Mindig tisztában kell lenned azzal, hogy egy adott változó, tömb, karaterlánc hol jön létre, és mikor, ki által fog megsemmisülni. Olyan meg soha nincs, hogy a semmiből memória fakad és pont azt csinálja amit szeretnél.
A mutatott kódodban a romai változódat úgy deklaráltad, hogy egy 20 karakteres tömb, ami a függvényen belül él csak, amint véget ér, felszabadul, te meg nem férhetsz hozzá többet. Ez a sorsa mindennek, ami a stacken jön létre. A befoglaló függvény végén kaputt.
Ilyen minden lokális változó függvényen belül, a függvényeknek átadott paraméterek, az egymás után láncolt függvényhívások köztes eredményei, stb.
Memóriafoglalás tekintetében még két lehetőséged van: a magyar oktatásban "dinamikus memóriának" csúfolt heap; illetve nagyon leegyszerűsítve a "globális változók", a static terület. Utóbbinak inkább ne játssz a gondolatával se.
A programodat azon a két módon lehet megjavítani, amit az előbb is írtam:
1) vagy behozod a heapkezelést és az eredményt oda mented (malloc/free);
2) vagy egy olyan függvényt írsz, mint például az snprintf: a hívó fél gondoskodik arról, hogy legyen hova tenni az eredményt. Javaslom, hogy nézd meg annak a függvénynek a leírását.Ez utóbbi azért különösen jó, mert maga a rómaira átalakító függvényednek nem kell törődnie a memóriakezeléssel egyáltalán. Nem érdekli, hogy a hívója hol foglalt memóriát (stack/heap/static), csak az átalakítással kell törődnie. Nem az ő felelőssége.
Az intes részre nem tudok válaszolni, mert nem sikerült értelmeznem a kérdést.
-
Karma
félisten
válasz
TheProb #4385 üzenetére
Kapásból a char visszatérési érték helyett szerintem te char *-ot akartál inkább visszaadni -- a teljes számsort egyetlen karakter helyett.
Másrészt a stacken létrehozott char tömböt visszaadni öngyilkosság (a függvény végén megsemmisül -> érvénytelen pointer -> GAME OVER ☠).
Két lehetőséged van: vagy mallockal foglalsz egy dinamikus memóriaterületet, aminek a kezdőcímét adod vissza a függvény végén (és a hívónak fel kell majd szabadítania); vagy úgy írod át a függvényt, hogy bemenő paraméterként kapja meg azt a char tömböt (és annak max méretét), ahova az eredményt írhatja.
Új hozzászólás Aktív témák
Hirdetés
● olvasd el a téma összefoglalót!
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Latitude 5550 15.6" FHD IPS Ultra 5 135U 16GB 512GB NVMe magyar vbill ujjolv IR kam gar
- Gamer PC , i7 10700 , RX 6700 XT 12GB , 32GB 3200MHz , 512GB NVME , 1TB HDD
- Eladó Konfig Ryzen 7 9700X 32GB DDR5 1TB SSD RX6900XT 16GB!
- Eladó Gamer PC i7 14700, RTX 5070, 32 GB 6000mhz RAM, Vizhűtés, 850W 80+ Táp, 2 év Garanciával
- Google Pixel 9 Pro 5G 16/256GB Szürke Színben Bontatlan 12 Hó Garanciával
- BESZÁMÍTÁS! Logitech G923 kormány + Driving Force Shifter garanciával hibátlan működéssel
- Apple iPhone 15 Pro Max 512GB, Kártyafüggetlen, 1 Év Garanciával
- ÁRGARANCIA! Épített KomPhone i5 10600KF 16/32/64GB RAM RX 7600 8GB GAMER PC termékbeszámítással
- Csere-Beszámítás! Számítógép PC Játékra! I5 14400F / RTX 4060ti 16GB / 32GB DDR5 / 1TB SSD
- AKCIÓ! PC Specialist Recoil VIII 17 notebook - i9 14900HX 16GB RAM 2TB SSD RTX 4060 8GB WIN11
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest