C# ukazatelé – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

C# ukazatelé – .NET – Fórum – Programujte.comC# ukazatelé – .NET – Fórum – Programujte.com

 

Kubas1290
Stálý člen
10. 8. 2021   #1
-
0
-

#19 Mutagen
Ahoj,

Jak můžu prosím v C# zjistit zda více instancí stejných referenčních typů jsou v haldě uložený na stejném místě?

            Player pl1 = clients[0].player;
            Player pl2 = room.Players[0];
            unsafe
            {
                if (&pl1 == &pl2) //nefunguje
            }
Nahlásit jako SPAM
IP: 62.141.28.–
gna
~ Anonymní uživatel
1853 příspěvků
10. 8. 2021   #2
-
+1
-
Zajímavé

Pokud není operátor == přetížený, tak dělá to, co chceš.

Stoprocentní způsob je Object.ReferenceEquals(obj1, obj2).

Nahlásit jako SPAM
IP: 213.211.51.–
Kit+15
Guru
10. 8. 2021   #3
-
+1
-
Zajímavé

#1 Kubas129 

pl1 is pl2
Nahlásit jako SPAM
IP: 213.175.51.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
JerryM0
Věrný člen
10. 8. 2021   #4
-
+1
-
Zajímavé

#1 Kubas129
to bohužel nejde ... protože v C# používáš tzv. Handle nikoliv fyzickou adresu v haldě... v řízeném programování v C++/CLI nebo C++/CX nebo C++/WinRT je k tomu tzv. TrackingReference

https://docs.microsoft.com/en-us/cpp/extensions/tracking-reference-operator-cpp-component-extensions?view=msvc-160

ale v C# to neni. Tracking reference je ale stejně jen handle na handle takže je to fuk ..

takže jedinnou možností je porovnání typů pomocí "is" ...

nebo

Type.Equals:

https://docs.microsoft.com/cs-cz/dotnet/api/system.type.equals?view=net-5.0

nebo ... pomocí porovnání IntPtr ukazatelů:

https://stackoverflow.com/questions/689975/getting-an-intptr-to-a-ulong-variable-in-c-sharp

což ale není dobrý nápad, protože memory manager windows provádí dynamicky přesuny paměti a pointer se musí fixovat - pinPointer - což ty asi určitě nemáš:

https://forum.unity.com/threads/cant-access-c-member-variables-from-a-natively-invoked-c-callback.1046287/

tady je rozdíl mezi klasickým pointerem v C/C++ a IntPtr

https://newbedev.com/c-pointers-vs-intptr

a tady je ještě popis tzv. Unsafe code

https://www.tutorialspoint.com/csharp/csharp_unsafe_codes.htm

IntPtr by ti mělo dát adresu v haldě, ale byl bych s použitím velmi opatrný ...

tady je návod jak přistupovat do paměti přes IntPtr

https://bytes.com/topic/c-sharp/answers/684278-how-directly-access-memory-using-intptr

a tady je to tvoje porovnávání IntPtr co asi chceš

https://csharp.hotexamples.com/examples/-/IntPtr/ToString/php-intptr-tostring-method-examples.html

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:3c0d:85d0:f970:aa72...–
Mutagen0
Super člen
11. 8. 2021   #5
-
0
-

Nechci být rýpal, ale příjde mi, že ty vždycky si něco novýho přečteš a hned to musíš zakomponentovat do programu, i když to vůbec ale vůbec není nutný používat. Jinak JerryM ti poslal vše co pravděpodobně potřebuješ.

Jinak "is" a "Equals" se používá.

Nahlásit jako SPAM
IP: 185.138.71.–
Kubas1290
Stálý člen
11. 8. 2021   #6
-
0
-

#5 Mutagen
nn, ale měl jsem dva listy do, kterých jsem přidával stejnou instanci třídy, a když jsem v jednom tom listě této instanci některé její atributy pozměnil, tak se změna neprojevila v druhém listě a naopak, což mi přišlo divné.

Nahlásit jako SPAM
IP: 62.141.28.–
Mutagen0
Super člen
11. 8. 2021   #7
-
+1
-
Zajímavé

#6 Kubas129
Jasný, už asi vím o co ti jde,

zkus přidat do listu referenci playera nikoli jako nový objekt. Ale mam pocit, že pokud budeš mít
Player p = new Player();
list.Add(p);
list2.Add(p);

tak jakmile změníš např p.Name, tak by se to mělo projevit v obouch, ale záleží na tom jak to plníš a jestli to plníš ze stjený instance.

Nahlásit jako SPAM
IP: 185.138.71.–
11. 8. 2021   #8
-
0
-

Musí být nutně dva Listy? Jestli by to šlo vyřešit atributem ...

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Kubas1290
Stálý člen
11. 8. 2021   #9
-
0
-

Už jsem asi přišel čím to bylo. Jak používám toho Jsona na přenos dat, tak on si vždy vytvoří novou instanci (teda podle mě), takže proto se pak už neodkazují na stejné místo v paměti :)

Nahlásit jako SPAM
IP: 62.141.28.–
Kubas1290
Stálý člen
11. 8. 2021   #10
-
0
-

#9 Kubas129
Je v C# něco jako kopírovací konstruktor jako v C++?

Nahlásit jako SPAM
IP: 62.141.28.–
JerryM0
Věrný člen
11. 8. 2021   #11
-
0
-

ano

https://docs.microsoft.com/cs-cz/dotnet/csharp/programming-guide/classes-and-structs/how-to-write-a-copy-constructor

možná by bylo dobrá kdyby sis nejprve něco nastudoval

třeba tady máš knížky zdarma

https://www.programming-book.com/c-sharp/

hlavně to nepřeháněj ať se ti nezavaří mozek :)

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:9066:8758:993:5820...–
Kubas1290
Stálý člen
11. 8. 2021   #12
-
0
-

#11 JerryM
Díky, ale už jsem nějak tak přečetl C# step by step a C# programujeme profesionálně (neříkám 100% z toho :D), bych chtěl napřed dopsat ty monopoly už mám takových 70% z toho, ale chybí mi ještě někde sehnat domečky   v png. Bych chtěl mít žlutý, červený, zelený a modrý a ještě hotýlky téže barvy. Nezdá někdo nějakou stránku, kde by se tyto sprity daly zadarmo stáhnout? :-)

Nahlásit jako SPAM
IP: 62.141.28.–
Kit+15
Guru
11. 8. 2021   #13
-
+1
-
Zajímavé

#10 Kubas129
ICloneable


Nahlásit jako SPAM
IP: 85.160.38.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Mutagen
~ Anonymní uživatel
549 příspěvků
11. 8. 2021   #14
-
0
-

#12 Kubas129
A co třeba udělat si prostě obrázky sám?

Nahlásit jako SPAM
IP: 91.237.237.–
Kubas1290
Stálý člen
11. 8. 2021   #15
-
0
-

#14 Mutagen
když já nevím jak, jediný v čem jakž tak umím je malování ve windows, které myslím že nepodporuje vrstvy, takže když pak z něho poté ten obrázek naimportuji, tak zabere celý čtverec :(

Nahlásit jako SPAM
IP: 62.141.28.–
JerryM0
Věrný člen
12. 8. 2021   #16
-
0
-

co třeba udělat to v PowerPointu ?

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:9066:8758:993:5820...–
Kubas1290
Stálý člen
12. 8. 2021   #17
-
0
-

#16 JerryM
Jak to myslíš? :)

Nahlásit jako SPAM
IP: 62.141.28.–
Mutagen
~ Anonymní uživatel
549 příspěvků
12. 8. 2021   #18
-
0
-

#15 Kubas129
No je vidět, že asi nemáš ani základní znalosti v tomhle, ale nevadí.

Stáhni si paint.net ten umí vrstvy a je jednoduchej, v tom to uděláš krásně.

Jinak k problematice netransparentního pozadí

Bitmap bmp = tvujObrazek;
bmp.MakeTransparent(bmp.GetPixel(0, 0));

S tím, že na pixel 0,0 vlozíš barvu, která má být transparentní takže např. bílá

Nahlásit jako SPAM
IP: 185.138.71.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Podobná vlákna

Ukazatele — založil Šimon

Ukazatele — založil IBTR

Ukazatele v C? — založil Zakruta

C++ Ukazatele — založil pointer

Ukazatele — založil demo

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý