Keresés

Új hozzászólás Aktív témák

  • pmonitor

    aktív tag

    válasz cigam #10145 üzenetére

    50 felett már többet felejtek mint amennyit tanulok

    Ez igaz. Én meg már 40 előtt is ezt tettem a betegségeim miatt. Azóta én már halott vagyok. Már csak vérkeringésem van. Azért arra büszke vagyok, hogy addig sztem. egész jól haladtam. Ráadásul azt figyelembe véve, hogy sehol nem tanultam programozást.

  • pmonitor

    aktív tag

    válasz Alexios #10133 üzenetére

    int x = 0x55;
    object obj = x;

    Itt "obj" szted. hány byte-os(bites)? Elmondom. x86-on 4 byte-os(32bites), x64-en 8 byte-os(64 bites). x64-en miért is foglal le 64 bitet a fordító? Azért, mert az "obj" referencia típus(gyakorlatilag egy mutató). A mutatók pedig 64 bites programban 64 bitesek.
    De ez azt is eredményezi, hogy amit "beletesznek", azt mind ebbe a 4 vagy 8 byte-ba kell beleerőszakolni. Akár érték, akár referencia típus. Referencia típusoknál ez nagyon 1szerű, mivel "obj" is referencia típus. Érték típusoknál már nem ilyen 1szerű a helyzet. Mert itt az érték típus teljesen más típus, mint a referencia típus. Erre találták ki azt, hogy ilyen esetben létrehoznak példányosítanak 1 referencia típust, amibe belecsomagolják az érték típust(jelenleg 1 int típust). Így oldják meg, hogy 4 vagy 8 byte-ba "beleférjen" akár egy 32 byte-os érték típus is(mert a bedobozolt típus teljesen más memóriaterületen helyezkedik el).
    Ennél a posztomnál itt is létrejön az object(ami ugyebár referencia típus), csak egy másik memória területen.
    public void TorlunkHaTudja()
    {
    if (adat is ITorol)
    (adat as ITorol).delete();
    }

    Tehát van egy érték típusunk("Valami"), és van egy C#-on keresztül nem megfogható(megcímezhető) referencia típus, ami a "Valami"-nek a másolatát tartalmazza. A Main()-ben lévő genTip.TorlunkHaTudja(); a "Valami" másolatán(bedobozolt példányán) hajtódik végre. Igen ám!! Csak mivel ezt a bedobozolt "Valami"-t nem tudjuk elérni C# kódból, így nem tudjuk az érték típusú "Valami" mezőit megváltoztatni(így az "ertek"-et sem. Gyakorlatilag azt lehet mondani, hogy a nem működő, vmint. az én módosításommal kiegészített kód is majdnem karakter szerint ugyanarra az asm-ra fordul(tehát ugyanazt csinálja). Csak az általam módosított változatban "o"-n keresztül C# kódból is el tudjuk érni a bedobozolt változatot, amit a nem működő változatban nem tudunk megtenni.
    Boxing után x86 esetén az int 8 byte-ot foglal le a rendszer az 4 byte-os "int"-nek, míg x64 esetén 12 byte-ot foglal le egy 1-szerű, 4byte-os int típusnak!!
    A boxing által létrejött referencia típusokat a GC takarítja el, miután már 1 referencia sem mutat rájuk.
    Sajnos az alap könyvek is csak az érték és referencia szerinti paraméter átadást tárgyalja. Ami másik témakör. De ezt a másik témakört is 1szerűbb megérteni az általam vázolt programozási szemlélettel. Ezt egész röviden össze lehet foglalni:
    1: Az érték típusok, és a referenciák(mutatók) alapesetben érték szerint adódnak át. Tehát érték típusú paraméter esetén az egész típus másolódik át.
    2: A referencia típus esetén csak a referencia(mutató) másolódik át. Az itt levő kód esetén ezért lehet az elvileg "konstans" memóriát átírni. Ha a string érték típus lenne, akkor a "konstans" memóriát nem lehetne átírni, mert az eredeti stringnek csak egy másolatával dolgozna ez az algo.
    3: Referencia szerinti paraméter átadásnál(ref vagy out) érték típus esetén az érték típusra, referencia típus esetén a referenciára mutató "pointer" adódik át.
    Sztem ezek magától értetődő dolgok. Ezeket(mint látható) asm-ben be lehet bizonyítani. Magas szinten(C#), csak az ellentmondásokból(sok ellentmondásból) lehet következtetni, hogy ez így van, ahogy leírtam.
    Sztem. nem nehéz megérteni.

  • pmonitor

    aktív tag

    válasz martonx #10131 üzenetére

    1 troll ilyeneket ír??? Azóta sem kaptam rá választ. Sztem. pedig ennek a nézetnek alapnak kellett volna lennie a C#-ban. Csak hát ehhez programozni kellene... Sokat...
    A többire meg: No komment..

  • pmonitor

    aktív tag

    válasz joysefke #10129 üzenetére

    Nem trollkodni akartam. Az idézet előtt ezt írta:
    Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.

    Azért Asp.Net-ben nem nagyon van byte array. C#-ban pl. annál inkább. Meg egyébként nem olyan elhanyagolható az, hogy a byte array hány byte-on tárolódik(persze nem Asp.Netben, hanem C#-ban). Ugyanis, ha biztosan belefér vminek az értéke 1 byte-ba, akkor sokkal jobban megéri a byte array, mint az int array. Mert ugyebár nem mindegy, hogy egy tömb 400 megát foglal le, vagy pedig 1600 megát!!! Ez azért elég jó optimalizáló tényező(mármint annak, aki ismeri, hogy mi hány byte-on tárolódik). Ha nem tudja, akkor hogy optimalizál??
    Ezért bátorkodtam megjegyezni.

  • pmonitor

    aktív tag

    válasz martonx #10097 üzenetére

    Amire még én, mint Asp.Net fejlesztő...

    Egyébként az Asp.Net mióta lett programnyelv?

  • pmonitor

    aktív tag

    válasz sztanozs #10107 üzenetére

    Azért nem jó, mert onnan hiányzik az RPN- képzése. A CodeProject tudja a függvényeket, de az RPN képzése hibás. Az andreinc.net-es példánál jó az RPN képzés, de a függvényeket nem tudja. Jelenleg egy kevert verzión dolgozom. Ahol az Az andreinc.net-es rész képzi az RPN-stringet, majd azt a Rosettához hasonlóan dolgozom fel az RPN-t. Mindezt körbekerítem a codeproject-es példával.
    Hosszú menet lesz ez...

  • pmonitor

    aktív tag

    válasz martonx #10097 üzenetére

    Ez éppen egy nagyon jó példa arra, hogy még Asp.Net-en belül is annyiféle megoldás van, annyira szerteágazó, hogy rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik, hanem lásd a fenti kérdést.
    Amire még én, mint Asp.Net fejlesztő se tudok csukott szemmel válaszolni,

    Sztem. egyébként inkább olyanok végeznek programozási munkát, akik megírták az a programot, amit még te sem tudsz megválaszolni.

    ----------------------------------------------------------------------------------------------------------------------

    Egyébként most pont 1 RPN-t próbálok készíteni/találni. Igazából ezeket az oldalakat találtam hozzá:
    [link]
    [link]
    [link]

    Ezek egyike sem hibátlan, vagy csak az egyik rész van implementálva. Ráadásul az egyik Java-ban is van, amihez a tudásom gyakorlatilag nulla. Sztem azért ez is programozás. De láthatod, hogy mintakód legalább mindegyikben van. :)) Na meg a szakkönyveket is ha nézed, azokban is vannak példa/minta kódok.
    Csak az a probléma, hogy a nagyon erős fáradékonyságom miatt értelmes munkát(akár fizikai, akár szellemi) csak igen keveset tudok időt szakítani. De mondjuk én nem igazán sietek sehová...

  • pmonitor

    aktív tag

    válasz martonx #10097 üzenetére

    Nyilván fingom sincs fejből, hogy mi lehet az OnGetAccount-ban, mire lát rá, mit kellene pluszban behúzni ahhoz, hogy megjelenjen a User.

    Akkor csak kényszerből válaszoltál? (bár lehet, hogy téged fizetnek, ezért válaszkényszerben vagy...) Mert csak úgy ex-has válaszolni..??

    rohadtul nem az a kérdés, hogy a byte array hány byte-on tárolódik,

    Hát hálózati/web programozásnál meg adatbázisok esetén tényleg nem. De desktopon annál inkább.

    Ha annyira összetett a kérdés, akkor meg egyébként tényleg semmi értelme rizsázni róla írogatni(akár kérdezni, akár válaszolni). Sztem. Bár ahogy látom, itt inkább a "régi motorosok" írogatnak egymás között. Itt is a kérdező is, meg ti is régi motorosok vagytok. De látszik nagyon sok területre igaz az, hogy nincs rá régi motoros szaki.

    Véleményem szerint az én példámból kiindulva. Mert ugye az adatbiztonság a béka hátsója alatt van. Engem pl. a fél ország lát, hogy mit csinálok. És akkor is meg tudták volna az adataim, ha nem adom meg. És a dolog érdekessége, hogy olyanok élhetnek vissza az adatokkal, ahová regisztrál az ember. Na de hát a velem történteket is látják az esetleges kezdők. Úgyhogy én ezért nem csodálkozom, hogy gyakorlatilag nincse friss újonc, meg ilyesmi. Nekem legalábbis ez a véleményem. De mondjuk ez nem az én bajom. Bocs az off-ért, de én így látom. Meg azt, hogy Magyar fórumokon legfeljebb recepteket érdemes keresgélni. Programozás témakörben nem

  • pmonitor

    aktív tag

    válasz joysefke #10092 üzenetére

    Azért ezzel vigyázni kell, mert igaz, hogy 1 byte-ak 1 int-et foglal le, viszont több byte-nak(pl. tömbnél 16 byte-nak nem 16 int-et foglal le, hanem csak 4-int-et). Persze azt azért hozzá kell tennem, hogy az én kijelentéseim MS VS C#-ra vonatkozik(általában x86-os platformon). Ez a C# kód:
    byte[] bytes = new byte[] { 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10 };
    Erre fordul:
    64 19 df 08 10 00 00 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
    Itt az első 4 byte az object(mivel referencia típus), a következő 4 byte az int tömb hossza. Utána következnek az értékek(16 darab byte 4 intet foglal le.

  • pmonitor

    aktív tag

    válasz Alexios #10081 üzenetére

    futtasd le ezt a kódot is és nézd meg az outputot, gondolom a nyelv maga se tudja miről beszél:
    int x = 1;
    Console.WriteLine(x is object);

    Ez valami vicc? Megnézted, hogy mire fordul? Megmutatom:
    bool b;
    int x = 0x11;
    b = x is int;

    ugyanez ASM-ben: 05465EF5 mov dword ptr [ebp-3Ch],1
    ezt mégegyszer kiemelem:mov dword ptr [ebp-3Ch],1
    Ezzel fordítási időben(ha létezik a változó), akkor azt mondja:
    Ha valaki megkérdezi, hogy 1 változó Object-e, akkor 1szerűen mond azt, hogy igen. Tehát már fordítási időben "beleégeti a kódba", hogy true-t adjon vissza. Ez ugyanaz, mintha ezt írnád:
    bool b = true;
    object obj = b;
    Console.WriteLine("{0}", obj);

    De ez is ugyanarra fordul:
    bool b = true;
    08455EEE mov dword ptr [ebp-3Ch],1
    int x = 1;

    Ezek az MS-es fiúk nagyon rafkósak ám!! :DD Bármiféle ellenőrzés nélkül kiíratják, hogy true!! ;] Ilyen "csalással" könnyű azt mondani, hogy minden object...
    Na de nézzük meg, hogy mi is történik akkor, amikor 1 érték típust beleteszünk egy objectbe:
    bool b = true;
    int x = 0x55;
    object obj = x;
    object obj2 = x as object;
    Console.WriteLine("{0} {1}", obj, obj2);

    Ez a következőre fodul:
    int x = 0x55;
    05175F21 mov dword ptr [ebp-3Ch],55h
    object obj = x;
    05175F28 mov ecx,4E0C8D0h
    05175F2D call CORINFO_HELP_NEWSFAST (0300300Ch)
    05175F32 mov dword ptr [ebp-48h],eax
    05175F35 mov ecx,dword ptr [ebp-48h]
    05175F38 mov eax,dword ptr [ebp-3Ch]
    05175F3B mov dword ptr [ecx+4],eax
    05175F3E mov ecx,dword ptr [ebp-48h]
    05175F41 mov dword ptr [ebp-40h],ecx
    object obj2 = x as object;
    05175F44 mov ecx,4E0C8D0h
    05175F49 call CORINFO_HELP_NEWSFAST (0300300Ch)
    05175F4E mov dword ptr [ebp-4Ch],eax
    05175F51 mov edx,dword ptr [ebp-4Ch]
    05175F54 mov ecx,dword ptr [ebp-3Ch]
    05175F57 mov dword ptr [edx+4],ecx
    05175F5A mov edx,dword ptr [ebp-4Ch]
    05175F5D mov dword ptr [ebp-44h],edx
    Console.WriteLine("{0} {1}", obj, obj2);

    Ebből ezeket a sorokat emelném ki:
    05175F2D call CORINFO_HELP_NEWSFAST (0300300Ch)
    05175F49 call CORINFO_HELP_NEWSFAST (0300300Ch)

    Ezekben a sorokban látszik, hogy 1 új object jön létre. Boxing történt. De ezek már nem érték típusok, hanem obj-ba és obj2-be bedobozolt int-ek. Ezek már referencia típusok, amiknek a mezőjében int van. És természetes, hogy vmi érték típust dobozolnak be 1 referencia típusba(obj, obj2), akkor az már referencia típus. Ha ellenőrizné is a program, hogy tényleg object-e az ősük, akkor is nyilván true-t adna vissza, hiszen ezek object-ek. Az más kérdés, hogy azért object-ek, mert bedobozolták őket. Ezt bizonyítja a következő kód is: 05175F3B mov dword ptr [ecx+4],eax
    Itt az ecx regiszterben van a típus azonosító(nevezhetjük object-nek), de az értéket [ecx+4]-be teszi bele(itt is látszik, hogy ez már referencia típus, mert eax értékét nem az dword ptr [ecx]-be teszi, hanem az object címét kihagyva az [ecx+4]-be. Ez is azt igazolja, hogy ez már referencia típus.

  • pmonitor

    aktív tag

    válasz pmonitor #10083 üzenetére

    Ha jól emléxem, akkor már többször linkeltem be ezt a linket. Ez a másik fórumról való. Ott oldottam meg. Maga a kód(ami nem működik:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace GenericTest
    {
    interface ITorol
    {
    void delete();
    }

    class GenerikusTipus<T>
    {
    T adat;

    public GenerikusTipus(T adat)
    {
    this.adat = adat;
    }

    public T GetErtek()
    {
    return adat;
    }

    public void TorlunkHaTudja()
    {
    if (adat is ITorol)
    (adat as ITorol).delete();
    }
    }

    struct Valami : ITorol
    {
    public int ertek;

    public Valami(int ertek)
    {
    this.ertek = ertek;
    }

    public void delete()
    {
    ertek = 0;
    }

    new public string ToString()
    {
    return ertek.ToString();
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Valami v = new Valami(5);
    GenerikusTipus<Valami> genTip = new GenerikusTipus<Valami>(v);
    Console.WriteLine(genTip.GetErtek().ToString());
    genTip.TorlunkHaTudja();
    Console.WriteLine(genTip.GetErtek().ToString());
    Console.ReadKey();
    }
    }
    }

    A "megoldásom":
    Az as operátor ugye csak referencia, ill. nullabe típusok esetén működik. Tehát akkor az adott típust ki kell tenni object-be(ami ugyebár referencia típus), ez már magában hordozza a "metaadatokat" is. Na most így már alkalmazhatónak kell lennie az object példányra az as operátornak. Viszont a végén az adat-ba be kell tenni a kapott értéket.

    if (adat is ITorol)
    {
    object o = adat;
    (o as ITorol).delete();
    adat = (T)o;
    }

    Ez érdekességnek jó, de "élesben" nem igazán használnám...

    Ha ezt a kódot(és a megoldást) valaki becsülettel megnézi, akkor egyértelműen látszik, hogy a metódusok 1 boxingolt típussal(másolattal) dolgoznak. Ezért van az, hogy az o objectet a törlés után vissza kell tenni az aktuális mezőbe. Az érték típusok csak az alapműveletek esetén(*/+-) nagyon gyorsak. metódushívás esetén nagyon lassú.

  • pmonitor

    aktív tag

    válasz fatal` #10082 üzenetére

    Ha az object az őse(rá gondolni is rossz tegyük fel), akkor miért van szükség boxing-ra???
    Object -> Objet relációban mi értelme van a boxingnak?
    Sztem a válasz nagy egyszerű: azért szükséges a boxing, mert az érték típusok különböznek az object től. Csak valahogyan "szinkronba" kellett hozni az érték típusokat az Object-el. Erre találták ki lényegében a boxing-ot. Ami azt hivatott szolgálni, hogy létrehoznak 1 vadi új Object-et a hap-ben, és annak a mezője az érték típus. Gyakorlatilag az érték típusokon a műveletek(metódusok) nem is érték típusokkal dolgoznak, hanem a boxingolt típussal. Pl. a Console.WriteLine() is ígys csinálja, Az is is ezt használja stb...

  • pmonitor

    aktív tag

    válasz joysefke #10079 üzenetére

    a var kulcsszóval deklarált változód a stacken van (a futó metódus scopeján belül) ez a változó egy referencia ami a heapen lévő objektumra mutat.

    Kösz, hogy leírtad azt, amit már ~12 éve írogatok: hogy az int-nek nem őse az object. Object NEM lehet a veremben(ott csak a referenciája lehet(a stack meg csak az érték típusok memóriája.

    Legalább van 1 valaki, aki ezt írja. Jól esik!
    Egyébként tudod, hogy melyik alapozó könyvben vannak leírva így részletezve ezek a dolgok? Mert én ilyent sajnos nem tudok. Mert én a legjobb ms vs c# könyvnek ezt tartom.. De még abban sincsenek ezek ilyen részletességgel leírva. Ezért is zártak ki 3 topikból is, mert én le mertem írni az igazat... Ők meg könyvben nem olvasták.

  • pmonitor

    aktív tag

    válasz Tomi_78 #10073 üzenetére

    Csak azért írtam, hogy addig olvasgasd dqdb posztját, mert a posztodból egyértelműen látszik, hogy nem értetted meg.
    ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is,

    Ez rossz konzekvencia. Ugyanis abban az esetben, ha minden kódúton inicializálod a változót, akkor nem kell még null-t sem adni a deklarálás helyén. Tehát ez is jó:
    int[,] palya;

    switch (mostpalya)
    {
    case 1:
    palya = new int[,] {{0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {2,0,0,0,1,0,0,0,0,2},
    };
    break;
    default:
    palya = new int[,] {{0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,0,0},
    {2,0,0,0,1,0,0,0,0,2},
    };
    break;
    }

    Itt a default ág miatt mindenképpen inicializálva van annak ellenére, hogy deklaráláskor nem adtam neki null-t.

  • pmonitor

    aktív tag

    válasz Tomi_78 #10073 üzenetére

    Amit dqdb írt, azt olvasd el és értelmezd, amíg meg nem érted...

  • pmonitor

    aktív tag

    válasz Alexios #10050 üzenetére

    a hivatalos msdn c# language spec doksi, ez egyértelműen írja hogy All struct types implicitly inherit from the class System.ValueType

    1: És ha a hivatalos msdn doksi azt írja, hogy ugorj a kútba, akkor beleugrasz?
    2: Szted. az érték típusoknak van referenciájuk?

  • pmonitor

    aktív tag

    válasz Alexios #10050 üzenetére

    Akkor már csak 1 kérdésem van: mi a bánatnak ennyiféle ciklus, ha tökmind1, hogy melyiket használjuk? Elég lenne a while(), 'oszt jó napot! Ennek ellenére van a while(), van a do..while, van a for(), és még ráadásul ott van ez a foreach() is. Minek?

  • pmonitor

    aktív tag

    válasz fatal` #10046 üzenetére

    Itt részletezem. De nem értem, hogy kinek jutna eszébe végfelhasználóként while() ciklussal megvalósítani a foreach()-t? De a lényeg az, hogy nagyon nem mind1, hogy foreach, for, vagy while. A while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték. A foreach() minden enumeratoron működik, de iteráció közben nem módosítható. Erre azt mondani, hogy tökmind1, az barokkos túlzás!

  • pmonitor

    aktív tag

    válasz Alexios #10044 üzenetére

    Sok mindent meg lehet csinálni.
    HashSet<TesztOsztaly> htesztosztalyok = new HashSet<TesztOsztaly>();
    .......
    HashSet<TesztOsztaly>.Enumerator enumerator = htesztosztalyok.GetEnumerator();

    Aztán használható úgy, ahogy írod. Csak kérdés, hogy a gyakorlatban mennyire gyakran alkalmazzák így. Sztem. kb. zéró. Meg ettől még nem lesz módosítható...

  • pmonitor

    aktív tag

    válasz pmonitor #10041 üzenetére

    Arról nem is beszélve, hogy a for és a while nem is mindenre használható. Pl. HashSet<TesztOsztaly> - on nem.

    Semmiképp nem összehasonlítható!

  • pmonitor

    aktív tag

    válasz Alexios #10040 üzenetére

    De a for és a while indexekkel operál, amíg a foreach gyűjtemény elemein. Nagyon nem mind1!

  • pmonitor

    aktív tag

    válasz Alexios #10038 üzenetére

    Ha már ennyire magyarázod, hogy mind1, akkor azt sem kell elfelejteni, hogy for-ról és while-ról szó sem volt a kérdésben. Azt csak te képzelted bele. De ha már beleképzeled, akkor nézzük:
    A kérdés nem úgy merülne fel, hogy for(típus), hanem úgy, hogy for(int i; i<típusok.Count;......
    Na meg nem úgy, hogy while(típus), hanem hogy while(i<típusok.Count)....

  • pmonitor

    aktív tag

    válasz Alexios #10036 üzenetére

    Az egész mondat így hangzik:
    Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.

    Erre írtam, hogy nem tökmind1.

  • pmonitor

    aktív tag

    válasz Alexios #10033 üzenetére

    Így talán érthetőbb:
    foreach (var item in tesztosztalyok)
    {
    if (item.X == 2) item = new TesztOsztaly(6); //Invalid!!!
    }

    Ezt sem engedi. De ezért nem tökmind1, hogy foreach-t, for-t, vagy while-t használsz. Mert for és while esetén mindkét művelet valid. Vagy szted. mind1?

  • pmonitor

    aktív tag

    válasz Alexios #10031 üzenetére

    Ezt pláne nem értem,

    using System.Collections.Generic;

    namespace Teszt
    {

    class TesztOsztaly
    {
    public int X { get; set; }
    public TesztOsztaly(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 (var item in tesztosztalyok)
    {
    if (item.X == 2) tesztosztalyok.Remove(item); //Invalid!!!
    }
    }
    }
    }

    Így már érted?

  • pmonitor

    aktív tag

    válasz Alexios #10029 üzenetére

    c#-ban mindennek van egy közös szülőtípusa, úgy hívják object

    Kivéve, aminek nem az. :)

    Foreachel, de igazából, while, for, tökmindegy

    Nem tök mind1. Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.

    quailstorm:
    Az osztály egy absztrakt fogalom, egy memóriaértelmezési térkép.

    Innentől kezd érdekessé válni a történet. Lásd pl. itt.

  • pmonitor

    aktív tag

    válasz PuMbA #9649 üzenetére

    >hiszen magyar cégeknél se programoznak magyarul

    Talán mert angolul található a legtöbb copy-paste kód?

    Nem is értem, hogy miért tanítanak magyarul programozást magyar oktatási intézményekben... :F

  • pmonitor

    aktív tag

    válasz coco2 #9594 üzenetére

    Az amúgy publikus kódjaimat pontosan ilyen okok miatt nem projektben adom közre, hanem a forrás file--(oka)t, és leírom, hogy hogyan ajánlom kipróbálni. A codeproject.com-os projekteknél járok sokszor úgy, hogy nem működnek.

  • pmonitor

    aktív tag

    válasz pmonitor #9542 üzenetére

    A következő módosítással sikerült megoldanom. Ezt:
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct PARTITION_INFORMATION_GPT
    {
    public Guid PartitionType;
    public Guid PartitionId;
    [MarshalAs(UnmanagedType.U8)]
    public EFIPartitionAttributes Attributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
    public string Name;
    }

    Így módosítottam:
    [StructLayout(LayoutKind.Sequential)]
    public unsafe struct PARTITION_INFORMATION_GPT
    {
    public Guid PartitionType;
    public Guid PartitionId;
    public EFIPartitionAttributes Attributes;
    public fixed byte Data[72];
    }

    Így kell az unsafe kód engedélyezése, de a probléma megoldódott.

  • pmonitor

    aktív tag

    A következő kód:
    using System;
    using System.IO;
    using System.Runtime.InteropServices;

    namespace DiskProp
    {
    class Program
    {
    const uint IOCTL_DISK_GET_DRIVE_LAYOUT_EX = 0x70050;

    public enum PARTITION_STYLE : int
    {
    MasterBootRecord = 0,
    GuidPartitionTable = 1,
    Raw = 2
    }

    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct DRIVE_LAYOUT_INFORMATION_MBR
    {
    public long Signature;
    }

    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct DRIVE_LAYOUT_INFORMATION_GPT
    {
    public Guid DiskId;
    public long StartingUsableOffset;
    public long UsableLength;
    public long MaxPartitionCount;
    }

    [Serializable]
    [StructLayout(LayoutKind.Explicit)]
    public struct DRIVE_LAYOUT_INFORMATION_UNION
    {
    [FieldOffset(0)]
    public DRIVE_LAYOUT_INFORMATION_MBR Mbr;

    [FieldOffset(0)]
    public DRIVE_LAYOUT_INFORMATION_GPT Gpt;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct PARTITION_INFORMATION_MBR
    {
    public byte PartitionType;
    public bool BootIndicator;
    public bool RecognizedPartition;
    public Int32 HiddenSectors;
    }

    [Flags]
    public enum EFIPartitionAttributes : ulong
    {
    GPT_ATTRIBUTE_PLATFORM_REQUIRED = 0x0000000000000001,
    LegacyBIOSBootable = 0x0000000000000004,
    GPT_BASIC_DATA_ATTRIBUTE_NO_DRIVE_LETTER = 0x8000000000000000,
    GPT_BASIC_DATA_ATTRIBUTE_HIDDEN = 0x4000000000000000,
    GPT_BASIC_DATA_ATTRIBUTE_SHADOW_COPY = 0x2000000000000000,
    GPT_BASIC_DATA_ATTRIBUTE_READ_ONLY = 0x1000000000000000
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct PARTITION_INFORMATION_GPT
    {
    public Guid PartitionType;
    public Guid PartitionId;
    [MarshalAs(UnmanagedType.U8)]
    public EFIPartitionAttributes Attributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 36)]
    public string Name;
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct PARTITION_INFORMATION_UNION
    {
    [FieldOffset(0)]
    public PARTITION_INFORMATION_MBR Mbr;
    [FieldOffset(0)]
    public PARTITION_INFORMATION_GPT Gpt;
    }

    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct PARTITION_INFORMATION_EX
    {
    [MarshalAs(UnmanagedType.U4)]
    public PARTITION_STYLE PartitionStyle;
    public long StartingOffset;
    public long PartitionLength;
    public int PartitionNumber;
    public bool RewritePartition;
    public PARTITION_INFORMATION_UNION DriveLayoutInformaiton;
    }

    [Serializable]
    [StructLayout(LayoutKind.Sequential)]
    public struct DRIVE_LAYOUT_INFORMATION_EX
    {
    public PARTITION_STYLE PartitionStyle;
    public int PartitionCount;
    public DRIVE_LAYOUT_INFORMATION_UNION DriveLayoutInformaiton;
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.Struct, SizeConst = 128)]
    public PARTITION_INFORMATION_EX[] PartitionEntry;
    }

    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr CreateFile(
    [MarshalAs(UnmanagedType.LPTStr)] string filename,
    [MarshalAs(UnmanagedType.U4)] FileAccess access,
    [MarshalAs(UnmanagedType.U4)] FileShare share,
    IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero
    [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
    [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes,
    IntPtr templateFile
    );

    [DllImport("kernel32.dll", ExactSpelling = true, SetLastError = true, CharSet = CharSet.Auto)]
    public static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode,
    IntPtr lpInBuffer, uint nInBufferSize,
    IntPtr lpOutBuffer, uint nOutBufferSize,
    out uint lpBytesReturned, IntPtr lpOverlapped
    );

    static void Main(string[] args)
    {
    Type ts = typeof(DRIVE_LAYOUT_INFORMATION_EX);
    int ss = Marshal.SizeOf(ts);
    }
    }
    }

    Ezt a kivételt dobja:Nem kezelt kivétel: System.ArgumentException: A típus („DiskProp.Program+DRIVE_LAYOUT_INFORMATION_EX”) nem adható át végrehajtásra nem felügyelt struktúraként; nem számítható ki értelmezhető méret vagy eltolás.
    a következő helyen: System.Runtime.InteropServices.Marshal.SizeOf(Type t)

    A DRIVE_LAYOUT_INFORMATION_EX elég összetett struktúra. Nem tudom, hogy hol lehet a hiba. Van valami 5letetek?

  • pmonitor

    aktív tag

    válasz leslie23 #9525 üzenetére

    Ha fizikailag egy csoportba tudod tenni azokat a control-okat, amelyeket nem szeretnél használni a művelet alatt, akkor használhatsz groupbox vagy panel controlt, és akkorpanel1.Enabled=false; vagy groupBox1.Enabled=false;,
    majd ha végeztél, akkor true.

    Ha nincsenek 1 csoportban, akkor még mindig van olyan lehetőség, hogy 1 listába beleteszed azokat a control-okat, amiket le szeretnél tiltani. Ebben az esetben 1 ciklussal kell végigmenni a lista elemein, és így tiltani/engedélyezni.

  • pmonitor

    aktív tag

    válasz fatal` #9505 üzenetére

    #9482 martonx: *.designer.cs fileokat nem szabadna módosítani.
    vs.
    #9505 fatal`: alapvetően nem abban turkálunk.

    Azért ez a 2 kijelentés között elég nagy különbség van. Pl. ha azt írta volna, amit te, akkor történetesen egy szavam sem lett volna.

    Szerintem meg egy kezdő winforms-osnak kötelező megismerni azt, hogy a design nézet mögött mi zajlik a háttérben. Módosítani valamit design nézetben, megnézni, hogy ez mit változtatott a .design file-ban, használni a szürkeállományát, hogy ez miért is történik stb.. stb.. A kezdőn nem a friss kezdőt értem azért, hanem aki már tisztában van az event-ekkel. Sőt, az sem árt, ha esetleg néha ránéz az IL kódra is, hogy egy kicsit ahhoz is konyítson. Mint ahogy az sem baj, ha egy C-s kezdő nézegeti a generált ASM kódot is.

    Martonx szerint meg semmi köze a .designer.cs file-okhoz.

    Ez merőben eltérő filozófia a kettőnk között. Én azért alakítottam ki ezt az álláspontom, mert ha 1 kezdő elszúr valami olyan dolgot, amit nem tud helyreállítani(bár igazából nem kellene feladnia), akkor sem történik semmi. Egy példaprojekt tönkrement. És? Viszont sokkal magabiztosabb lesz később, mikor esetleg hozzá kell nyúlni egy éles projektben(ami nem mehet a kukába).

  • pmonitor

    aktív tag

    válasz Alexios #9503 üzenetére

    Ezért írom le már harmadszor, hogy tudni kell, hogy mit csinál az ember fia/lánya.
    Az mindenképpen csak jó, ha ÉRTI valaki a működést, mert adott esetben helyre tud hozni dolgokat.
    Én pl. jártam úgy, hogy 1 codeproject.com-os példában eleve elszállt a designer nézet. Hasznos volt, hogy tudtam, hogy mit kell csinálni.

    szerk.: mondjuk nekem aztán mind1, hogy valaki érti-e, vagy nem.

  • pmonitor

    aktív tag

    válasz fatal` #9501 üzenetére

    De beleírhatunk. Képzeld el a következő esetet:
    1.: Designer nézetből létrehozol egy eseményt.
    2.: Valamilyen megfontolásból törlöd az esemény Designer nézetben(de az eseménykezelő metódust nem, mert ugyebár azt nem törli a designer nézetből)
    3.: Mégis szükséged lenne az eseménykezelőre.

    Ebben az esetben létrehozol designer nézetben egy eseménykezelőt dupla kattal. Igen ám, de ez az eseménykezelő metódus üres, az eredeti metódust akarod vissza csinálni. A létrehozott eseménykezelő metódust törlöd. Ekkor elszáll a designer nézeted. Innen már nincs más választásod, mint a designer file-ban turkálni.

    Lehet, hogy a példám nem mindennapos, de előfordulhat, hogy MUSZÁJ a designer file-ban turkálni, hogy helyrehozd a designer nézetet.

  • pmonitor

    aktív tag

    válasz fatal` #9499 üzenetére

    Te nem érted. Designer file-ra nincs is szükség. Ha akarod, akkor van, ha nem, akkor nincs.
    Ezért írtam, hogy tudni kell, hogy mit csinál az ember fia/lánya.

    amikor legközelebb megnyitod a formot felül fogja írni.

    Csak a megnyitásnál nem írja felül, csak ha módosítod is Designer nézetben. De akkor ugyebár direkt csináltad..

  • pmonitor

    aktív tag

    válasz pmonitor #9497 üzenetére

    Talán 4 perc is volt... Ezért írtam, hogy tudni kell, hogy mit csinál az ember fia/lánya. :)
    using System;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Security.Permissions;

    [PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
    public class Form1 : Form
    {
    private IContainer components;
    private WebBrowser webBrowser1;

    private MenuStrip menuStrip1;
    private ToolStripMenuItem fileToolStripMenuItem,
    saveAsToolStripMenuItem, printToolStripMenuItem,
    printPreviewToolStripMenuItem, exitToolStripMenuItem,
    pageSetupToolStripMenuItem, propertiesToolStripMenuItem;
    private ToolStripSeparator toolStripSeparator1, toolStripSeparator2;

    private ToolStrip toolStrip1, toolStrip2;
    private ToolStripTextBox toolStripTextBox1;
    private ToolStripButton goButton, backButton,
    forwardButton, stopButton, refreshButton,
    homeButton, searchButton, printButton;

    private StatusStrip statusStrip1;
    private ToolStripStatusLabel toolStripStatusLabel1;

    public Form1()
    {
    // Create the form layout. If you are using Visual Studio,
    // you can replace this code with code generated by the designer.
    InitializeComponent();

    // The following events are not visible in the designer, so
    // you must associate them with their event-handlers in code.
    webBrowser1.CanGoBackChanged +=
    new EventHandler(webBrowser1_CanGoBackChanged);
    webBrowser1.CanGoForwardChanged +=
    new EventHandler(webBrowser1_CanGoForwardChanged);
    webBrowser1.DocumentTitleChanged +=
    new EventHandler(webBrowser1_DocumentTitleChanged);
    webBrowser1.StatusTextChanged +=
    new EventHandler(webBrowser1_StatusTextChanged);

    // Load the user's home page.
    webBrowser1.GoHome();
    }

    // Displays the Save dialog box.
    private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
    {
    webBrowser1.ShowSaveAsDialog();
    }

    // Displays the Page Setup dialog box.
    private void pageSetupToolStripMenuItem_Click(object sender, EventArgs e)
    {
    webBrowser1.ShowPageSetupDialog();
    }

    // Displays the Print dialog box.
    private void printToolStripMenuItem_Click(object sender, EventArgs e)
    {
    webBrowser1.ShowPrintDialog();
    }

    // Displays the Print Preview dialog box.
    private void printPreviewToolStripMenuItem_Click(
    object sender, EventArgs e)
    {
    webBrowser1.ShowPrintPreviewDialog();
    }

    // Displays the Properties dialog box.
    private void propertiesToolStripMenuItem_Click(
    object sender, EventArgs e)
    {
    webBrowser1.ShowPropertiesDialog();
    }

    // Selects all the text in the text box when the user clicks it.
    private void toolStripTextBox1_Click(object sender, EventArgs e)
    {
    toolStripTextBox1.SelectAll();
    }

    // Navigates to the URL in the address box when
    // the ENTER key is pressed while the ToolStripTextBox has focus.
    private void toolStripTextBox1_KeyDown(object sender, KeyEventArgs e)
    {
    if (e.KeyCode == Keys.Enter)
    {
    Navigate(toolStripTextBox1.Text);
    }
    }

    // Navigates to the URL in the address box when
    // the Go button is clicked.
    private void goButton_Click(object sender, EventArgs e)
    {
    Navigate(toolStripTextBox1.Text);
    }

    // Navigates to the given URL if it is valid.
    private void Navigate(String address)
    {
    if (String.IsNullOrEmpty(address)) return;
    if (address.Equals("about:blank")) return;
    if (!address.StartsWith("http://") &&
    !address.StartsWith("https://"))
    {
    address = "http://" + address;
    }
    try
    {
    webBrowser1.Navigate(new Uri(address));
    }
    catch (System.UriFormatException)
    {
    return;
    }
    }

    // Updates the URL in TextBoxAddress upon navigation.
    private void webBrowser1_Navigated(object sender,
    WebBrowserNavigatedEventArgs e)
    {
    toolStripTextBox1.Text = webBrowser1.Url.ToString();
    }

    // Navigates webBrowser1 to the previous page in the history.
    private void backButton_Click(object sender, EventArgs e)
    {
    webBrowser1.GoBack();
    }

    // Disables the Back button at the beginning of the navigation history.
    private void webBrowser1_CanGoBackChanged(object sender, EventArgs e)
    {
    backButton.Enabled = webBrowser1.CanGoBack;
    }

    // Navigates webBrowser1 to the next page in history.
    private void forwardButton_Click(object sender, EventArgs e)
    {
    webBrowser1.GoForward();
    }

    // Disables the Forward button at the end of navigation history.
    private void webBrowser1_CanGoForwardChanged(object sender, EventArgs e)
    {
    forwardButton.Enabled = webBrowser1.CanGoForward;
    }

    // Halts the current navigation and any sounds or animations on
    // the page.
    private void stopButton_Click(object sender, EventArgs e)
    {
    webBrowser1.Stop();
    }

    // Reloads the current page.
    private void refreshButton_Click(object sender, EventArgs e)
    {
    // Skip refresh if about:blank is loaded to avoid removing
    // content specified by the DocumentText property.
    if (!webBrowser1.Url.Equals("about:blank"))
    {
    webBrowser1.Refresh();
    }
    }

    // Navigates webBrowser1 to the home page of the current user.
    private void homeButton_Click(object sender, EventArgs e)
    {
    webBrowser1.GoHome();
    }

    // Navigates webBrowser1 to the search page of the current user.
    private void searchButton_Click(object sender, EventArgs e)
    {
    webBrowser1.GoSearch();
    }

    // Prints the current document using the current print settings.
    private void printButton_Click(object sender, EventArgs e)
    {
    webBrowser1.Print();
    }

    // Updates the status bar with the current browser status text.
    private void webBrowser1_StatusTextChanged(object sender, EventArgs e)
    {
    toolStripStatusLabel1.Text = webBrowser1.StatusText;
    }

    // Updates the title bar with the current document title.
    private void webBrowser1_DocumentTitleChanged(object sender, EventArgs e)
    {
    this.Text = webBrowser1.DocumentTitle;
    }

    // Exits the application.
    private void exitToolStripMenuItem_Click(object sender, EventArgs e)
    {
    Application.Exit();
    }

    private void InitializeComponent()
    {
    this.components = new Container();
    this.webBrowser1 = new System.Windows.Forms.WebBrowser();
    this.menuStrip1 = new System.Windows.Forms.MenuStrip();
    this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.saveAsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
    this.pageSetupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.printToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.printPreviewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
    this.propertiesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
    this.toolStrip1 = new System.Windows.Forms.ToolStrip();
    this.goButton = new System.Windows.Forms.ToolStripButton();
    this.backButton = new System.Windows.Forms.ToolStripButton();
    this.forwardButton = new System.Windows.Forms.ToolStripButton();
    this.stopButton = new System.Windows.Forms.ToolStripButton();
    this.refreshButton = new System.Windows.Forms.ToolStripButton();
    this.homeButton = new System.Windows.Forms.ToolStripButton();
    this.searchButton = new System.Windows.Forms.ToolStripButton();
    this.printButton = new System.Windows.Forms.ToolStripButton();
    this.toolStrip2 = new System.Windows.Forms.ToolStrip();
    this.toolStripTextBox1 = new System.Windows.Forms.ToolStripTextBox();
    this.statusStrip1 = new System.Windows.Forms.StatusStrip();
    this.toolStripStatusLabel1 = new System.Windows.Forms.ToolStripStatusLabel();
    this.menuStrip1.SuspendLayout();
    this.toolStrip1.SuspendLayout();
    this.toolStrip2.SuspendLayout();
    this.statusStrip1.SuspendLayout();
    this.SuspendLayout();
    //
    // webBrowser1
    //
    this.webBrowser1.Dock = System.Windows.Forms.DockStyle.Fill;
    this.webBrowser1.Location = new System.Drawing.Point(0, 74);
    this.webBrowser1.Name = "webBrowser1";
    this.webBrowser1.Size = new System.Drawing.Size(704, 304);
    this.webBrowser1.TabIndex = 0;
    this.webBrowser1.Navigated += new System.Windows.Forms.WebBrowserNavigatedEventHandler(this.webBrowser1_Navigated);
    //
    // menuStrip1
    //
    this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
    this.fileToolStripMenuItem});
    this.menuStrip1.Location = new System.Drawing.Point(0, 0);
    this.menuStrip1.Name = "menuStrip1";
    this.menuStrip1.Size = new System.Drawing.Size(704, 24);
    this.menuStrip1.TabIndex = 3;
    //
    // fileToolStripMenuItem
    //
    this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
    this.saveAsToolStripMenuItem,
    this.toolStripSeparator1,
    this.pageSetupToolStripMenuItem,
    this.printToolStripMenuItem,
    this.printPreviewToolStripMenuItem,
    this.toolStripSeparator2,
    this.propertiesToolStripMenuItem,
    this.exitToolStripMenuItem});
    this.fileToolStripMenuItem.Name = "fileToolStripMenuItem";
    this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 20);
    this.fileToolStripMenuItem.Text = "&File";
    //
    // saveAsToolStripMenuItem
    //
    this.saveAsToolStripMenuItem.Name = "saveAsToolStripMenuItem";
    this.saveAsToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
    this.saveAsToolStripMenuItem.Text = "Save &As...";
    this.saveAsToolStripMenuItem.Click += new System.EventHandler(this.saveAsToolStripMenuItem_Click);
    //
    // toolStripSeparator1
    //
    this.toolStripSeparator1.Name = "toolStripSeparator1";
    this.toolStripSeparator1.Size = new System.Drawing.Size(149, 6);
    //
    // pageSetupToolStripMenuItem
    //
    this.pageSetupToolStripMenuItem.Name = "pageSetupToolStripMenuItem";
    this.pageSetupToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
    this.pageSetupToolStripMenuItem.Text = "Page Set&up...";
    this.pageSetupToolStripMenuItem.Click += new System.EventHandler(this.pageSetupToolStripMenuItem_Click);
    //
    // printToolStripMenuItem
    //
    this.printToolStripMenuItem.Name = "printToolStripMenuItem";
    this.printToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P)));
    this.printToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
    this.printToolStripMenuItem.Text = "&Print...";
    this.printToolStripMenuItem.Click += new System.EventHandler(this.printToolStripMenuItem_Click);
    //
    // printPreviewToolStripMenuItem
    //
    this.printPreviewToolStripMenuItem.Name = "printPreviewToolStripMenuItem";
    this.printPreviewToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
    this.printPreviewToolStripMenuItem.Text = "Print Pre&view...";
    this.printPreviewToolStripMenuItem.Click += new System.EventHandler(this.printPreviewToolStripMenuItem_Click);
    //
    // toolStripSeparator2
    //
    this.toolStripSeparator2.Name = "toolStripSeparator2";
    this.toolStripSeparator2.Size = new System.Drawing.Size(149, 6);
    //
    // propertiesToolStripMenuItem
    //
    this.propertiesToolStripMenuItem.Name = "propertiesToolStripMenuItem";
    this.propertiesToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
    this.propertiesToolStripMenuItem.Text = "Properties";
    this.propertiesToolStripMenuItem.Click += new System.EventHandler(this.propertiesToolStripMenuItem_Click);
    //
    // exitToolStripMenuItem
    //
    this.exitToolStripMenuItem.Name = "exitToolStripMenuItem";
    this.exitToolStripMenuItem.Size = new System.Drawing.Size(152, 22);
    this.exitToolStripMenuItem.Text = "E&xit";
    this.exitToolStripMenuItem.Click += new System.EventHandler(this.exitToolStripMenuItem_Click);
    //
    // toolStrip1
    //
    this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
    this.goButton,
    this.backButton,
    this.forwardButton,
    this.stopButton,
    this.refreshButton,
    this.homeButton,
    this.searchButton,
    this.printButton});
    this.toolStrip1.Location = new System.Drawing.Point(0, 24);
    this.toolStrip1.Name = "toolStrip1";
    this.toolStrip1.Size = new System.Drawing.Size(704, 25);
    this.toolStrip1.TabIndex = 2;
    //
    // goButton
    //
    this.goButton.Name = "goButton";
    this.goButton.Size = new System.Drawing.Size(26, 22);
    this.goButton.Text = "Go";
    this.goButton.Click += new System.EventHandler(this.goButton_Click);
    //
    // backButton
    //
    this.backButton.Enabled = false;
    this.backButton.Name = "backButton";
    this.backButton.Size = new System.Drawing.Size(36, 22);
    this.backButton.Text = "Back";
    this.backButton.Click += new System.EventHandler(this.backButton_Click);
    //
    // forwardButton
    //
    this.forwardButton.Enabled = false;
    this.forwardButton.Name = "forwardButton";
    this.forwardButton.Size = new System.Drawing.Size(54, 22);
    this.forwardButton.Text = "Forward";
    this.forwardButton.Click += new System.EventHandler(this.forwardButton_Click);
    //
    // stopButton
    //
    this.stopButton.Name = "stopButton";
    this.stopButton.Size = new System.Drawing.Size(35, 22);
    this.stopButton.Text = "Stop";
    this.stopButton.Click += new System.EventHandler(this.stopButton_Click);
    //
    // refreshButton
    //
    this.refreshButton.Name = "refreshButton";
    this.refreshButton.Size = new System.Drawing.Size(50, 22);
    this.refreshButton.Text = "Refresh";
    this.refreshButton.Click += new System.EventHandler(this.refreshButton_Click);
    //
    // homeButton
    //
    this.homeButton.Name = "homeButton";
    this.homeButton.Size = new System.Drawing.Size(44, 22);
    this.homeButton.Text = "Home";
    this.homeButton.Click += new System.EventHandler(this.homeButton_Click);
    //
    // searchButton
    //
    this.searchButton.Name = "searchButton";
    this.searchButton.Size = new System.Drawing.Size(46, 22);
    this.searchButton.Text = "Search";
    this.searchButton.Click += new System.EventHandler(this.searchButton_Click);
    //
    // printButton
    //
    this.printButton.Name = "printButton";
    this.printButton.Size = new System.Drawing.Size(36, 22);
    this.printButton.Text = "Print";
    this.printButton.Click += new System.EventHandler(this.printButton_Click);
    //
    // toolStrip2
    //
    this.toolStrip2.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
    this.toolStripTextBox1});
    this.toolStrip2.Location = new System.Drawing.Point(0, 49);
    this.toolStrip2.Name = "toolStrip2";
    this.toolStrip2.Size = new System.Drawing.Size(704, 25);
    this.toolStrip2.TabIndex = 1;
    //
    // toolStripTextBox1
    //
    this.toolStripTextBox1.Font = new System.Drawing.Font("Segoe UI", 9F);
    this.toolStripTextBox1.Name = "toolStripTextBox1";
    this.toolStripTextBox1.Size = new System.Drawing.Size(250, 25);
    this.toolStripTextBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.toolStripTextBox1_KeyDown);
    this.toolStripTextBox1.Click += new System.EventHandler(this.toolStripTextBox1_Click);
    //
    // statusStrip1
    //
    this.statusStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
    this.toolStripStatusLabel1});
    this.statusStrip1.Location = new System.Drawing.Point(0, 378);
    this.statusStrip1.Name = "statusStrip1";
    this.statusStrip1.Size = new System.Drawing.Size(704, 22);
    this.statusStrip1.TabIndex = 4;
    //
    // toolStripStatusLabel1
    //
    this.toolStripStatusLabel1.Name = "toolStripStatusLabel1";
    this.toolStripStatusLabel1.Size = new System.Drawing.Size(0, 17);
    //
    // Form1
    //
    this.ClientSize = new System.Drawing.Size(704, 400);
    this.Controls.Add(this.webBrowser1);
    this.Controls.Add(this.toolStrip2);
    this.Controls.Add(this.toolStrip1);
    this.Controls.Add(this.statusStrip1);
    this.Controls.Add(this.menuStrip1);
    this.Name = "Form1";
    this.menuStrip1.ResumeLayout(false);
    this.menuStrip1.PerformLayout();
    this.toolStrip1.ResumeLayout(false);
    this.toolStrip1.PerformLayout();
    this.toolStrip2.ResumeLayout(false);
    this.toolStrip2.PerformLayout();
    this.statusStrip1.ResumeLayout(false);
    this.statusStrip1.PerformLayout();
    this.ResumeLayout(false);
    this.PerformLayout();

    }


    protected override void Dispose(bool disposing)
    {
    if (disposing) { if (components != null) { components.Dispose(); } }
    base.Dispose(disposing);
    }
    }

  • pmonitor

    aktív tag

    válasz fatal` #9496 üzenetére

    (nem is látszódnának a designerben VS alatt).

    És meddig tart megcsinálni úgy, hogy látszódjanak? 2 perc, vagy talán 3 is van?

  • pmonitor

    aktív tag

    válasz martonx #9482 üzenetére

    a *.designer.cs fileokat nem szabadna módosítani.

    Dehogynem szabad. Pl. itt a microsoft hivatalos oldalán sincs külön .designer file.
    Úgyhogy nyugodtan lehet. Csak tudni kell, hogy mit csinál az ember fia. :)

  • pmonitor

    aktív tag

    válasz joysefke #9471 üzenetére

    Készítettem az eredeti OOP kódodra egy kis módosítást. Meg Készítettem 2 nem OOP metódust(az egyik static, a másikhoz példányosítani kell). A nem OOP metódusokban Array.Sort()-ok helyett quicksort-ot használtam. Ezek a kódok hasítanak! A kódokban a kiíratásokat kommenteztem ki(na meg az Array.Sort-ok helyét):
    using System;
    using System.Diagnostics;

    namespace TesztConsole
    {
    class Program
    {
    static void Main(string[] args)
    {
    Console.WriteLine(DateTime.Now);
    //int i = 0;
    int jmax = 25000;
    Stopwatch sw = new Stopwatch();
    long t_1 = 0, t_2 = 0, t_3 = 0, t_4 = 0, t_5 = 0, t_6 = 0, t_7 = 0;
    sw.Start();
    for (int j = 0; j < jmax; ++j)
    {
    var p = new Permutator("abcdananana".ToCharArray());
    do
    {
    /*i++;
    Console.WriteLine(new string(p.State));*/
    }
    while (p.Next());
    //Console.WriteLine($"Nr of results: {i}");
    }
    t_1 = sw.ElapsedMilliseconds;
    GC.Collect();
    t_2 = sw.ElapsedMilliseconds;
    for (int j = 0; j < jmax; ++j) new Program().Teszt_qsort("abcdananana".ToCharArray());
    t_3 = sw.ElapsedMilliseconds;
    GC.Collect();
    t_4 = sw.ElapsedMilliseconds;
    for (int j = 0; j < jmax; ++j)
    {
    var p = new Permutator_modositott("abcdananana".ToCharArray());
    do
    {
    /*i++;
    Console.WriteLine(new string(p.State));*/
    }
    while (p.Next());
    //Console.WriteLine($"Nr of results: {i}");
    }
    t_5 = sw.ElapsedMilliseconds;
    GC.Collect();
    t_6 = sw.ElapsedMilliseconds;
    for (int j = 0; j < jmax; ++j) stTeszt_qsort("abcdananana".ToCharArray());
    t_7 = sw.ElapsedMilliseconds;
    Console.WriteLine("Eredeti: {0}", t_1);
    Console.WriteLine("Módosított: {0}", t_5 - t_4);
    Console.WriteLine("Nem OOP: {0}", t_3 - t_2);
    Console.WriteLine("Nem OOP static: {0}", t_7 - t_6);
    }

    static void QuickSort(char[] arr2, int p, int r)
    {//quicksort
    int Low, High;
    char MidValue;
    Low = p;
    High = r;
    MidValue = arr2[(p + r) / 2];
    do
    {
    while (arr2[Low] < MidValue) ++Low;
    while (arr2[High] > MidValue) --High;
    if (Low <= High)
    {
    char 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);
    }

    int findCeilInt(char[] str, char first, int l, int h)
    {
    int ceilIndex = l;
    for (int i = l + 1; i <= h; i++)
    if (str[i] > first && str[i] < str[ceilIndex])
    ceilIndex = i;
    return ceilIndex;
    }

    void Teszt_qsort(char[] arr)
    {
    char[] tomb = (char[])arr.Clone();
    int size = tomb.Length;
    QuickSort(tomb, 0, size - 1);
    //Array.Sort(tomb);
    bool isFinished = false;
    while (!isFinished)
    {
    int i;

    /*for (int k = 0; k < size; ++k) Console.Write("{0} ", tomb[k]);
    Console.WriteLine("");*/

    for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
    if (i == -1) isFinished = true;
    else
    {
    int ceilIndex = findCeilInt(tomb, tomb[i], i + 1, size - 1);
    char temp = tomb[i];
    tomb[i] = tomb[ceilIndex];
    tomb[ceilIndex] = temp;
    QuickSort(tomb, i + 1, size - 1);
    //Array.Sort(tomb, i + 1, size - i - 1);
    }
    }
    }

    static int stfindCeilInt(char[] str, char first, int l, int h)
    {
    int ceilIndex = l;
    for (int i = l + 1; i <= h; i++)
    if (str[i] > first && str[i] < str[ceilIndex])
    ceilIndex = i;
    return ceilIndex;
    }

    static void stTeszt_qsort(char[] arr)
    {
    char[] tomb = (char[])arr.Clone();
    int size = tomb.Length;
    QuickSort(tomb, 0, size - 1);
    //Array.Sort(tomb);
    bool isFinished = false;
    while (!isFinished)
    {
    int i;

    //for (int m = 0; m < size; ++m) Console.Write("{0} ", tomb[m]);
    //Console.WriteLine("");

    for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
    if (i == -1) isFinished = true;
    else
    {
    int ceilIndex = stfindCeilInt(tomb, tomb[i], i + 1, size - 1);
    char temp = tomb[i];
    tomb[i] = tomb[ceilIndex];
    tomb[ceilIndex] = temp;
    QuickSort(tomb, i + 1, size - 1);
    //Array.Sort(tomb, i + 1, size - i - 1);
    }
    }
    }
    }
    public class Permutator_modositott
    {
    public char[] State { get; }
    int _size;
    bool isFinished = false;
    public Permutator_modositott(char[] symbols)
    {
    if (symbols?.Length > 0)
    {
    _size = symbols.Length;
    State = (char[])symbols.Clone();
    Array.Sort(State);
    }
    else
    throw new ArgumentException("input must be non-empty");
    }
    public bool Next()
    {
    if (isFinished)
    return false;

    isFinished = !AdvanceState();
    return !isFinished;
    }
    bool AdvanceState()
    {
    int i, j;
    for (i = _size - 2, j = _size - 1; i >= 0; --i, --j)
    if (State[i] < State[j])
    break;
    if (i == -1)
    return false;
    int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
    char tmp = State[i];
    State[i] = State[ceilIndex];
    State[ceilIndex] = tmp;
    Array.Sort(State, i + 1, _size - i - 1);
    return true;
    }
    int findCeil(char[] str, char first, int l, int h)
    {
    int ceilIndex = l;
    for (int i = l + 1; i <= h; ++i)
    if (str[i] > first && str[i] < str[ceilIndex])
    ceilIndex = i;
    return ceilIndex;
    }
    }

    public class Permutator
    {
    public char[] State { get; }
    int _size;
    bool isFinished = false;
    public Permutator(char[] symbols)
    {
    if (symbols?.Length > 0)
    {
    _size = symbols.Length;
    State = (char[])symbols.Clone();
    Array.Sort(State);
    }
    else
    throw new ArgumentException("input must be non-empty");
    }
    public bool Next()
    {
    if (isFinished)
    return false;

    isFinished = !AdvanceState();
    return !isFinished;
    }
    bool AdvanceState()
    {
    int i;
    for (i = _size - 2; i >= 0; --i)
    if (State[i] < State[i + 1])
    break;
    if (i == -1)
    return false;
    int ceilIndex = findCeil(State, State[i], i + 1, _size - 1);
    char tmp = State[i];
    State[i] = State[ceilIndex];
    State[ceilIndex] = tmp;
    Array.Sort(State, i + 1, _size - i - 1);
    return true;
    }
    int findCeil(char[] str, char first, int l, int h)
    {
    int ceilIndex = l;
    for (int i = l + 1; i <= h; i++)
    if (str[i] > first && str[i] < str[ceilIndex])
    ceilIndex = i;
    return ceilIndex;
    }
    }
    }

    Az eredmény:
    Eredeti: 46213
    Módosított: 45772
    Nem OOP: 14693
    Nem OOP static: 14295

    Látszik, hogy a qsort alkalmazásával kb. harmada idő alatt lefutnak.

    Érdemes lenne a rendezésre is csinálni teszteket.
    De most nincs időm.

  • pmonitor

    aktív tag

    válasz joysefke #9471 üzenetére

    bent maradt a hot pathban a Console.WriteLine()

    Ez nem maradt benn a tesztelős kódban. Ha megnézed a Main-t, akkor láthatod, hogy ez nem a teszt kódja.

  • pmonitor

    aktív tag

    válasz joysefke #9468 üzenetére

    Én így fordítottam át:
    using System;

    namespace IsmPerm
    {
    class Program
    {
    static int findCeilInt(int[] str, int first, int l, int h)
    {
    int ceilIndex = l;
    for (int i = l + 1; i <= h; i++)
    if (str[i] > first && str[i] < str[ceilIndex])
    ceilIndex = i;
    return ceilIndex;
    }

    static void Teszt_1(int[] tomb)
    { //https://www.geeksforgeeks.org/print-all-permutations-of-a-string-with-duplicates-allowed-in-input-string/
    int size = tomb.Length;
    Array.Sort(tomb);
    bool isFinished = false;
    while (!isFinished)
    {
    int x = 1, i;

    for (int k = 0; k < size; ++k) Console.Write("{0} ", tomb[k]);
    Console.WriteLine("");

    for (i = size - 2; i >= 0; --i) if (tomb[i] < tomb[i + 1]) break;
    if (i == -1) isFinished = true;
    else
    {
    int ceilIndex = findCeilInt(tomb, tomb[i], i + 1, size - 1);
    int temp = tomb[i];
    tomb[i] = tomb[ceilIndex];
    tomb[ceilIndex] = temp;
    Array.Sort(tomb, i + 1, size - i - 1);
    }
    }
    }

    static void Main(string[] args)
    {
    int[] tomb = new int[] { 500, 500, 600, 600, 700};
    Teszt_1(tomb);
    Console.ReadKey();
    }
    }
    }

  • pmonitor

    aktív tag

    válasz joysefke #9464 üzenetére

    Átírtam C#-ba, meg összehasonlítottam az én kódommal. 5-ször gyorsabb amit Te linkeltél. Jól tudsz guglizni. Köszönöm!

    De egyébként ezt is ugyanazzal a módszerrel teszteltem, mint a tömbök másolását. És itt is ugyanolyan konzekvensen mutatta az eredményt, mint ott. Úgyhogy a tesztelés sémájával nincs semmi gond. Azt teszteli, amit tesztelni szeretnék. Ezzel teszteltem:
    static void Main(string[] args)
    {
    tomb = new int[] { 500, 500, 600, 600, 700 };
    int max = 5000000;
    Stopwatch sw = new Stopwatch();
    long t_1 = 0, t_2 = 0, t_3 = 0;
    sw.Start();
    for (int i = 0; i < max; ++i) Teszt_1(tomb);
    t_1 = sw.ElapsedMilliseconds;
    GC.Collect();
    t_2 = sw.ElapsedMilliseconds;
    for (int i = 0; i < max; ++i) Teszt_2(tomb);
    t_3 = sw.ElapsedMilliseconds;
    Console.WriteLine("{0} {1}", t_1, t_3 - t_2);
    Console.ReadKey();
    }

  • pmonitor

    aktív tag

    válasz joysefke #9464 üzenetére

    Ezt megnézem. Ha több időm lesz, akkor átírom C#-ba, és ha gyorsabb, mint az enyém, akkor ezt használom.

  • pmonitor

    aktív tag

    válasz joysefke #9462 üzenetére

    A teszt mér valamit, de nem azt amire te kiváncsi vagy.

    Amíg konzekvensen ugyanazt az eredményt írja ki, addig nekem tökéletes. Ráadásul kipróbáltam. A Cutter programomban az Array.Copy()-t lecseréltem a CopyMemory()-ra, és ugyanazt a tendenciát mutatta, mint a teszt programom. Gyorsabb lett. Tehát sztem azt méri, amit szeretnék mérni. A Cutter program futásakor is "lutri", hogy mikor indul be a GC, tehát még ez is élethűen van a tesztben.

    Csak az a baj, hogy(mint ahogy először jól mondtad), a stackalloc a stack-en allokál. Ezt pedig sajnos nem engedhetem meg magamnak(a stack is véges, és mivel nem tudom, hogy egyszerre mennyire van szükségem, ezért ez nem megoldás.), mindenképp a heap-ben kell allokálnom.

  • pmonitor

    aktív tag

    válasz joysefke #9462 üzenetére

    Ha nem kell a mélységi bejárás során keletkező összes tömböt megtartani, csak mindig 1-1 újabbra van szükséged és tudod hogy egy tömbre mikor nem lesz már szükség

    Rekurzív hívásokról van szó. Tehát nem mindig csak egyet kell megtartani. Viszont még azt sem lehet előre tudni, hogy egyidőben mennyire van szükség.

  • pmonitor

    aktív tag

    válasz joysefke #9460 üzenetére

    Ha nagyot foglalsz a heapen akkor az triggerelhet egy GC futást is.

    De ez az összes többi esetre is vonatkozik(teszt_1-teszt_5-ig). Nem állítom, hogy a teszt atompontos. De többször lefuttattam, és mindig hasonló eredményt adott az egymáshoz viszonyított idők tekintetében.

    Csak másolni kell a tartalmat egyik helyről a másikra vagy allokálni kell és feltölteni? Elég jelentős a különbség.

    Az optimalizálás 5letét az ismétléses permutáció algoritmusa adta. Ott nagyon sokat kell allokálni és feltölteni(bár a legjobb az lenne, ha csak feltölteni --tehát simán másolni-- kellene).

    (nem ismerem a feladatot)

    A webhelyemen lévő tesztben allokálok és feltöltöm. A konkrét feladat pedig az ismétléses permutáció algoritmusa(ami a teszthez az 5tletet adta).

  • pmonitor

    aktív tag

    válasz pmonitor #9458 üzenetére

    Az egészet arra éleztem ki, hogy a "fő programom"(a cutter) esetében sokat kell tömböt másolni. Igaz, hogy csak kis méretűeket. És ezt rekurzívan kell tenni(ismétléses permutáció generálásához). A Win api CopyMemory() esetén lényegesen gyorsabb lett az ismétléses permutáció generálása(a rekurzív hívásokban lévő tömb másolások gyorsulása miatt.) .

  • pmonitor

    aktív tag

    válasz joysefke #9455 üzenetére

    Igaz. Közben rájöttem.

    Ez lenne talán a reális:
    static unsafe void teszt_6(int[] source, int n)
    {
    int[] dest = new int[n];
    fixed (int* pSource = source, pdest = dest)
    {
    int* pSource_0 = pSource;
    int* pdest0 = pdest;
    int* pmax = pSource_0 + n;
    for (; pSource_0 < pmax; ++pSource_0, ++pdest0)
    {
    *pdest0 = *pSource_0;
    }
    }
    }

    Szerk.: És ez már megint csak akkor végez, mint az első esetben(tehát mégsem a leggyorsabb). Azért érdekes, hogy attól, hogy unsafe, még nem optimális kódot lehet vele írni.

  • pmonitor

    aktív tag

    Érdekes dolog ez az optimalizálás. Én éppen most írtam 1 tesztprogramot tömbök másolásához. Elég érdekes dolgok jöttek ki. Ért 1-2 meglepetés...

  • pmonitor

    aktív tag

    válasz cigam #9363 üzenetére

    A [link] -en megtalálható a kód, ami visszaadja a szöveg méretét. A szélesség és a magasság ismeretében tudod változtatni FontSize méretét, hogy beleférjen a szélességbe.

Új hozzászólás Aktív témák

Hirdetés