- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Crypto Trade
- Router gondok
- Az USA tisztifőorvosa figyelmeztető címkét ragasztana a közösségi médiára
- Vodafone otthoni szolgáltatások (TV, internet, telefon)
- Rendszergazda topic
- eBay
- Otthoni hálózat és internet megosztás
- Bittorrent topik
- Betelik a pohár: nagy igény lenne a gyorshajtás-ellenes technológiára
Új hozzászólás Aktív témák
-
Karma
félisten
Egy kicsit olvasgattam (szerencsére elég sűrű a C-ről szóló írások száma a neten
), úgy tűnik elég vegyes a dolog. Auto-pointereknél nem para a felszabadítás több return esetén, de pl. CleanupStacknél sokkal bonyolultabb a memóriát karban tartani.
“All nothings are not equal.”
-
Karma
félisten
válasz
Sk8erPeter #1486 üzenetére
Eh, mondtam, hogy naív megoldás, azt nem, hogy jó is
Meg egyébként is csak firkáltam.[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Sk8erPeter #1490 üzenetére
Pedig ha azok a fogalmak megvannak, az első kérdésre is könnyebb válaszolni. Persze mindkettő C++ minta (sőt, a második csak és kizárólag Symbian C++-ban van), ezért C-nél még nem kavar be.
Auto pointer: egy olyan objektum, ami ha megsemmisül a stacken, magával ránt egy hozzárendelt heapen lévő objektumot is, így amikor az auto_ptr scope-on kívülre kerül, a másik objektum biztosan megsemmisül. Ez egy egyszerűsítés, így biztosan nem maradhat meg a heapen lévő objektum pl. azért, mert valahova berakott az ember még egy returnt, és elfelejtette felszabadítani ott is a memóriát
Valahogy így néz ki:
int valami()
{
int *valami_int = new int; // heapen hoztam letre, mint a malloc C-ben
auto_ptr<int> valami_ptr(valami_int); // az auto pointerre bizom a felszabaditast
...
// ugy hasznalom, mint egy pointert
*valami_ptr = 5; // a valtozo erteket valtoztatom itt
...
return 0; // valami_ptr megsemmisul -> valami_int is torlodik
...
return 1; // valahol mashol ugyanez lezajlik
}Ha nem lenne ez az auto_ptr, akkor mindkét return elé oda kéne írni explicite a következő sort (ez a free C++-os megfelelője), amit könnyen kifelejthet az ember, ha utólag hackelget bele a függvénybe, memory leaket okozva.
delete valami_int;
Cleanup Stack: Amikor a Symbiant írták, még nagyon fejletlenek voltak a C++ fordítók, kivételdobáskor a stacken lévő objektumokra nem hívódott meg a destruktor, ami mindenféle vicces hibához vezethetett, többek között "csak" memory leakhez. Ezért a nagyokosok kitalálták, hogy "csináljunk saját kivételkezelést!", megalkották a Leave-eket és a Cleanup Stacket.
Minden heapen lefoglalt objektumot, ami nem tagváltozó, fel kell kézzel rakni a CleanupStackre, és persze le is kell venni onnan, ha olyan műveletek jönnek, amik kivételt (konkrétan leave-et) dobhatnak. Tehát mindig figyelni kell a programozónak arra, hogy mikor mi van rajta, mikor melyik objektum kinek a felelősségébe tartozik, és ennek megfelelően variálni.
Na itt jön be, hogy ha több return utasítás van, akkor kitörhet a káosz, a függvény különböző részein más lehet a CleanupStack állapota, minden returnnél megfelelően adminisztrálni kell, és ha bármit változtatni kell, mindenhol át kell írni...
Példakód:
TInt CSomething::DoSomethingL()
{
TInt result = 0;
CSomethingBig *big = CSomethingBig::NewL();
CleanupStack::PushL(big);
RSomethingResource res;
CleanupClosePushL(res);
result = res->DoSomethingDangerousL(big); // ha ez dob egy leave-et, res bezarodik, big megsemmisul
CleanupStack::PopAndDestroy(2, big); // mindket elemet megsemmisiti
return result;
}Ezt a kódot nem magyaráznám túl, ha nem baj, hiszen csak random firkáltam. A lényeg az, hogy a PopAndDestroy hívást minden return előtt meg kell hívni, pontosan.
[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Sk8erPeter #1503 üzenetére
Gyakoroltam, meg a dolgok mögé próbálok nézni sűrűn
Mondjuk nem mondanám, hogy mestere vagyok a dolgoknak, a szabványos C++-t például igencsak kimosta a Symbian belőlem
Ami egyébként mindig friss élmény, ugyanis szinte mindennap használom - egyetem mellett/egyetemen keresztül dolgozom elsősorban Symbian programozással.
Egyébként MSc elsőéves vagyok, és csak azért félig, mert egyrészt sikerült ezt a félévet félvállról vennem (
), másrészt nem igazán van hangulatom az egészhez már.
Apropó Symbian, célszerű elkerülni, ha az ember nem szereti a fájdalmat. Én nem voltam rá felkészülve, de hamar hozzászoktam azóta
. Az mondjuk biztos, hogy egy ilyen korlátolt és korlátozott környezetben dolgozás kialakítja az ösztönöket a korrekt memóriahasználatra például.
“All nothings are not equal.”
-
Karma
félisten
válasz
Sk8erPeter #1542 üzenetére
Egy char*** a szövegek tárolására, melyet a szamjegy-gyel indexelsz (persze 0-ra redukálva) okosan, így nem kell minden egyes számjegyhez if-et írni?
“All nothings are not equal.”
-
Karma
félisten
válasz
Retekegér #1631 üzenetére
Arra meg ott a printf függvény, első paraméterében megadhatod a kiírás formátumát (én pl. semmit se tudok jelenleg a tömböt elemeinek típusáról
), utána pedig a többi paraméterben a változókat adhatod meg.
Pl. egy egészeket tartalmazó array nevű tömbre (l elemű), soronként egy érték:
int i;
...
for (i = 0; i < l; i++)
{
printf("%d\n", array[i]);
}“All nothings are not equal.”
-
Karma
félisten
Egyszerű: nem törődsz a beolvasott szöveg hosszával, mindig 100 elemig fut a ciklusod. Feltéve, hogy a getline függvény jól működik (elég sok helyen írták ugyanezt a topikban, gondolom valami órai sablon), akkor a visszatérési értéke a beolvasott karakterek száma, használd ezt a ciklus végértékének.
“All nothings are not equal.”
-
Karma
félisten
válasz
nepszter1 #1686 üzenetére
Ha egy A szám osztható egy B számmal, akkor a A-t osztva B-vel a maradék 0.
A C nyelvben a modulus művelet (A % B) adja meg az osztás maradékát.Ha az a kérdés, hogy 2-vel is és 3-mal is, akkor egy modulus elég
shev7 meg lelőtte[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Dead_slow #1715 üzenetére
Azért ez üt... "mondván, hogy a név állhat simán 3 részből is".
Semmi szépet nem tudok elmondani az oktatásunk állásáról.Egyébként az lehet baj például, hogy a masodik és harmadik tömbökbe az i. helytől kezdesz el írni, így az első i-1 karakterben vagy szemét van.
Egyáltalán ezek mik? Hogy vannak deklarálva?
[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Gyuri16 #1719 üzenetére
"1. gets nem egy tul jo fuggveny, mert nem ellenorzi a buffer es a bemenet hosszat. buffer overrun lehet a vege. helyette inkabb fgets ajanlott"
A tanáraik már bizonyították, hogy fogalmuk sincs a C-ről, a tankönyvük pedig gets-t használ, gyanítom azért erőltetik azt.
“All nothings are not equal.”
-
Karma
félisten
válasz
Korcsii #1739 üzenetére
A Borland és a Turbo is két antik retek, amit csak azért nyomnak az iskolákban, mert a tanárok lusták művelni magukat. Ahogy az előbb is említettem, csak DOS-ban működő móka mind a kettő.
A Dev-C++ teljesen korrekt választás, bár én annyira nem szeretem azt az IDE-t. Anno Code:
locks-ot használtam első félévben, azóta meg XCode-ot.
“All nothings are not equal.”
-
Karma
félisten
Ha használhatót és egyszerűt akarsz tanulni, akkor nézegesd az SDL-t. Milliárd platformon fut, tényleg egyszerű, és vannak hozzá sablonok is akár.
Ha C++-ra váltasz, akkor meg Qt.
De az más nyelv, mint a hagyományos C++, viszont vannak jó könyvek róla.[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Retekegér #1775 üzenetére
Sajnos attól még nem lesz semmi értelme, tényleg. Én is ezt a könyvet adtam látatlanban az öcsémnek, hogy ebből összeszedheti a nyelv alapjait, de azt tapasztaltam (legalábbis a '96-os kiadásban), hogy sokszor van, hogy nem mondja el a miértet.
Jester01: De ha csak annyi a lényeg, hogy véletlenszámokat generáljunk (ami persze ebben a formában oximoron), akkor nincs semmi értelme. Én ezt feltételeztem.
[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Korcsii #1789 üzenetére
Nezd meg az strcmp fuggvenyt, azzal lehet peldaul ket karakterlancot ABC szerint osszehasonlitani.
Az mar egy kicsit nagyobb magia, hogy olyan fuggvenyt irj, ami a struktura tetszoleges tagvaltozoja szerint kepes rendezni. C++-ban tudom hogy van erre megfelelo pointertipus, sima C-ben nem tudom.
[ Szerkesztve ]
“All nothings are not equal.”
-
-
Karma
félisten
-
Karma
félisten
válasz
Sk8erPeter #1815 üzenetére
Ez egyébként ahhoz a hftestes hülyeséghez kell, nem?
Tényleg ez a megoldás, amit írtál, egy for ciklus és szevasz.
Én is így csináltam.[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
-
-
Karma
félisten
-
Karma
félisten
A char egy -128-tól 127-ig terjedő egész szám, csak véletlen, hogy a karaktereket is ezzel írja le a paraszt a C nyelvben. Mivel belül nem tizes számrendszerben tárolja a rendszer a számokat, de még csak nem is BCD-ben, Neked kell kézzel kiszámolnod az egyes helyiértékeket. A tizes maradékos osztás csodákra képes
“All nothings are not equal.”
-
Karma
félisten
válasz
Adamka1999 #1873 üzenetére
Tessék kettő is: GMP, OpenSSL BN.
[ Szerkesztve ]
“All nothings are not equal.”
-
Karma
félisten
válasz
Sk8erPeter #1891 üzenetére
Ebben semmilyen objektumorientalt elv nem volt... Kivancsi lennek arra a tanarra, aki ilyet lehetove tesz. Asszem elzavarnam utcat soporni vagy arkot asni inkabb.
“All nothings are not equal.”
-
Karma
félisten
válasz
Korcsii #1918 üzenetére
McDonaldsos konyhas inkabb...
Mondjuk vannak olyan szakok, ahol teljesen feleslegesen is beraknak programozast, nem tudom milyen motivaciobol. Pl. a Godolloi Egyetem kornyezetmernoki szakan vegzett ismerosomnek Visual Basicet kellett volna programoznia. Termeszetesen tanitani ott se tanitottak, az eloado peldakodjai is hackeltek es rondak voltak, de eleg korrepetalas utan sikerult atmennie.
“All nothings are not equal.”
-
Karma
félisten
Ú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!
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Politika
- Milyen CPU léghűtést vegyek?
- ubyegon2: Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- Projektor topic
- iPhone topik
- Poco F3 - a mindenes, de nem mindenkinek
- Autós kamerák
- Crypto Trade
- Router gondok
- További aktív témák...