Aktív témák
-
pmonitor
aktív tag
Van 1-2 téma, ami a "Programozás topic"-ban off témának számít. Mert oda véleményem szerint is csak programkódok valók. Minden más igazából ott off-nak számít. Ebben a topic-ban olyan témáknak van helye pl., hogy:
1. Mikor számít a program sebessége, és mikor kevésbé?
2. Kliens oldalon számít-e a sebesség, vagy nem?
3. Programozók/szoftvermérnökök/egyéb titulussal ellátott emberkék felelőssége.
4. Kell-e egy fizetős "szolgáltatónak" fel'homályosítani az ügyfelet a (pl. biztonsági) kockázatokról?
Meg még sok mindenről lehet véleményt alkotni. Tehát minden, ami a "rizsa" kategóriába tartozik, az jöhet ide!http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Pl. most az a téma, hogy az asm-ben mit lehet megcsinálni. Sztem. minden olyant, amit a számítógépen meg lehet csinálni. Magas szintű struktúrákat/objektumokat kezelni. Vagy akár programnyelvet írni: pl. Pythont is akár. Vagy GC-t írni. Vagy böngészőt írni. Vagy ezeknek csak 1 lebutított változatát. Tehát mindent, ami a vason megcsinálható!
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
hiperFizikus
aktív tag
szerintem mehetne oda is, de ha már beléd botlottam, hát legyen ide /:
Én mint laikus tudok a NETen listás adatokat keresni az egyszerűbb programjaim részére, de ti mint profi programozók biztosan ezt is jobban csináljátok ! Ti honnan vesztek az internetről adatokat a programjaitokhoz ?
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
pmonitor
aktív tag
válasz hiperFizikus #3 üzenetére
Én nem vagyok profi programozó!
De azért köszi, hogy ide botlottál.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #5 üzenetére
Mondjuk attól függ, hogy éppen mihez. De általánosságban könyv, google, stackoverflow, codeproject stb...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #7 üzenetére
És te honnét veszed a mannát?
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
hiperFizikus
aktív tag
Most innen fogom megpróbálni, de annyi más dolgom is akad egyszerre ♥
"
Ön
Melyik Wikipédia lapok szólnak a Wikipédia nagyarányú letöltögetéséről ?Copilot
Válaszok létrehozása…A Wikipédia nagyarányú letöltögetéséről szóló információkat nem találtam a keresési eredményekben. Lehet, hogy a Wikipédia nem tartalmaz erre vonatkozó specifikus oldalt. Azonban a Wikipédia adatbázisának teljes letöltéséről szóló információkat általában a Wikipédia saját segítség és FAQ oldalain találhat meg. Kérjük, ellenőrizze ezeket az oldalakat, vagy keressen rá a “Wikipedia database download” vagy hasonló kifejezésekre az angol Wikipédián. Ha további segítségre van szüksége, kérjük, jelezze! 😊
További információ
1
hu.wikipedia.org
2
hu.wikipedia.org
3
hu.wikipedia.orgÖn
"Azonban a Wikipédia adatbázisának teljes letöltéséről szóló információkat általában a Wikipédia saját segítség és FAQ oldalain találhat meg."Ez lesz az, mutasd a magyar változatát !
Copilot
Válaszok létrehozása…A Wikipédia adatbázisának teljes letöltéséről szóló információkat a Wikipédia saját oldalain találhatja meg. A Wikipédia szócikkek szövegei, a laptörténetek, a naplók és minden más adat (a képeket és egyéb fájlokat kivéve) a Wikimédia Alapítvány központi adatbázisszerverén tárolódik1. Erről az adatbázisról (az érzékeny adatok, mint pl. felhasználói beállítások vagy nem nyilvános naplók kivételével) néhány hetente másolatok készülnek, amelyek a download.wikipedia.org címről letölthetőek1.
Az adatbázis-kezelőbe betöltve szinte bármilyen lista, statisztika vagy egyéb információ kinyerhető belőlük1. Ha nem tudsz egyedül megfogalmazni vagy futtatni egy lekérdezést, a Wikipédia:SQL-futtatási kérések oldalon kérhetsz segítséget1.
Azóta elérhetővé vált egy webes szolgáltatás, amelynek segítségével saját adatbázis-kezelő telepítése és saját adatbázispéldány letöltögetése helyett az interneten futtathatod a lekérdezéseidet1.
Azért is érdemes kipróbálni, mert így nem a saját géped erőforrásait fogyasztja a lekérdezés, hanem egy erre felkészített hardverkonfiguráción futtathatod1. A Quarry címe: quarry.wmflabs.org1.
Remélem, ez segít! Ha további kérdése van, szívesen segítek! 😊
További információ
1
hu.wikipedia.org
2
quarry.wmflabs.org
3
en.wikipedia.orgÖn
Jól hangzik, de még ki kellesz próbálnom !Copilot
Válaszok létrehozása…Természetesen, vegye a maga idejét! Ha bármilyen kérdése merül fel a folyamat során, vagy további segítségre van szüksége, ne habozzon megkérdezni. Itt vagyok, hogy segítsek! 😊
"[ Szerkesztve ]
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
pmonitor
aktív tag
válasz hiperFizikus #9 üzenetére
Nagyon belezúgtál ebbe a mesterséges intelligenciának nevezett akármibe.
Végül is időtöltésnek biztos jó.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
hiperFizikus
aktív tag
Valóban így van !
A szabadidőmben vagy a szürke betonfalamat bámulom, vagy a laptopommal szórakoztatom magam ! Tehát vagy a másokét nézem az interneten, vagy magam teszek fel az internetre valamit !A sokk olvasgatásnál már egy ideje túl vagyok, mert vagy olvastam már olyasmit vagy nem érdekel . A programok meg legalább maradandónak ígérkeznek és működnek is, ill. mozognak is ♥
Az MI meg ugye csak egy felturbózott nyelvi modell vagy mi lenne ? A programok pedig még mindig többnyire szövegesek . Nem sok különbség van a szakértői rendszer és az MI közt . A szakértői rendszer fő része meg valami végtelenbe vessző adattár lenne ♥
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
hiperFizikus
aktív tag
Ni csak, mire akadtam ♥ Most épen elfoglalt vagyok, de valamelyikőtök próbálja már ki ezt a vonalat is helyetem, közérdek !
Vagyis a ChatGPT hajlandó olyan weboldalt csinálni, amiben elsősorban nincsenek JavaScript kódok .
chatgpt/
->
Hozz létre nekem egy személyes weboldalt, mindezt egy fájlban. Előbb tegyél fel nekem három kérdést bármiről, amiről csak tudni szeretnél.ChatGPT
Rendben, készséggel segítek a személyes weboldalad létrehozásában! Ahhoz, hogy megfelelően testreszabott weboldalt készíthessek neked, először néhány kérdést fel kell tennem:
Milyen célból szeretnéd létrehozni a weboldalt? (pl. blogolás, portfólió, üzleti cél, személyes napló stb.)Milyen stílusú és hangulatú weboldalt képzeltél el? (pl. modern, minimalista, színes, professzionális, barátságos stb.)
Milyen tartalmakat szeretnél megjeleníteni a weboldalon? (pl. rólad szóló információk, blogbejegyzések, projektjeid, fényképek, elérhetőségek stb.)
Válaszaid alapján elkészítem a weboldal vázlatát, és megadom a fájlt, amelyet felhasználhatsz.
/chatgpt[ Szerkesztve ]
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
pmonitor
aktív tag
válasz hiperFizikus #11 üzenetére
Amúgy mi a véleményed arról, hogy 1 profi(vagy magát profinak beállító) programozószerűségnek(teljesen mind1, hogy mi a pontos titulusa) van-e felelőssége abban, amit csinál? Vagy csak felveszi/zsebreteszi a milliókat, 'oszt jó napot.
Sztem. felelősséggel tartozna azért, amit létrehoz. Mert ha nem, akkor mi a bánat különböztetné meg a kezdő/amatőr programozóktól? Csak sajnos nem ez valósul meg. Pl. 13-15 éves gyerekek feltörik azt, amit a milliókat zsebre tevő "szakik" készítettek. És még a gyerekeket ítélik el az ügyben. Nekem ez a véleményem. A tiéd micsoda ezzel kapcsolatban?
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
hiperFizikus
aktív tag
1. a mesterséges intelligenciának titulált ChatGPT és más ChatBot-ok teljesen fel fogják forgatni az emberi társadalom kontextusát !
2. Nem szeretnék eltűnni, mint a szürke szamár a ködben !
3. Az ovodások meg robot teknősbékákat "programoznak be" ugye ? - he he he .
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
hiperFizikus
aktív tag
válasz hiperFizikus #14 üzenetére
4. A megoldás ez a tízparancsolatom lenne, de nem tudok hozzá érdeklődőket szerezni !
Alaptörvény a természetes személyek védelméért
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
pmonitor
aktív tag
válasz hiperFizikus #14 üzenetére
1. Nem hiszem, hogy átforgatná. Legalábbis szomorú lennék ezzel kapcsolatban.
2. És mit csinálsz azért, hogy ne tűnj el a ködben?Egyébként lehet, hogy röhögni fogsz, de én meg nem szerettem volna feltűnni/villogni. De az erős rosszullétek után meg szerettem volna osztani mindenkivel, hogy milyen módszerek/szemétségek mennek a fórumo(ko)n. Természetesen elsősorban a másik fórumon(Magyarország legnagyobb fejlesztői portáljának titulált oldalon). És hogy hogyan tűnnek el értékes topicok/posztok a süllyesztőben. De aztán megcsináltam a legfőbb "programom". Egyébként ezt a programot az ott szereplő velem együtt 2-3 nick posztjaiból raktam össze. Meg módosítottam kovisoft megoldásával(bár sajnos az így is csak elméleti megoldás). 100 szónak is 1 a vége: én tényleg csak fel szerettem volna hívni a leendő "ügyfelek" figyelmét, hogy mi történhet velük, ha fórumra regisztrálnak/kérdeznek. Hogy ilyen ne fordulhasson elő soha többet. Ki tudja, hogy előtte hány topic tűnt el a szemétláda moderátor miatt?
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
hiperFizikus
aktív tag
Azért a fórumot ne keverd össze a blogokkal, és az írásaidat felrakhatod online szerkesztős portálokra is, és ha rendes vagy akkor a különféle wikiket is szerkesztheted !
De így vagy úgy el kell mentegetned external HDD-re mindent !
Ha fűt fát le szemétládázol, akkor nincs rend a fejedben, valószínűleg televan szórólapok szlogenjeivel !
1. Nem hiszem, hogy átforgatná. Legalábbis szomorú lennék ezzel kapcsolatban.
pl. az akadémiák nagy bajban vannak miatta, mert a chatgpt ugyan úgy szövegel mint ők is teszik
2. És mit csinálsz azért, hogy ne tűnj el a ködben?
A portálomra rakok fel írásokat, de mivel mindenki a ChatGPT-én és a Copiloton lóg, ezért ezért is túl kevesen olvasgatják az írásaimat ! - persze vannak látogatási kiugrásaim, de köztük túl kevés .
https://erdosattilask01.lapunk.hu/oldal-terkep-1212798
https://hu.wikibooks.org/wiki/Szerkeszt%C5%91:Okos_%C3%81rny%C3%A9k
https://forum.index.hu/User/UserDescription?u=1922428
A gázt is és a féket is egyszerre nyomni nem menő dolog !
-
pmonitor
aktív tag
És mit csinálsz azért, hogy ne tűnj el a ködben?
Mondjuk én már amúgy is vén is, meg beteg is vagyok ahhoz, hogy olyant alkossak, ami nem tűnik el a ködben. Ami talán nem fog eltűnni, az az, hogy hogyan hasonlítunk össze 2 vágástervet úgy, hogy egyértelműen és objektíven el tudjuk dönteni, hogy melyik a jobb. Esetleg egyformán jók. Sztem. ez idővel talán nem tűnik el a ködben...
De egyébként a jövő a fiatal egészségeseké...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #19 üzenetére
Egyébként elmúltam 49.
A vágástervet leírtam már több helyen is. Bár mondjuk pl. ebben a fórumban úgyis eltűnik.
Az a lényeg, hogy a leeső darabokat kell nézni. 2 terv közül az a jobb, amelyiknél a legkevesebb leghosszabb leeső darab van. Vegyük pl. azt az esetet, amikor az összes leső hossz 3415 mm. Nyilván az lenne a legjobb, ha ez a 3415 mm 1 darabban esne le. Nem mondjuk 1 db 2000 mm-es, és 1 db 1415 mm-es darabban. Az élet azonban nem ilyen 1szerű. Az esetek 99.99999%-ában nincs olyan permutáció, aminél egy szálban lenne az összes leeső hossz.Bár belegondolok, akkor az sem vész talán a ködbe, ami miatt valszeg. doksikat és szak-, tankönyveket kell átírni. Ez pedig az, hogy C#-ban az object nem őse a struktúráknak(struct).
Csak az a baj, hogy ezek sem új dolgok. A másik fórumon mind1iket leírtam már 11
éve(akkor is már 38 voltam).http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #21 üzenetére
Nézzük ezt az oldalt.. Itt 5600 mm-es szálak vannak. Tételezzük fel, hogy a vágás szélessége 0.
Vegyük azt az esetet, amikor 1 szálból 3 db 1820 mm-es darabot vágunk le. Ebből a szálból 140 mm esik le. Ez a leeső darab. Ez a leeső darab vagy hulladék, vagy a későbbi vágásokhoz is felhasználható.
A vágásterv pedig az, amikor felsoroljuk a wikis példában, hogy a felhasznált 73 szálban hogyan helyezzük el a kivágandó darabokat. A wikin ezt táblázatban sorolták fel.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #24 üzenetére
'Aztat én nem tudom.
Engem inkább az érdekelne, hogy pl. az 1d vágásra mit mond a mesterséges intelligencia?
Sztem sok értelmeset nem. Csodálkoznék, ha tévednék. Azon meg főleg, ha meg is oldaná!Tényleg, ha az AI oldana meg egy eddig megoldatlan dolgot, akkor ki kapna Nobel-csontot?
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Mondjuk amint látom, van 1-2 megoldatlan probléma.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
A másik topikban van egy téma, ami ott "off topic". Ezért itt reflektálok rá. Ott én ezt írtam:
De pl az önkiszolgáló kasszák esetén sem értem, hogy miért nem jutott senkinek az eszébe az, hogy legkésőbb a nyugta nyomtatása előtt árucikkenként összesítenék a darabszámot. Csak ezzel mennyi papírt meg lehetne takarítani országosan? Hozzáteszem, hogy ezt nem csak az önkiszolgáló kasszákra, hanem a hagyományos pénztárakra is lehetne alkalmazni. Összefutottam olyan pénztárossal is, aki 14 darab táblás csokit egyesével csippantott le(úgy, hogy én 2 x 7 - es sorba készítettem elő neki). Na, aaz ilyeneket is kiszűrhetné a program. Azért nem mind1, hogy 14 sorba nyomtatja ki a gép, vagy max. 2 sorban.
Erre elég részletes választ kaptam "off topic-ban". Többé-kevésbé valóban elfogadhatónak tűnő magyarázattal. 1-2 megjegyzésem lenne ezekkel kapcsolatban.
1.
A válaszadó azt írta, hogy ennek nagyon 1szerű oka van. Mégpedig a pénztárgép és taxaméter rendelet. Erre csak azt tudom mondani, hogy: tessék mondani, ezt a rendeletet nem a műszaki szakikkal egyeztetve alkották?2.
A válaszadó a következőt is írta:nyomtatót, vevőkijelzőt az adóügyi egység vezérli, nem kötheted direktben a számítógépre, pláne nem vezérelheted a saját fejed szerint.
És tessék mondani, az az adóügyi egység miért olyan buta, hogy nem tudja a darabszám szerint nyilvántartott árucikkeket cikkenként összegezni? Ehhez ugyebár nem a saját fejem szerint kellene vezérelni.Szóval lehet itt komolynak tűnő érveket felhozni. De az a helyzet, hogy a rendeleteket, adóügyi vezérlőegységeket is emberek alkotják. Olyan rendeletek, vezérlőegységek vannak, amit egyes emberek létrehoznak...
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
nyunyu
félisten
A válaszadó azt írta, hogy ennek nagyon 1szerű oka van. Mégpedig a pénztárgép és taxaméter rendelet. Erre csak azt tudom mondani, hogy: tessék mondani, ezt a rendeletet nem a műszaki szakikkal egyeztetve alkották?
Nem hiszem, hogy megkérdezték volna a műszakiakat.
2006 körül volt egy csörtém a pénztárgép engedélyezéskor az APEH jogászaival:
Nem tetszett nekik, hogy az akkori vevőkijelzőnk nem tudott 852-es kelet európai kódlapot, így jobb híján 850 nyugat európait állítottam be az adóügyi egységen, így az automatikusan lecserélte a ő/ű-ket a kalapos megfelelőjükre, és úgy jelenítette meg a tételek neveit.Na, jogászéknak ez nem tetszett.
Kötözködő jogásztól megkérdeztem, hogy ez mégis hol van leírva a jogszabály 2005-ös verziójában, erre csak hebegni-habogni tudott, aztán közölte, hogy Magyarországon be kell tartani a magyar törvényeket.
Oké, akkor melyikben van ez explicite leírva, hogy nem használhatok kalapos ő/ű-t?
Újabb 5 perc izzadás után diadalittasan kinyögte, hogy a magyar helyesírás szabályaiban.Úgyhogy következő pénztárgép vizsgára rajzolhattam magyar karakterkészletet a vevőkijelzőre, előző este rohangásztam a fél várost körbe, hol lehet SOS EPROMot égetni, mert másnap reggel 8-kor jelenésünk volt a pénztárgép bizottság színe előtt az immáron 852-es kódlapra konvertált vevőkijelzővel.
Na úgy átengedtek minket a vizsgán, de az engedélyben kikötötték, hogy a pénztárgépünk csak EPROM cserélt vevőkijelzővel kerülhet forgalomba.
Aztán a következő jogszabály verziótól kezdve már valamelyik paragrafusban explicite kikötötték, hogy minden magyar feliratnak a billentyűzeten, monitoron, vevőkijelzőn, nyomtatón ékezethelyesen kell megjelennie.
És tessék mondani, az az adóügyi egység miért olyan buta, hogy nem tudja a darabszám szerint nyilvántartott árucikkeket cikkenként összegezni? Ehhez ugyebár nem a saját fejem szerint kellene vezérelni.
Adóügyi egység dolga a neki küldött tételek változatlan formában letárolása a "fekete doboz" EPROMjába+nyugtára nyomtatása.
Nem vonhat össze külön-külön érkező tételeket, mivel az az EPROM módosításával is járna, azt meg szigorúan tilos berhelni. (BTK tétel! informatikai eszközzel történő csalás, vagy valami hasonló.)
[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
nyunyu
félisten
Jut eszembe, mit értesz nyugta kinyomtatása előtt?
Olyan opció nincs, hogy húzogatom a vonalkódot, és nem készül nyugta.
Legkésőbb az első vonalkód lehúzásánál meg kell nyitni a következő nyugtát, és tételenként küldeni a sorokat, ami egyből megy az EPROMba.Speciális pénztárgépeknél lehet olyan, hogy gyűlik-gyűlik a rendelés, aztán egyben írjuk ki a nyugtát amikor a vevő fizet, de azok nevesítve vannak a jogszabályban. (pl. éttermi pénztárgépek, meg talán a benzinkutasok is ilyenek)
Általános célú pénztárgépeknél nincs ilyen.Hello IT! Have you tried turning it off and on again?
-
pmonitor
aktív tag
Olyan opció nincs, hogy húzogatom a vonalkódot, és nem készül nyugta.
Olyan nincs. Viszont az üzletlánctól is függ, hogy soronként kiírja-e, vagy csak egyben. Én találkoztam mindkét verzióval. Mondjuk ahol én a legtöbbet szoktam vásárolni, ott úgy történik, hogy, egészen a vásárlás végéig "szerkeszthető" a vásárlás. Csak a végén nyomtatja a nyugtát egyben. De igazából azt sem értem, ha 1 helyen(üzletláncban) meg lehet csinálni ezt, akkor a másikban miért is nem? És ez sztem. nem jogi kérdés. Legalábbis feltételezem, hogy ahol a végén nyomtatja a nyugtát, az is legális(mert ellenkező esetben nyilván nem így csinálnák). Tehát ez csak a programozó(ko)n/gyártókon múlik, hogy tételenként nyomtat vagy egyben a végén(nem a jogászokon).
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
nyunyu
félisten
Nyilván ez függ attól is, hogy már mennyire van készen / eleve hogy működik a bolti szoftver, amihez kell illeszteni egy magyar jogszabályoknak megfelelő AEE-t, meg attól is, hogy egyáltalán milyet találtál kulcsrakészen a pár szereplős piacon, amihez nem kell nulláról új firmwaret fejleszteni, mint a külföldi hardvereknél.
Nálunk készen volt a (külföldi) éttermi szoftver, de nem tudott magyar nyugtát adni.
Cseh, orosz, szerb adóügyi egységet ugyan támogatta, de azok ugye itthon nem használhatóak, mert totál más jogszabályi környezetben működnek.Úgyhogy itthoni pénztárgép(modul) gyártóknál kellett körbenéznünk *, hogy hol lehet olyan nyomtatóval egybeintegrált adóügyi egységet kapni, amit nekünk a megfelelő driver megírása után adatokkal kell csak etetni, aztán kijön rajta a hivatalos, APEH által elfogadott nyugta. (Akkor még APEH volt.)
Azzal mi egyáltalán nem akartunk foglalkozni, hogyan kezeli belül az EPROMot, meg hogyan szummázza nap végén az ilyen-olyan kategóriákat.Mivel nálunk a tételek már felütéskor összevonódtak, és a nyugtát csak a fizetési folyamat végére illesztettük be (miután kiválasztottad, hogy KP vagy kártya), így mi egyben küldtünk mindent az AEE-nek.
*: 2012-es online pénztárgép bevezetés eléggé felborította a piacot, mivel a legnagyobb pénztárgép forgalmazó nem akart a NERtől vásárolni a "jogszabálynak megfelelő" SIM kártyát + fizetni utána a havi 2k? előfizetési díjat, szimplán kigolyózták a piacról, 100k pénztárgép legyártása után szimplán visszavonták az engedélyét, és minden előrendelőnek vissza kellett adnia a pénztárgép árát...
Külföldről piaci áron vett hardvert meg max ócskavasként tudta utána eladni.Most fogalmam sincs, mely magyar cégeknél lehet az aktuális szabályoknak megfelelő modulokat kapni.
[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
nyunyu
félisten
2010 körül átmentem az egyik konkurenciához, aztán amikor megláttam az ezer sebből vérző pénztárgépüket, akkor megkérdeztem a főnököt, hogy mégis ezt hogy tolták át a pénztárgép előminősítésen, majd a vizsgákon?
Egyszerű, csúszott a boríték a pénztárgép bizottság elnök zsebébe, aztán nem kérdeztek semmit.
Korábbi főnököm szentül hitte, hogy 2000-re már levetkőztük a balkáni attitűdöt, és a gazdaságot már nem a kenőpénzek működtetik.
Pedig a külföldi tulajdonosunknak pont ez volt az első kérdése, hogy kit kell megkenni, meg mennyivel, mert az egyszerűbb, mint lefejleszteni, amit kérnek. (miután elküldtem nekik angolra fordítva a 30+ oldalas komplett jogszabályt)Mivel nem kentünk, a bizottság extrán mélytorkoztatott minket.
Ne tudd meg, hányszor kellett újraírnom a pénztárgép user guideot, mert a jogásznak nem tetszett valami apró felirat a képernyőn, aztán "bugfix" után csináltattam újra az összes screenshotot.
Programozóként nem mindig látszik a projektek mögötti összes bullshit, amit a jogászok+managerek kavarnak a háttérben.
[ Szerkesztve ]
Hello IT! Have you tried turning it off and on again?
-
pmonitor
aktív tag
csúszott a boríték a pénztárgép bizottság elnök zsebébe, aztán nem kérdeztek semmit.
Én nem vagyok sem programozó, sem pénztáros, sem NAV munkatárs, meg semmi ilyesmi. Csak 1 1szerű halandó. De sztem. nagyon sokan biztosak benne, hogy ez van a háttérben, amit itt leírtál. Sok az üres zseb. Arról nem is beszélve, hogy gondolom bizonyos gyártó(k)ra szabják a rendeleteket. De ez sajnos mindenhol így van. De ez már kezd politika lenni, amibe nem szívesen megyek bele egy programozási fórumban. Még akkor sem, ha ezt a topikot elsősorban a "rizsák" részére hoztam létre. Nemrég az egyik nick mondta, hogy nem hiszi el, hogy a Magyar nyelv szókincsével nem lehet mindent leírni. Na ez, amiről most beszélünk, ez már a határt súrolja. Ha még tovább mennék, akkor annak egy időre kitiltás lenne a vége...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Többször szóba került a sorba rendezés. Egyrészt a sebesség miatt, másrészt pedig hogy melyik lehet a legjobb. Itt a .NET-ben beépített rendezéseket hasonlítottam össze. A program kimenete a következő:
Array.Reverse: 6690
QuickSort: 4600
QuickSort "C": 4300
Array.Sort() delegate: 10316
Array.Sort() CompareTo: 12987
OrderBy: 54696A beépített rendező módszerek közül az Array.Sort() bizonyult. A legrosszabb pedig az arr.OrderByDescending() bizonyult.
A nem beépített rendező algoritmus közül a következő rendezés még az Array.Sort()-nál is gyorsabb:
static void QuickSort(int[] arr2, int p, int r)
{
int Low, High, MidValue;
Low = p;
High = r;
MidValue = arr2[(p + r) / 2];
do
{
while (arr2[Low] > MidValue) ++Low;
while (arr2[High] < MidValue) --High;
if (Low <= High)
{
int T = arr2[Low];
arr2[Low] = arr2[High];
arr2[High] = T;
++Low;
--High;
}
} while (Low <= High);
if (p < High) QuickSort(arr2, p, High);
if (Low < r) QuickSort(arr2, Low, r);
}Tapasztalatom szerint általában ezt a rendező algot célszerű használni, ha optimalizálni szeretnénk.
Ugyanezt az algot megcsináltam úgy, hogy C-ben írtam 1 "sortingsdll.dll" nevű .dll file-t.
A függvény törzsében karakterenként is ugyanaz az algo a C-ben írt .dll file-t használva C#-ban kb. 4-6 %-al gyorsabb.
Ez azt jelenti. hogy ha ragaszkodunk a C#-hoz, és sebességre akarunk optimalizálni, akkor mindenképpen azt célszerű választani(ha lehet), hogy C-ben írt .dll file-ba tesszük bele az adott függvényt, és ezt használjuk fel a C#-ban. Így nem mondunk le a C#-ban lévő gyors fejlesztésről, és mégis gyors programot írhatunk.Itt írtam, hogy asm-ben minden magasabb szintű struktúra megvalósítható. Ugyanez a kijelentésem sztem. C-re is vonatkozik. Kiemelném a programom kimenetéből a következő kettőt:
Array.Reverse: 6690
QuickSort "C": 4300Ebből egyértelműen látható, hogy a beépített Array.Sort() több mint 2 másodperccel lassabb, mint a C-s .dll függvényt használó kód. Azért ez nagyon nagy különbség(kb. 50%).
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Azt meg nem is írtam, hogy ez a formátum:
void QuickSort(int[] arr2, int p, int r)
Nem csak gyors. Ezen kívül van még egy nagy előnye: mégpedig az, hogy 1 tömb résztartományát is lehet vele rendezni, nem csak egy egész tömböt.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Egy példa arra, hogy azért semmiképpen nem árt, ha 1 C# programozó (is) tisztában van az asm és a C alapjaival(legalább).
Van a következő C# kód:
using System;
using System.Runtime.InteropServices;
namespace ArrTeszt
{
internal class Program
{
[DllImport("ArrTestDll.dll", SetLastError = false)]
public static extern void LengthInt(int[] arr, int index);
[DllImport("ArrTestDll.dll", SetLastError = false)]
public static extern void LengthInt2D(int[,] arr, int row, int col);
static void Main(string[] args)
{
int index = 3, row = 2, col = 1;
int[] arrtest = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int[,] arrtest2D = new int[,] { { 12, 11, 10 }, { 9, 8, 7 }, { 6, 5, 4 }, { 3, 2, 1 } };
int x = arrtest[index];
int y = arrtest2D[row, col];
Console.WriteLine("arrtest[{0}]: {1}", index, x);
LengthInt(arrtest, index);
Console.WriteLine("arrtest2D[{0}, {1}]: {2}", row, col, y);
LengthInt2D(arrtest2D, row, col);
Console.ReadKey(true);
}
}
}és vannak a következő függvények 1 .dll-ben:
__declspec(dllexport) void __stdcall LengthInt(int arr[], int index)
{
if (index < (*(arr - 1)))
{
printf("arr[%d]: %d\n", index, arr[index]);
printf("arr.Length: %d\n", *(arr - 1));
}
}
__declspec(dllexport) void __stdcall LengthInt2D(int arr[], int row, int col)
{
if (row < (*(arr - 4)) && col < (*(arr - 3)))
{
printf("arr[%d, %d]: %d\n", row, col, *(arr + (row * (*(arr - 3))) + col));
printf("Sorok szama: %d\nOszlopok szama: %d\n", *(arr - 4), *(arr - 3));
}
}A C# kód releváns assembly kódja:
index = ebp-40h
row = ebp-44h
col = ebp-48h
&arrtest = ebp-4Ch
&arrtest2D = ebp-50h
x = ebp-54h
y = ebp-58h
int x = arrtest[index];
02A90919 mov eax,dword ptr [ebp-40h]
02A9091C mov edx,dword ptr [ebp-4Ch]
02A9091F cmp eax,dword ptr [edx+4]
02A90922 jb ArrTeszt.Program.Main(System.String[])+0E1h (02A90929h)
02A90924 call 70A5FF80
02A90929 mov eax,dword ptr [edx+eax*4+8]
02A9092D mov dword ptr [ebp-54h],eax
int y = arrtest2D[row, col];
02A90930 push dword ptr [ebp-48h]
02A90933 mov ecx,dword ptr [ebp-50h]
02A90936 mov edx,dword ptr [ebp-44h]
02A90939 call System.Int32[,].Get(Int32, Int32) (02A90140h)
02A9093E mov dword ptr [ebp-6Ch],eax
02A90941 mov eax,dword ptr [ebp-6Ch]
02A90944 mov dword ptr [ebp-58h],eaxA C# program kimenete:
arrtest[3]: 6
arr[3]: 6
arr.Length: 9
arrtest2D[2, 1]: 5
arr[2, 1]: 5
Sorok szama: 4
Oszlopok szama: 3Az nem nagyon meglepő, hogy a C .dll-nek átadott 1D int tömbnek átadott pointer előtti int tartalmazza a tömb hosszát.
Ami inkább meglepőbb, az a C# mátrix kezelése. A C .dll függvénynek átadott pointer előtti negyedik int a mátrix sorainak a száma, és a pointer előtti harmadik int a mátrix oszlopainak a száma. Viszont a C# mátrix a C-s .dll-nek 1D tömbként adódik át(nem mátrix-ként)!! Tehát a C#-al ellentétben itt memória címzéssel lekérdezhető a mátrix 1 eleme. A C# erre külön metódust használ:02A90939 call System.Int32[,].[B]Get[/B](Int32, Int32) (02A90140h)
Itt látható, hogy a C#-ban a Get() metódus hívódik meg.
Na ilyen "ínyencségeket" nem tudhat meg 1 olyan C# programozó, akinek fogalma sincs az asm-ról és a C-ről!
Itt látszik, hogy a C# miért lassabb.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
A C# topikban volt 2 kijelentés, ami arra ösztönzött, hogy írjak 1 példa kódot. Ezek a kijelentések. Az egyik:
c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
A másik:
Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.
A következő kódban egyértelműen látszik, hogy mi a fő különbség a class és a struct között.
Mint ahogy az is látható, hogy a foreach megvalósítható while() és for() ciklussal is, de:
1: Nem erre találták ki ezeket, hogy 1 user programozó így használja ezeket, amikor ott van a foreach(). A foreach direkt erre készült.
2: A while() használata esetén igazából 3 utasítás az, amit a foreach() 1 utasítással megold.
3: A foreach használata biztonságosabb, mint a while(). Lásd a példakódban azt a sort, aminek a végén a "//BUMMM!!!" megjegyzés van.using System;
using System.Collections.Generic;
namespace Teszt
{
class TesztOsztaly
{
public int X { get; set; }
public TesztOsztaly(int x)
{
X = x;
}
}
struct TesztStruct
{
public int X;
public TesztStruct(int x)
{
X = x;
}
}
internal class Program
{
static void Main(string[] args)
{
List<TesztOsztaly> tesztosztalyok = new List<TesztOsztaly>();
tesztosztalyok.Add(new TesztOsztaly(1));
tesztosztalyok.Add(new TesztOsztaly(2));
tesztosztalyok.Add(new TesztOsztaly(3));
foreach (TesztOsztaly item in tesztosztalyok)
{
//if (item.X == 2) item = new TesztOsztaly(6); //Invalid!!!
//if (item.X == 2) tesztosztalyok.Remove(item); //Invalid!!!
//tesztosztalyok[1] = new TesztOsztaly(5); //Invalid!!!
item.X = 11;
}
for (int i = tesztosztalyok.Count - 1; i >= 0; --i)
{
if (tesztosztalyok[i].X == 1) tesztosztalyok.RemoveAt(i); //Valid!!!
if (tesztosztalyok[i].X == 2) tesztosztalyok[i] = new TesztOsztaly(6); //Valid!!!
if (tesztosztalyok[i].X == 6) tesztosztalyok[i] = new TesztOsztaly(8); //Valid!!!
}
HashSet<TesztOsztaly> htesztosztalyok = new HashSet<TesztOsztaly>();
htesztosztalyok.Add(new TesztOsztaly(1));
htesztosztalyok.Add(new TesztOsztaly(2));
htesztosztalyok.Add(new TesztOsztaly(3));
htesztosztalyok.Add(new TesztOsztaly(4));
HashSet<TesztOsztaly>.Enumerator enumerator = htesztosztalyok.GetEnumerator();
while (enumerator.MoveNext())
{
TesztOsztaly item = enumerator.Current;
//if (item.X == 3) htesztosztalyok.Remove(item); //Invalid!!!
item.X = 11;
item = new TesztOsztaly(3); //BUMMM!!!
}
Console.WriteLine("htesztosztalyok:");
foreach (TesztOsztaly item in htesztosztalyok)
{
Console.WriteLine(item.X);
}
Console.WriteLine("");
foreach (TesztOsztaly item in htesztosztalyok)
{
item.X = 12;
}
foreach (TesztOsztaly item in htesztosztalyok)
{
Console.WriteLine(item.X);
}
Console.WriteLine("tesztstructlist:");
List<TesztStruct> tesztstructlist = new List<TesztStruct>();
tesztstructlist.Add(new TesztStruct(1));
tesztstructlist.Add(new TesztStruct(2));
tesztstructlist.Add(new TesztStruct(3));
tesztstructlist.Add(new TesztStruct(4));
foreach (TesztStruct item in tesztstructlist)
{
//item.X = 11; //Invalid!!!
}
List<TesztStruct>.Enumerator enumeratorstruct = tesztstructlist.GetEnumerator();
while (enumeratorstruct.MoveNext())
{
TesztStruct item = enumeratorstruct.Current;
Console.WriteLine(item.X);
}
Console.ReadKey(true);
}
}
}Aki ezt a kódot megérti, hogy mi miért úgy történik ahogy, akkor ő megértette a lényeget. És nem ír olyanokat, hogy tökmind1, hogy foreach(), for(), vagy while().
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Ez a postom példa arra, hogy meg lehet etetni az olyan "profi" VS C# programozókat, akik nem tudnak alapvető dolgokat sem debuggolni asm-ben. Na meg azt is megmutatja, hogy az ember jobb, ha csak a saját szemének hisz. Ebben a videóban van 1-2 helyen olyan rész, amely megmutatja az asm-ben való debuggolást. Csak ahhoz, hogy közvetlenül megismerjük a VS C# memóriakezelését, ahhoz ezt át kell ültetni VS-be. Persze ehhez ismerni kell az asm alapjait/lényegét is. Ha debug módban futtatás előtt teszünk 1 breakpoint-ot 1 metódusban lévő utasításra, majd futtatjuk F5-el, majd megnyitjuk a Debug->Windows->Disassembly menüpontot, akkor meg is kezdhetjük az asm-ben lévő debuggolást. A memória tartalmát a Debug->Windows->Memory->Memory 1 menüponttal tudjuk láthatóvá tenni. Majd a Debug->Step Into és a Debug->Step Over menüpontokkal tudunk lépegetni.
Ebben a topikban írta az egyik "profi" programozó, hogy:
Az online közösségi média a pszichopata viselkedés melegágya, mert ott megengedhetnek maguknak olyan stílust, amiért a való életben már repülne egy pofon.
Mintha a pofozkodás etalon lenne a szociális/etikus/kultúrált viselkedésnek. Mintha a pofozó emberke nem szenvedne viselkedészavarban. De hát ilyenek a profi programozók. Egyébként ebben a topikban semmi nyomát nem látom, hogy a programozásról egyetlenegy szó is esne. Sem "rizsa", sem magas szintű programozás szintjén. Ilyen, amikor a "profi" programozók programoznak...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
-
pmonitor
aktív tag
Készítettem 1 videót a disassembly használatára. Ez megmutatja a különbséget az érték és referencia típusok között. Valamint betekintést nyerhetünk az ASM világába is.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Ebben a videóban nincs benne, hogy az ELTE leírása is a szöveget az érték típusok közé sorolja. De a valóságban a string olyan referencia típus, mint a huzat. A következő kód ezt hivatott bemutatni(unsafe kódot engedélyezni kell a project-ben):
using System;
using System.Collections.Generic;
namespace TesztCsharp
{
internal class Program
{
static void Main(string[] args)
{
string s = "asdfg";
Console.WriteLine(s);
string s2 = s;
CString(s);
Console.WriteLine(s);
Console.WriteLine(s2);
Console.ReadKey(true);
return;
}
static unsafe void CString(string s)
{
fixed (char* ptr = s)
{
*ptr = 'z';
Console.WriteLine("Length: {0}", *(((int*)ptr) - 1));
}
}
}
}Itt látható, hogy az unsafe kód lefutása után s és s2 értéke is megegyezik. A
string s2 = s
utasítás csak a referenciát adta át.
Hát az ELTE-n is ilyen blődségeket tanítanak-tanulnak, hogy a szöveg(string) érték típus. Ezek után én már semmin nem csodálkozom...
De az unsafe kódon látszik, hogy ennek használatához ismerni kell a C-s mutatókat(pointereket).[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #44 üzenetére
Referencia típus. Gyakorlatilag 1 mutató, ami az object-re mutat. Az object meg a referencia típusok őse. Az object-nek meg az érték típusokhoz alapból semmi köze sincs.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Igazából globális fogalom meghatározásokat(definíciókat) nem is olyan egyszerű létrehozni. Pl. a referencia típus meghatározható így is, amit írtam. De sajnos ebbe a definícióba is bele lehet kötni. Pl. a delegate-eknek nem tudom, hogy van-e object-jük(nem követtem végig asm-ben). A referencia típusoknak talán egy pontosabb meghatározása az, hogy:
Ha egy konkrét memóriacímre kell létrehozni az adott típust, és az adott mem.címen csak egy System.IntPtr van, az adott típus pedig azon a mem.címen jön létre, ahová az IntPtr mutat, akkor referencia típus.
Ha a konkrét mem.címen csak "érték" jön létre(tehát nem jön létre más mem.címen új típus), akkor érték típus.Talán ezek a definíciók pontosabbak, mint amit az előző postomban írtam. De lehet, hogy még ez sem teljesen pontos. De az biztos, hogy 1 string-et érték típusok közé sorolni, az kritikus hiba.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
válasz hiperFizikus #48 üzenetére
A char érték típus. Unicode karakterek vannak.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
Az eltén nem tanítanak blődségeket, a copy on write fogalmával érdemes barátkozni.
Az egész bonyolítás azért lett kitalálva, mert ha a string nem value típus, akkor szívás vele dolgozni és nagyon könnyű hibázni. Ha value típus és mindenhol másolatot készítesz belőle, az meg brutál lassú és memóriaigényes lesz.Ezért a fordító eljátssza azt neked, hogy a string value típus, mint ha minden egyes stringed egy másolat lenne, de valójában csak akkor másol, amikor muszáj.
Sőt olyan is van, hogy csak egy részét másolja le.Szval amikor te az unsafe kódban ott turkálod a memóriát, és azt hiszed, hogy okosságra jöttél rá, akkor hidd el, akik a fordítót írták, azok okosabbak nálad meg nálam összeadva kétszer.
A referencia pedig gyakorlatilag nem egy mutató. A mutató a mutató.
Ha ugyanazt jelentenék, akkor nem létezne két külön fogalom rá.[ Szerkesztve ]
-
cucka
addikt
válasz hiperFizikus #44 üzenetére
Itt azért keveredik a szezon a f*zommal.
Egy magas szintű nyelvben a string az egy karakterlánc, valamilyen jól meghatározott kódolással. Az, hogy hol van a memóriában, hány byte-ot kell neki foglalni, mikor kell felszabadítani, mikor kell lemásolni, ezt mind a fordító fogja neked kitalálni és nem kell vele foglalkozz.
C-ben a string az egy char*, ami egy mutató, ami egy darab memória legelső byte-jára mutat.
A char típus egy byte-ot jelent, nem egy karaktert.
A stringed vége a legközelebbi 0x00 byte lesz.
Szóval van egy halom byte-od. C-ben ez a string. Azt csinálsz vele, amit akarsz, rád van bízva, hogy milyen karakterkódolás szerint értelmezed, vagy egyáltalán ember által olvasható karakterként értelmezed-e.
Ha beolvasol egy jpeg képet a memóriába, akkor az is egy byte halmaz lesz, az is char* típus lesz, a te dolgod, hogy tudd, hogy mit kezdj vele.[ Szerkesztve ]
-
cucka
addikt
Még egy nem annyira apróság, ami kimaradt.
Amit írtam, az ott érvényes, ahol a string mutable.
Java-ban (meg talán c#-ban is) a string immutable.
Immutable esetben értelmét veszti a copy on write technika, mert ugye nincs write.
A stringjeidet immutable értékként kezeled oszt jónapot. -
pmonitor
aktív tag
Köszönöm, hogy leírtad a véleményed. Viszont azután sem értek egyet veled, hogy többször is elolvastam, amit írtál, és nagyjából értem is az álláspontod. Az unsafe kódban valójában 1 konstans(pontosabban read only) memóriát módosítok. A string literál címe akkor jön létre, amikor betölti a .exe file-t a memóriába, és onnantól kezdve fix memóriacímen van. Ha asm kódban debuggoljuk, akkor a címe ez:
string s = "asdfg";
00C0087D mov eax,dword ptr ds:[3D3242Ch]De a 3D3242Ch címen csak referencia van(0x02D322F0). Ahová az mutat, ott van a string:
0x02D322F0 dc ab c9 6f 05 00 00 00 61 00 73 00 64 00 66 00 67 00
Tehát a referencia alacsony szinten egy mutató. Magas szinten referenciának keresztelték el. Mert C#-ban a mutató kifejezés már foglalt. C#-ban a mutató az, amit unsafe kódban lehet használni.
Ezek miatt nem értek veled egyet.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Nézd meg, hogy ez a kód mit ír ki:
string s = "asdfg";
if(s is ValueType) Console.WriteLine("Érték");
else Console.WriteLine("Referencia");És egyből világossá válik, hogy az ELTE-n blődséget tanítanak-tanulnak. Vagy tán ennek a kódnak sem hiszel?
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Nem ismeretlen. Csak jó tisztában lenni azzal, hogy ami absztrakciós szint, azt hogyan valósítja meg a fordító alacsony szinten. Pl. ami abstrakciós szinten referencia(bár én itt jobban szeretem a System.IntPtr kifejezést), az alacsony szinten pointer.
A referencia maga érték típus. Végül is minden típus egyszerű érték típusokból épül fel(és nem object-ből!!!).http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Végül is minden típus egyszerű érték típusokból épül fel
Egyszerű érték típusok a következők:
beépített numerikus típusok
karakter típus(char)
logikai típus(bool)
System.Intptr(referencia)Remélem, hogy nem hagytam ki semmit.
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Azt nem is írtam eddig, de ahol lehet, ott string helyett inkább StringBuilder-t ajánlott használni. Sokkal gyorsabb. Nyilván ahol valami miatt nem lehet, ott nem.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Felsorolásra(enum) a következő példa/minta kódot írtam:
using System;
namespace TesztCsharp
{
internal class Felsorolas
{
static void Main(string[] args)
{
Szinek szin = Szinek.Kek;
if (szin is ValueType) Console.WriteLine("Ertek tipus.\n");
else Console.WriteLine("Referencia tipus.\n");
string str = Enum.GetName(typeof(Szinek), szin);
Console.WriteLine(str);
Console.WriteLine("");
foreach (string item in Enum.GetNames(typeof(Szinek)))
{
Console.WriteLine(item);
}
Console.ReadKey(true);
return;
}
enum Szinek : long { Piros = 1, Feher, Zold, Kek, Sarga = 6, Lila, Narancs, Fekete };
}
}A kimenet:
Ertek tipus.
Kek
Piros
Feher
Zold
Kek
Sarga
Lila
Narancs
FeketeFigyeljük meg, hogy az enum kulcsszóval deklarált típusnévvel létrehozott változó érték típus!!! Ami nem véletlen. Az enum típusa csak beépített numerikus egész lehet. Tehát 1, 2, 4, vagy 8 byte-os egész. Alapesetben(ha nem adjuk meg) int. A System.Enum osztály viszont adattagok nélküli referencia típus.
Az enum elemei alapesetben 0-val kezdődnek, és mindig 1-el nőnek. Ha eltérő számot adunk meg, akkor nyilván onnantól nő egyesével az elemek értéke.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
A következő C# kód a delegate-ek használatát mutatja be:
using System.Runtime.InteropServices;
namespace TesztCsharp
{
internal class Delegates
{
static int Main(string[] args)
{
ADD add = Add;
if (add is ValueType) Console.WriteLine("Ertek tipus.\n");
else Console.WriteLine("Referencia tipus.\n");
int sum = add(2, 3);
int sum2 = Add(2, 3);
Console.WriteLine("a + b = {0}\na + b = {1}", sum, sum2);
MessageBox(0, "Tartalom", "Cím", 0);
IntPtr lib = NativeLibrary.Load("user32.dll");
IntPtr addressA = NativeLibrary.GetExport(lib, "MessageBoxA");
IntPtr addressW = NativeLibrary.GetExport(lib, "MessageBoxW");
/*
//Regebbi verziok eseten:
IntPtr lib = LoadLibrary("user32");
IntPtr addressA = GetProcAddress(lib, "MessageBoxA");
IntPtr addressW = GetProcAddress(lib, "MessageBoxW");
*/
MessageBoxA MsgBoxA = (MessageBoxA)Marshal.GetDelegateForFunctionPointer(addressA, typeof(MessageBoxA));
MessageBoxW MsgBoxW = (MessageBoxW)Marshal.GetDelegateForFunctionPointer(addressW, typeof(MessageBoxW));
MsgBoxA(0, "Tartalom_A", "Cím_A", 0);
MsgBoxW(0, "Tartalom_W", "Cím_W", 0);
/*
unsafe
{
var MsgBoxPA = (delegate* unmanaged<int, string, string, int, int>)addressA;
var MsgBoxPW = (delegate* unmanaged<int, IntPtr, IntPtr, int, int>)addressW;
MsgBoxPA(0, "Tartalom_PA", "Cím_PA", 0);
MsgBoxPW(0, Marshal.StringToHGlobalUni("Tartalom_PW"), Marshal.StringToHGlobalUni("Cím_PW"), 0);
}
*/
NativeLibrary.Free(lib);
return 0;
}
[DllImport("user32.dll", CallingConvention = CallingConvention.StdCall, SetLastError = true, CharSet = CharSet.Auto)]
static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
delegate int MessageBoxA(int hWnd, string lpText, string lpCaption, int uType);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
delegate int MessageBoxW(int hWnd, string lpText, string lpCaption, int uType);
delegate int ADD(int a, int b);
static int Add(int a, int b)
{
return a + b;
}
/*
//Regebbi verziok eseten:
[DllImport("kernel32", CharSet = CharSet.Ansi)]
extern static IntPtr GetProcAddress(IntPtr hwnd, string procedureName);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPWStr)] string lpModuleName);
[DllImport("kernel32.dll")]
static extern IntPtr LoadLibrary(string dllToLoad);
*/
}
}A kimenet:
Referencia tipus.
a + b = 5
a + b = 5Mint látjuk, a delegate referencia típus. Ha az unsafe kódot használnánk, akkor engedélyezni kell a projektben. A legegyszerűbb használat ez:
static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
De azért nem árt, ha a többi lehetőséggel is tisztában vagyunk.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Egy példa arra, hogy hogyan lehet átírni a konstansokat. unsafe kód kell hozzá.
string[] strt = Enum.GetNames(typeof(Szinek));
foreach (string item in strt)
{
Console.WriteLine(item);
unsafe
{
fixed (char* ptr = item) { *ptr = 'X'; }
}
}
Console.WriteLine("");
strt = new string[] { "A", "B", "C"};
Console.WriteLine("{0} {1} {2}\n",strt[0], strt[1], strt[2]);
strt = Enum.GetNames(typeof(Szinek));
foreach (string item in strt)
{
Console.WriteLine(item);
}
Console.ReadKey(true);
enum Szinek { Piros = 1, Feher, Zold, Kek, Sarga = 6, Lila, Narancs, Fekete };A kimenet:
Piros
Feher
Zold
Kek
Sarga
Lila
Narancs
Fekete
A B C
Xiros
Xeher
Xold
Xek
Xarga
Xila
Xarancs
XeketeItt először kiíratom a Szinek neveit, majd unsafe kódban módosítom az első karaktert 'X'-re.
Utána strt string tömböt módosítom.
Végül ismét kiíratom a Szinek neveit. Mint látható, itt már a módosított értékeket írja ki.Az unsafe kóddal majdnem olyan hatékonysággal lehet dolgozni, mint a C-vel. Csak tudni kell, hogy az ember mit csinál benne.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Engem zavart, hogy a HashSet<T>-t nem lehet indexelni. Készítettem neki 1 indexelőt. A hatékonysága nem jó, de működik. MyHashSet-nek neveztem el:
MyHashSet<int> myHs = new MyHashSet<int>();
myHs.Add(101);
myHs.Add(102);
myHs.Add(103);
myHs.Add(104);
int i = myHs[3];
Console.WriteLine(i);
public class MyHashSet<T> : HashSet<T>
{
public T this[int index]
{
get
{
List<T> list = new List<T>(this);
return list.Count > index ? list[index] : throw new Exception();
}
}
}[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
Ha tudnád, akkor nem írtad volna meg ezt a kódot így.
Amikor a set-ből listát csinálsz abban a getterben, ott szintén nincs garantálva az elemek sorrendje.
Tehát nincs semmilyen garancia arra, hogy ez a kód jól fog működni. Az esetek többségében jó lesz, de ez csak a véletlen műve. -
pmonitor
aktív tag
Csináld meg pl. ezt foreach-el.
int i;
for (i = myHs.Count - 1; i >= 0; --i)
{
if (myHs[i] == 102) myHs.Remove(i);
}
i = myHs[myHs.Count - 1];
Console.WriteLine(i);Mondjuk ez nem olyan látványos. De amikor osztály példányokkal dolgozol(amelyiknek vmelyik. adattagját/mezőjét kell ellenőrizni, akkor már jobban előjön ennek az előnye. Persze a negatív indexeket is jó lenne ellenőrizni...
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
Egyébként ez a kód mit csinál?
Milyen osztály adattag ellenőrzés?
Milyen negatív indexek?Ne haragudj, de ezek a szavak külön-külön értelmesek, de nem formálódnak koherens gondolattá.
Csakúgy mint ez a pár soros kód. Értem, hogy mit csinál, csak azt nem, hogy miért. Mi értelme ennek, mit jelent az az i érték amit kiírsz a végén?
(Mert ugye a hashset-edben nincs sorrend definiálva. Tehát az i érték a végén az bármi lehet. Egy szám, jelentés nélkül.) -
cucka
addikt
Most jó hangulatban vagyok, szóval itt egy feladat, amiből tanulhatsz valamit.
Adott pár hsz előtt az indexelő megoldásod. És adott ez a for ciklus amit írtál.
Gondold végig, hogy vajon ez a for ciklus mindig garantáltan fel fogja-e dolgozni a hashSet-et összes elemét?
A választ erre már megírtam itt, csak össze kell raknod fejben.
[ Szerkesztve ]
-
pmonitor
aktív tag
Azt csinálja, hogy végig iterál a T típusok példányain a végétől az elejéig. Ha ez a T típus 1 osztály lenne, akkor megnézné, hogy pl. point.X értékei egyeznek-e egy bizonyos értékkel, akkor a feltételnek megfelelő point-okat törölné a myHashSet-ből.
#64.
mert a Set nem garantál semmilyen sorrendet.
.Ilyen alapon a foreach sem kellene, mert az sem garantál bizonyos sorrendet. Akkor az nem felesleges?
#69
Gondold végig, hogy vajon ez a for ciklus mindig garantáltan fel fogja-e dolgozni a hashSet-et összes elemét?
Igen.[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
A foreach-al végig tudsz iterálni egy collection-ön. Pontosabban bármin, ami implementálja az IEnumerable interfészt.
Az egyetlen dolog, amit egy IEnumerable garantál, hogy írhatsz rá egy foreach-et, ami a collection-öd mindegyik elemét fel fogja dolgozni.
Amivel az IEnumerable nem foglalkozik, és nem is szükséges tudni egy foreachhez, az hogy :
- melyik elem micsoda
- két elem közül melyik a nagyobb
- melyik elem hányadik a sorbanTe valamiért mindenképp Array-ként akarod használni. Az Array egy szűkebb értelmezése a collection-nek, mert mindenképp garantálja, hogy minden elemnek van egy nemnegatív indexe, és az indexekben nincsenek lyukak.
Nyilván az Array az egy Enumerable. De fordítva ez nem igaz.
-
pmonitor
aktív tag
Adott a következő kód:
MyHashSet<Point> myPt = new MyHashSet<Point>();
myPt.Add(new Point(10, 20));
myPt.Add(new Point(15, 20));
myPt.Add(new Point(20, 20));
myPt.Add(new Point(20, 20));
Console.WriteLine(myPt.Count);
int i;
for (i = myPt.Count - 1; i >= 0; --i)
{
if (myPt[i].X == 20) myPt.Remove(myPt[i]);
}
Console.WriteLine(myPt.Count);
i = myPt[myPt.Count - 1].X;
Console.WriteLine(i);
public class MyHashSet<T> : HashSet<T>
{
public T this[int index]
{
get
{
List<T> list = new List<T>(this);
return list.Count > index ? list[index] : throw new Exception();
}
}
}
public class Point
{
public int X; public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}A kimenet:
4
2
15Sztem tök jól működik. Az összes olyan myPt-t törölte, ahol X ==20. 2 darab ilyen volt. Látszik, hogy a hossz 4-ről 2-re változott.
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
Mondom jókedvemben vagyok, szóval vegyük végig.
Ott van a metódusod, amivel indexelni tudod a hashset-edet. Amikor azt mondom, hogy hashset[i], akkor
1. a hashset-ből csinálsz egy listát - ugye ez az aminek nem determinált a sorrendje
2. visszatérsz a lista[i]-velNamost legyen egy hashsetem, A, B, C értékekkel. Jön a for ciklus, ami végigmegy az elemein
i=0 eset
megcsinálod a listát, az lesz benne, hogy [A,B,C]. visszatérünk a lista[0]-val, ami az A érték.i=1 eset
megcsinálod a listát, az lesz benne, hogy [B,A,C], visszatérünk a lista[1]-el, ami az A értéki=2 eset
megcsinálod a lsitát, az lesz benne, hogy [C,B,A], visszatérünk a lista[2]-vel, ami ismét az A értékvégigértünk a for cikluson, az [A,B,C] hashset-ből feldolgoztuk az A értéket 3szor, és a többi értéket nem dolgoztuk fel.
Ezt jelenti az, hogy a egy Set elelein nincs sorrend meghatározva. Erre mondtad hogy érted, de láthatóan nem érted, remélhetőleg így már menni fog.
Szóval innen adódik a köv. feladat, hogy vajon hogy lehet mégis olyan indexelést csinálni egy hashset-re, ami garantáltan működik?
mod: a példa kódodra. Itt a fenti esetben is az lesz, hogy általában a listád az lesz, hogy [A,B,C] és általában működni fog.
Kivéve, amikor nem fog működni, mert jön a háttérben a gc és átrendezi a memóriádat. És akkor majd más lesz a sorrend.[ Szerkesztve ]
-
pmonitor
aktív tag
De a listát ugyanúgy készíti el minden esetben(ugyanúgy generálja). Ezért nem jó a gondolatmeneted. A törlés után is a sorrend megmarad. De akkor szted. ez a kód miért is működik? De írjál olyan esetet, amikor nem működik.
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
Leírtam az esetet, amikor nem működik.
Amikor te az [A,B,C] hashset-et listává alakítod, akkor az általában az [A,B,C] listát fogja eredményezni. Tehát az indexelésed általában működni fog.
Kivéve amikor nem. Mert jön a gc és átrendezi a memóriádat. Vagy valaki egy másik CLR-en futtatja a kódodat. Vagy beraksz egy D elemet a set-be, és az nem a lista végén fog megjelenni.
Ha az elemek sorrendje nincs garantálva, az azt jelenti, hogy nem írsz olyan logikát, ami azt feltételezi, hogy a sorrend garantálva van. Akkor se, ha általában a sorrend nem szokott változni.
Ez egy egzakt eldönthető kérdés. Vagy sorrendben vannak az elemek, vagy nincsenek sorrendben.
Ha többé-kevésbé az esetek nagy részében általában sorrendben vannak, és kipróbálod, és a sorrend nem változik, és a te gépeden jónak tűnik, na az nem jelent lófaszt se.[link] itt fel van sorolva az összes interfész, amit a HashSet implementál. Mindegyik garantál valamilyen viselkedést.
Amelyik viselkedést itt látod, azon dependálhatsz.
Amelyiket nem látod, azon nem dependálsz.
Nem olyan bonyolult.[ Szerkesztve ]
-
pmonitor
aktív tag
Az, hogy jön a GC, az csak a memóriát rendezi át(Átmásolja "A" memóriacímről "B"-be a megadott hosszt). Ez nem változtatja meg az elemek sorrendjét. Na látod ilyenért célszerű lemenni asm-be.
Vagy valaki egy másik CLR-en futtatja a kódodat.
for ciklus közben azt nehéz lenne...
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
De amit tényleg próbálj felfogni, az a következő:
Valami vagy garantálja az elemek sorrendjét, vagy nem garantálja.
És ha nem garantálja, akkor nem írsz olyan kódot, ami csak akkor működik jól, ha ez a garancia teljesül.
Szerintem nem túl bonyolult. Szóval mielőtt lemennél ASM-be, azért próbáld megérteni ezeket az egyszerű logikai összefüggéseket.
[ Szerkesztve ]
-
pmonitor
aktív tag
Értem, hogy mi a gondolatmeneted, csak nem értek vele egyet. Egyébként amikor a hashset-ből listát csinál, akkor az történik, hogy pár byte-ot a hashset ELÉ tesz. Az nem változtatja meg az elemek sorrendjét. A hashset teljes hosszában változatlan marad. Nem random módon működik a ToList() metódus. Annak a kódja(algoritmusa) nem változik.
[ Szerkesztve ]
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
cucka
addikt
Amit írtam, az nem egy megvitatandó gondolatmenet, hanem egy axioma.
Ha OOP nyelvben fejlesztesz, akkor amit írtam, az egy tény. Ez van.
Elfogadhatod és magadévá teheted ezt a gondolatmenetet, és akkor OOP-ben jobb fejlesztő leszel mint előtte. Már ha akarod, persze, senki se kényszerít.A másik topikban panaszkodtál, hogy itt senki se segít semmiben, hát tessék, az már rajtad áll, hogy mit kezdesz vele.
-
pmonitor
aktív tag
Ha írsz bármilyen algoritmust, akkor annak a kódja nem változik meg a program futása közben. A kód(algoritmus) ugyanaz marad. A ToString metódus kódja fix. Az nem változik meg attól, hogy 1 iterációban van.
De ha vki nem hisz nekem, akkor egyetlen megoldása marad:
foreach-el végig iterál az elemeken. Az iteráción belül kigyűjti a törlendő elemeket(pl. egy listába), és a foreach után még egyszer végigiterál a kigyűjtött elemeken. És így törli egyesével azokat.
Ha vki hisz nekem, akkor meg úgy csinálja, ahogy mutattam.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Egyébként meg pl. az 1D vágás(hátizsák probléma azonos hátizsákkal) esetében nem is készülne egyetlen program sem, mert az optimális megoldást úgy sem találja meg a legtöbb esetben. Ha az axioma alapján indulunk el. De a gyakorlat azt mutatja, hogy készülnek ilyen programok, és még némelyik nem kevés lóvét is kér érte. Tehát az ezt készítő programozók nem az axiomát követik. Pedig ott szinte zéró a valószínűsége, hogy az optimális esetet megtalálják...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
De ki lenne az az idióta programozó, aki nem úgy valósítaná meg a ToList metódust, hogy:
1: Vagy a hashset első elemétől az utolsó elemig egyesével növelve,
2: Vagy a hashset utolsó elemtől az első elemig egyesével csökkentve.
Ha az én feladatom lenne a ToList megvalósítása, akkor az 1. pontot választanám. És egyébként a foreach is ezt teszi. Biztosan.
Mert végig lehet iterálni ennek a rendező algoritmusnak az iterálási sorrendjében is. Csak kérdés, hogy ki lenne az a félnótás programozó, aki pl. ezt a sorrendet választaná.
Ezért biztos vagyok benne, hogy az én kódom is mindig végigiterál az összes elemen. Attól függetlenül írom ezt, hogy nem axioma.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Átírtam a kódot. Én nem találok olyan adatokat, amivel ne működne.
namespace TesztCsharp
{
class HashSets
{
static void Main(string[] args)
{
MyHashSet<Point> myPt = new MyHashSet<Point>();
myPt.Add(new Point(20, 20));
myPt.Add(new Point(15, 20));
myPt.Add(new Point(20, 20));
myPt.Add(new Point(21, 20));
Console.WriteLine("Count = {0}", myPt.Count);
foreach (Point pt in myPt)
{
Console.Write("{0} ", pt.X);
}
int i;
int torl = 20;
Console.WriteLine("\nTorlendo X érték: {0}", torl);
for (i = myPt.Count - 1; i >= 0; --i)
{
Point pt = myPt[i];
if (pt.X == torl) myPt.Remove(pt);
}
Console.WriteLine("\n\nCount = {0}", myPt.Count);
foreach (Point pt in myPt)
{
Console.Write("{0} ", pt.X);
}
if (myPt.Count > 0)
{
i = myPt[myPt.Count - 1].X;
Console.WriteLine("\nUtolso elem = {0}", i);
}
}
}
public class MyHashSet<T> : HashSet<T>
{
List<T> list = new List<T>();
public T this[int index]
{
get
{
if (list.Count != Count) list = new List<T>(this);
return ((list.Count > index) && (index >= 0)) ? list[index] : throw new IndexOutOfRangeException();
}
}
public bool Add(T item)
{
if (base.Add(item))
{
list = new List<T>(this);
return true;
}
else return false;
}
public bool Remove(T item)
{
if (base.Remove(item))
{
list = new List<T>(this);
return true;
}
else return false;
}
}
public class Point
{
public int X; public int Y;
public Point(int x, int y)
{
X = x;
Y = y;
}
}
}
A kimenet pedig ezekkel az adatokkal:Count = 4
20 15 20 21
Torlendo X érték: 20
Count = 2
15 21
Utolso elem = 21cucka: Azért köszi a kritikát. A véleményünk nem egyezik, de örülök, hogy leírtad az álláspontod...
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
Sőt! Ez nálam még úgyis működik minden esetben, ha az Add() és a Remove() metódusokban nem készítek új listát, csak 1szerűen ugyanazt a metódust meghívom a listára. Tehát:
public bool Add(T item)
{
if (base.Add(item))
{
list.Add(item);
return true;
}
else return false;
}
public bool Remove(T item)
{
if (base.Remove(item))
{
list.Remove(item);
return true;
}
else return false;
}Azért az indexelőben benne hagytam a feltételt, ha mégis valami gubanc lenne. De sztem még az sem kellene bele.
Az, hogy egyszer [A,B,C], majd [B,A,C], majd utána [C,B,A] legyen a kimenet, az halmazelméletben megállja a helyét. De állítom, hogy az a halmazelmélet tanár/prof/előadó még életében nem gondolta végig, hogy a gyakorlatban hogy is vannak/lehetnek az adattípusok a memóriában. Ilyent még szándékosan is nehezen lehet generálni.
A gyakorlatban még a List<T>, és a HashSet<T> Add() és Remove() metódusai is ugyanúgy működnek. Csak azt nem tudom, hogy egy programozó miért csinálna olyant, hogy szándkosan permutálja az elemeket random módon. Ez semmiképpen nem reális dolog a valóságban. És azért akik az MS VS C#-ot és a .NET-et implementálták, róluk sem hiszem el, hogy ilyent csinálnának. Ez a halmazelméleti axioma csak olyanok fejében létezik, akik túl komolyan veszik az absztrakciót. Azaz túl elvontak/elméletiek. Gyakorlat meg zéró.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
1: Ki, vagy mi generálna ilyen összevissza permutációkat?
2: Mennyi a valószínűsége, ha csak általában működne, hogy az pont az én vasam lenne? És ráadásul azon minden alkalommal? Minden példára?
3: Mennyi a valószínűsége annak, hogy más gépére az MS más algoritmusokat írna? És annak, hogy direkt az én gépemre írjon más algoritmusokat, mint más gépére? Nem hiszem, hogy velem kivételezne az MS.De bebizonyíthatjátok, hogy ti tudjátok jól. Írjatok olyan esetet, amikor nem működik az elvártnak megfelelően!
Közben egy véletlen elírást javítanék. Ezt írtam:
A gyakorlatban még a List<T>, és a HashSet<T> Add() és Remove() metódusai is ugyanúgy működnek.
Ezt én úgy értettem, hogy mindegyik Add() metódus a végére teszi az új elemet. De természetesen a HashSet Add() metódusa szigorúbb a List Add() metódusánál. De a kódon látszik, hogy így csináltam, csak a rizsa részében fogalmaztam pontatlanul.http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
pmonitor
aktív tag
A "Programozás topic"-ban elég vád ért engem. Ez sarkallt arra, hogy itt reagáljak rá(mivel ott nem tudok - a modi hatalmasabb nálam). Én továbbra is állítom, hogy az itt szereplő kódok jól működnek.
A moderátor ezt állította:kreal egy Point classt. szoval ez szep meg jo, csak koze nincs a Sethez.
Ezzel egy hibát követett el(de az fatális). Ugyanis van köze a Sethez. Nem is kevés. Csak annyi a lényeg, hogy mivel nem írtam át az
Equals()
metódust, ezért a referenciákat veszi halmaznak. És természetesen azok egyenlőségét vizsgálja. Tehát nagyon is van köze a Sethez. Ha a Main() metódus elejét a következőkre módosítjuk, akkor ez megvilágítja, amiről eddig írtam:MyHashSet<Point> myPt = new MyHashSet<Point>();
Point pnt = new Point(20, 20);
Point pnt2 = pnt;
Point pnt3 = new Point(19, 20);
Point pnt4 = new Point(21, 20);
myPt.Add(pnt);
myPt.Add(pnt2);
myPt.Add(pnt3);
myPt.Add(pnt4);
Ennek a kimenete:Count = 3
20 19 21
Torlendo X érték: 20
Count = 2
19 21
Utolso elem = 21
Itt tökéletesen látszik, hogy az elején 4 helyett 3 különböző érték van csak: 20 19 21
Ez aPoint pnt2 = pnt;
sor miatt van. Mivel ennek a kettőnek azonos a referenciája, ezért a kettőjük helyett csak az egyikük szerepel.De ha a Point osztálytba beletesszük az Equals() metódust, akkor így néz ki:
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (!(obj is Point))
{
return false;
}
return (this.X == ((Point)obj).X) && (this.Y == ((Point)obj).Y);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
és ha a pnt-ket így módosítjuk:Point pnt = new Point(20, 20);
Point pnt2 = new Point(15, 20);
Point pnt3 = new Point(20, 20);
Point pnt4 = new Point(21, 20);
akkor a kimenet:Count = 3
20 15 21
Torlendo X érték: 20
Count = 2
15 21
Utolso elem = 21
Az elején itt is csak 3 érték van. Mivel pnt és pnt3 egyenlő.
Tehát egyértelműen látszik, hogy a moderátor nem írt igazat azzal, hogy a Sethez köze sincs. De amiket itt írtam, azokra továbbra sincs válasz.
A mostani kód így néz ki:namespace TesztCsharp
{
class HashSets
{
public static void Main(string[] args)
{
MyHashSet<HsPoint> myHashSet = new MyHashSet<HsPoint>();
myHashSet.Add(new HsPoint(20, 20));
myHashSet.Add(new HsPoint(19, 20));
myHashSet.Add(new HsPoint(20, 20));
myHashSet.Add(new HsPoint(15, 20));
Console.WriteLine("Count = {0}", myHashSet.Count);
foreach (HsPoint pt in myHashSet)
{
Console.Write("{0} ", pt.X);
}
int i;
int torlendo = 20;
Console.WriteLine("\nTorlendo X érték: {0}", torlendo);
for (i = myHashSet.Count - 1; i >= 0; --i)
{
HsPoint pt = myHashSet[i];
if (pt.X == torlendo) myHashSet.Remove(pt);
}
Console.WriteLine("\n\nCount = {0}", myHashSet.Count);
foreach (HsPoint pt in myHashSet)
{
Console.Write("{0} ", pt.X);
}
if (myHashSet.Count > 0)
{
i = myHashSet[myHashSet.Count - 1].X;
Console.WriteLine("\nUtolso elem = {0}", i);
}
}
}
class MyHashSet<T> : HashSet<T>
{
List<T> myList = new List<T>();
public T this[int index]
{
get
{
return ((myList.Count > index) && (index >= 0)) ? myList[index] : throw new IndexOutOfRangeException();
}
}
public bool Add(T item)
{
if (base.Add(item))
{
myList.Add(item);
return true;
}
else return false;
}
public bool Remove(T item)
{
if (base.Remove(item))
{
myList.Remove(item);
return true;
}
else return false;
}
}
class HsPoint
{
public int X; public int Y;
public HsPoint(int x, int y)
{
X = x;
Y = y;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
if (!(obj is HsPoint))
{
return false;
}
return (this.X == ((HsPoint)obj).X) && (this.Y == ((HsPoint)obj).Y);
}
public override int GetHashCode()
{
return X.GetHashCode() ^ Y.GetHashCode();
}
}
}De ebben már csak finomítások vannak.
http://www.bferi.hu/download.php ; http://bferi.hu/egyeb.php
-
proci985
MODERÁTOR
Topikot zártam. Programozás topik itt.
A kezdő hozzászólás témafelvetése gyakorlatilag a computer science / software engineering (vagy általánosan, informatics mint gyűjtőterület) beemelése lett volna az aktív témák közé, olyan témákkal, mint optimizáció, elosztott programozás, jogi/etikai vonatkozások, illetve cybersecurity. Ezt kb egy szakirányú BSc lefedi.
Ehhez képest a topik május vége óta átment az említett Programozás topik párhuzamos topikjába, így zárom.
Don't dream it, be it. // Lagom amount.
Aktív témák
Állásajánlatok
Cég: Axon Labs Kft.
Város: Budapest
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest