- Milyen okostelefont vegyek?
- Mobil flották
- India felől közelít egy 7550 mAh-s Redmi
- iPhone topik
- Android alkalmazások - szoftver kibeszélő topik
- Profi EKG-s óra lett a Watch Fitből
- Honor 400 Pro - gép a képben
- Samsung Galaxy S21 és S21+ - húszra akartak lapot húzni
- Honor Magic7 Pro - kifinomult, költséges képalkotás
- Samsung Galaxy A54 - türelemjáték
Új hozzászólás Aktív témák
-
pmonitor
aktív tag
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
pmonitor #10108 üzenetére
Itt található a jelenlegi munkaverzióm. Még nagyon kusza. csak idő kell hozzá..
-
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!!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
-
pmonitor
aktív tag
-
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
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 #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
pmonitor #9544 üzenetére
Azt elfelejtettem, hogy a működő kód megtalálható itt. Valamint egy rövid leírás itt.
-
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 akkor
panel1.Enabled=false;
vagygroupBox1.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
#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
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
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
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: 14295Lá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 #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 #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...
Új hozzászólás Aktív témák
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- sziku69: Fűzzük össze a szavakat :)
- Milyen notebookot vegyek?
- The First Berserker: Khazan
- OLED TV topic
- Audi, Cupra, Seat, Skoda, Volkswagen topik
- Milyen okostelefont vegyek?
- Vezetékes FEJhallgatók
- Milyen alaplapot vegyek?
- Mielőbb díjat rakatnának a görögök az olcsó csomagokra az EU-ban
- Androidos tablet topic
- További aktív témák...
- Samsung Galaxy A14 64GB, Kártyafüggetlen, 1 Év Garanciával
- Keresem : Lenovo Legion 5 16IRX9 83DG0037HV
- ÁRGARANCIA! Épített KomPhone Ryzen 5 7500F 32/64GB DDR5 RTX 5060Ti 8GB GAMER PC termékbeszámítással
- ÁRGARANCIA!Épített KomPhone Ryzen 7 7800X3D 32/64GB RAM RTX 5070Ti 16GB GAMER PC termékbeszámítással
- Bomba ár! Dell Latitude E6520 - i7-2760QM I 8GB I 256SSD I Nvidia I HDMI I 15,6" HD+ I W10 I Gari!
Állásajánlatok
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest