- sziku69: Fűzzük össze a szavakat :)
- Elektromos rásegítésű kerékpárok
- gban: Ingyen kellene, de tegnapra
- Luck Dragon: Asszociációs játék. :)
- MasterDeeJay: SATA to SAS adapter
- btz: Internet fejlesztés országosan!
- Viber: ingyen telefonálás a mobilodon
- Argos: Szeretem az ecetfát
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- gerner1
Új hozzászólás Aktív témák
-
martonx
veterán
válasz
joysefke #10098 üzenetére
Szerintem ezt annotációval nem fogod tudni megoldani, no persze custom auth attribute-al szépen megoldható.
Elsőre elég lehet egy if az onGetAccountban, ami jól látod megvizsgálja a Usert. Remélhetőleg valahol látszódni fog a useren, hogy min keresztül lépett be.
És majd ha ez már szépen működik, majd ki lehet emelni egy custum Authentication attribute-ba. -
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
-
joysefke
veterán
válasz
martonx #10097 üzenetére
Én sem ismerem, hogy Razor-ban ez hogy van (vagy úgy általában a Razort), de feltételezem, hogy "claim" alapon könnyen megvalósítható az authorizáció, ahol végül [Authorize(Policy = "policyName")] attribútummal lenne dekorálva a top level Razor metódus.
A "policyName" policy pedig az ASP NET Core "User" claimjeit ellenőrzi. Az adott Identity Provider (Spotify) által történt azonosításra nyilván a Useren (ClaimsPrincipal-on) belül fog utalni egy claim érték, amit az adott policy ellenőrizni tud.
https://learn.microsoft.com/en-us/aspnet/core/security/authorization/claims?view=aspnetcore-8.0
-
martonx
veterán
válasz
pmonitor #10096 üzenetére
fontos, hogy nagybetűvel írtam a Usert, ugyanis Asp.Net-ben így hívják a user entitást, ami HttpContext-ben van. Szóval reményeim szerint érti, mire gondolok. 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, mert razort pl. sose használtam, MVC-t, és API-t szoktam fejleszteni. 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.
Meg persze kód példa nélkül nehéz is konkrétumokról beszélniMeg persze, ha rászánnék még plusz 20 percet, és életemben először nyitnék egy razor page-es Asp.Net-es projektet, akkor valószínűleg pontosabban tudnék válaszolni neki, így csak iránymutatást tudok adni.
-
-
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. -
Keem1
veterán
Srácok, szeretnék helpet kérni.
ASP.Net Core Razor. Van két Oauth authentication-öm: Google, Spotify.
Van a Spotify pagemoldelen belül egy OnGetAccount(), amit értelemszerűen ha a Spoti login ok, akkor jelenjen meg. Nem logged off, nem Google logged in, hanem csakis ha Spoti logged in.
Hogy tudom rávenni a /Spotify/Account oldalt, hogy ha logged in akkor OK, amúgy /Spotify/Login redirect?Valami ilyesmit találtam a metódus fejhez:
[Authenticate]De ez hatástalan, semmi nem történik.
Előre is köszi.
-
joysefke
veterán
válasz
Tomi_78 #10091 üzenetére
Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255.
Ezért mondtam, hogy érdemes lenne valami alapozó könyvet olvasgatni. Egyébként addig nincs értelme optimalizálgatni, amíg arra nincs szükség (, illetve amíg nem tudod mit csinálsz).
A programodban biztos lehetsz benne, hogy az hogy a MainForm ban egy fieldnek bool-t használsz int helyett semmi jelentősége nincsen illetve egyetlen byte-ot sem spórolsz, a MainForm byte-re pontosan ugyanakkora lesz.
Ennek az oka, hogy az objektumok fieldjei a memóriában nem feltétlenül teljesen folytonosan helyzkednek el, hanem igazítva vannak.class MyClass
{
byte B;
int Num;
}Ez például jó eséllyel a "Num" 4byteos mérete miatt 4 bytejával lesz igazítva, tehát a B is 4 byteot fog elfoglalni jó eséllyel. (futtatókörnyezet függő). Az 1byte hasznos terület után lesz 3byte foghíj. Sebességben sincsen semmi különbség két byte összeadása illetve két integer összeadása között. (Nem mintha ez bármit számítana)
De ezekkel egyelőre nincs értelme foglalkoznod.
-
Tomi_78
aktív tag
válasz
joysefke #10090 üzenetére
S valóban. Hát, erre bizony nem gondoltam volna sosem, hogy egy konkrét szám maga is lehet valamilyen típusú. De köszönöm szépen a segítséget; az int típusra állítás tényleg megoldotta.
Amúgy csupán memóriatakarékossági okból lett volna szükségem a byte típusra, mert az id és idk nem lett volna több a programban, mint 255. -
Tomi_78
aktív tag
Na, ez vajon miért van?
Van egy saját osztály a programomban, a JatekElemei. Ebben egy public byte típusú, id nevű változó.
Aztán adott egy idk nevű, 0 kezdőértékű globális változó a program elején:
public partial class MainForm : Form
{
byte idk=0;És amikor létrehozom a JatekElemei egy példányát:
var egyarc = new JatekElemei();
(...)
egyarc.id=idk+1;
idk+=1;a következő hibaüzenet "örvendeztet meg" az egyarc.id=idk+1; sorral kapcsolatban:
"A(z) „int” típus nem konvertálható implicit módon „byte” típusra. Van explicit konverzió (esetleg hiányzik egy típuskonverzió). (CS0266)"Kérdésem: hol van itt az int típus, mikor mindkettőt byte-ként adtam meg?
-
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. -
joysefke
veterán
válasz
Alexios #10086 üzenetére
Magyarázhatsz neki. Ha elolvas valamit, azt nem azért teszi, hogy a hasznos tudását növelje, hanem muníciót gyűjt a következő hónapok kötekedéséhez, ahol a "profi programozókat" (az ő szava járása) szapulja akik valami fontosnak vélt dolgot nem jól tudnak.
Ha az elmúlt éveket nem trollkodással töltötte volna, akkor akár "profi programozó" programozó is lehetne ami nyilván mindig is lenni akart. -
Alexios
veterán
válasz
pmonitor #10083 üzenetére
A fő probléma azzal van hogy a referencia típus fogalmát kevered az object-el.
Pusztán az hogy az értéktípusok is az object-ből származnak végső soron(nem nehéz amúgy ezt belátni, nem véletlen ignoráltad gondolom a kód példámat is, de ugyanúgy elérhető minden metódus egy int-en is ami egy objectben van, csak hogy még szemléletesebb legyen, ha már a language specet teljesen ignorálod), nem jelenti azt hogy ettől a heap-ben vannak tárolva. Pont ez a System.ValueType lényege, ennek köszönhetően vannak értéktípusként kezelve. Tehát az hogy a System.ValueType-ból származik, nem jelenti hogy ez egy referencia típus, hiszen pont a System.ValueType miatt lesz értéktípus, de ettől az még az objectből származik. Ha pl. egy intet objectként kezelsz akkor jön a boxing, hiszen referencia típusként akarod kezelni(itt is látszik hogy az object az ősosztályuk amúgy, hiszen simán átadhatsz egy intet mondjuk egy metódusnak ami objectet vár, mindenféle compiler error).
Kicsit olyan ez inkább mintha egy ősosztályán át hivatkoznál egy példányra, ott sem érheted el a metódus/propertyk stb amik a leszármazott osztályban vannak, érték típusoknál meg ha objectként hivatkozol rá akkor jön a boxing, és "elveszted" a leszármazott érték típus tulajdonságokat.(ez csak egy analógia, nem a pontos mechanizmus a kötekvést elkerülendő) -
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... -
Alexios
veterán
válasz
pmonitor #10080 üzenetére
Biztos ezért zártak ki
Már linkeltem amúgy neked a hivatalos language specet persze leírtad hogy ők sem tudják miről van szó [link] All struct types implicitly inherit from the classSystem.ValueType
, which, in turn, inherits from classobject
.
Tudom hogy úgysem hiszed el, de azért 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);
-
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. -
joysefke
veterán
válasz
Tomi_78 #10078 üzenetére
Valami alapozó könyvet kellene olvasnod, hogy helyére kerüljenek a dolgok.
A "new" utasítással példányosítottál egy osztályt, az objektum a (heap) memóriában jött létre, 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. A referencián keresztül tudod elérni és használni a heapen lévő objektumodat.A var -ral deklarált változód típusa már kódszerkesztési időben ismert a fejlesztőkörnyezet számára. Ha a fejlesztőkörnyezet nem tudja a típust eldönteni, akkor be fogja azt a kódrészt pirosítani.
A var csak arra van, hogy neked kényelmesebb legyen, ne kelljen a hosszú típusnevet kiírni, illetve refaktorálásnál is előnyös lehet.var myObject = new MyClass(); esetén a myObject típusa "MyClass típusú referencia";
-
Alexios
veterán
válasz
Tomi_78 #10076 üzenetére
Fordítsuk meg a kérdést és gondold át mit kéne csináljon a program akkor ha olyan ágba kerülsz ahol nem inicializálod majd később hivatkozol rá. Vagy adsz egy default értéket (pl az if/switch blokkok előtt, int valtozo =1; ), vagy minden lehetséges úton inicializálni kell ha később hivatkozol rá.
Az utóbbinál amúgy az a baja hogy ha var-t használsz akkor egyből inicializálni kell, mert a compiler nem tudja hogy mi az. A switchen belül pl az egyik ágban számot, másikban szöveget adnál neki, honnan tudja melyik a helyes? Ez egy erősen típusos nyelv, nem lehet egy változó egyszerre több típus, tehát vagy megmondod az elején hogy milyen típus lesz és később is tudod inicializálni, vagy használod a var kulcsszot és egyből értéket adsz neki hogy tudja milyen típus kell legyen.
-
Tomi_78
aktív tag
Hát igen, furcsa egy kicsit nekem a változókezelés, de azért csak kapisgálom, hogy C#-ban a blokkon vagy névtéren belül létrehozott változók csak ott érvényesek.
De pl. az miért van, hogy ha megadok egy változót és ugyanazt if feltétel elágazásaiban használnám fel, akkor rendellenesen viselkedik tőle a programom?
Akkor ezt így nem lehet?
int valtozo;
if (...) {
valtozo = ...;
(...)
}
(... még pár ugyanilyen if ág ...)
if (...) {
valtozo = ...;
(...)
}
Tehát minden ághoz külön változónevet adjak meg? Ez kissé pazarlónak tűnik a változónevekkel.
És ugyanezt tapasztaltam switch elágazásnál is:
var valtozo;
switch (...) {
case 0: valtozo = ...;
break;
case 1: valtozo = ...;
break;
}
Hibaüzenet ez utóbbinál: Az implicit típusmeghatározású lokális változókat inicializálni kell. -
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.
-
Tomi_78
aktív tag
Tanácsaitok alapján végül így hibaüzenetek nélkül működni kezdett a programom:
int[,] palya = null;
switch (mostpalya) {
case 1:
palya = new int[,]{{0,0,0,0,0,0,0,0,0,0},
Akkor ezek szerint az első és legfőbb deklarálási helyen már értéket kell adni neki, még ha ez null is, illetve az utána következő, értékekkel történő feltöltés helyén használni kell a new int[,]-et? -
Alexios
veterán
válasz
Tomi_78 #10070 üzenetére
másold be az egész releváns kódrészletet, pusztán hibaüzenetből nehéz látni mi a gond
De ennek így jónak kéne lennie:
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;
}
-
Tomi_78
aktív tag
válasz
joysefke #10069 üzenetére
Sajnos nem, mert azt írja ki, hogy:
Inicializálatlan „palya” lokális változó használata (CS0165)Pedig egyszer már deklarálva van, csak éppen a switch() névtéren kívül, az előtt.
De nekem az kéne, hogy deklarálom egyszer a MainFormLoad() elején, és azon belül felhasználható legyen akármilyen belső szerkezetben. -
Tomi_78
aktív tag
Még egy kérdés: ha egy 2d tömböt deklarálok, de később, más névtéren belül inicializálnám, azt hogyan kell megtenni? Mert ez most hibás; azt írja, hogy: "Itt azonosítónak kellene szerepelnie."
void MainFormLoad(object sender, EventArgs e)
{
int[,] palya;
switch (mostpalya) {
case 1:
palya[,] = {{0,0,0,0,0,0,0,0,0,0},//Ennél írja a hibát!
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,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;
}}
-
Tomi_78
aktív tag
Értem már.
És arra van mód, hogy lekérdezzem a menüsor magasságméretét (ami most nálam 24 képpont, de ezt is az egér Y helyzetéből tudtam kikövetkeztetni)? Mert most a WorkingArea teteje (Top) 0-nál van, de mindig beleszámítja a fenti menüsort is, ami nekem nem kell.
Vagy csakis az a megoldás, hogy eltüntetek mindenféle menüsort aFormBorderStyle = FormBorderStyle.None
paranccsal? -
dqdb
nagyúr
válasz
Tomi_78 #10062 üzenetére
Nem kell itt próbálkozni, ott van a
Screen.PrimaryScreen.WorkingArea
, azt kell beállítani az ablak pozíciójának, ha az első képernyőd akarod megjeleníteni, és ekkor a tálca nélküli teljes képernyőméretet kihasználod.A te megoldásod elvi szinten bukik el, mert az, hogy a tálca teteje, az esetek egy részében értelmezhető fogalom csak. A tálcát lehet balra, jobbra és felülre dokkolni, emellett el lehet rejteni automatikusan, több monitornál simán lehet, hogy csak az elsődleges monitoron van tálca, a többin nem, stb.
Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)
Egyszerűsítsük kicsit a képletet:Screen.PrimaryScreen.WorkingArea.Height - (Screen.PrimaryScreen.WorkingArea.Height - ClientSize.Height) =
Screen.PrimaryScreen.WorkingArea.Height - Screen.PrimaryScreen.WorkingArea.Height + ClientSize.Height =
ClientSize.Height
Ez csak abban az esetben adja meg a tálca tetejének helyét, ha
1. a Windowsban a tálca alulra van beállítva
2. az ablak maximalizálva van
3. az ablaknál aFormBorderStyle = FormBorderStyle.None
van beállítva és nincsen menü -
Tomi_78
aktív tag
És az miért van, hogy így számítom ki az értékeket:
kepernyomag=Screen.PrimaryScreen.Bounds.Height;
talcamag=kepernyomag-Screen.PrimaryScreen.WorkingArea.Height;
cimsormag=Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height;
és ha a MainFormPaint-ben a DrawString-gel kiíratom, akkor kb. 40-nel eltérnek az értékek egymástól, ha a DrawString-ben a fenti változók szerepelnek attól, mintha változók helyett a konkrét számítást tenném be, ToString()-gel a végén?
Tehát a DrawString(kepernyomag+"-"+talcamag...)
nem ugyanazt adja, mint a
DrawString(Screen.PrimaryScreen.Bounds.Height.ToString()...
stb. -
Tomi_78
aktív tag
Köszönöm a választ, Dqdb!
Ez alapján elindulva a Tálca tetejét a következő kóddarabbal találtam meg (remélhetőleg):Screen.PrimaryScreen.WorkingArea.Height-(Screen.PrimaryScreen.WorkingArea.Height-ClientSize.Height)
Remélem, ez különféle felbontások és méretezések esetén is megfelelően működik majd, de ezt csak próbálgatások után tudom megállapítani. -
dqdb
nagyúr
válasz
Tomi_78 #10060 üzenetére
1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
Mert Windowsban 125%-ra állítottad a scalinget, az alkalmazásod pedig nem jelzi, hogy high DPI támogatással bír, így a Windows a tényleges helyett a scalinggel korrigált virtuális értéket adja át neked2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket?
A felső menüsor, az ablakfejléc és a keret az alkalmazás saját felségterülete, azzal azt kezd, amit akar, azok az ablakméreten belül vannak. A tálca nélküli téglalapot aScreen.WorkingArea
propertyben találod.Egy ablak két része szedhető szét: client area, ami a hasznos felülete (a lenti képen pirossal jelezve) és a non-client area, ahová a körítés (fejléc, menü, keret) kerülnek. A hasznos területet a Control.ClientRectangle propertyvel tudod lekérdezni, ez azt a téglalapot adja vissza, ami az ablakod szabadon használható területe.
Érdemes megjegyezni, hogy több monitor esetében mind a DPI, mind a tálca mérete, mind a rendelkezésre álló terület eltérhet, és az alkalmazásodat monitorok között dobálva ez indítás után bármikor bekövetkezhet, szóval érdemes a változásokról érkező eseményeket lekezelni.
-
Tomi_78
aktív tag
Sziasztok!
Kis programomat teljes képernyős módban futtatom az alábbi kóddarab segítségével:
InitializeComponent();
Viszont lent a Windows 10 tálcája belóg a programablakba, így van úgy, hogy a grafikai elemeket is takarja, ha éppen oda helyeződnek. Kerestem a Google-lal arra, hogy hogyan lehetne eltüntetni a Tálcát C#-ban, de nem találtam semmit ezzel kapcsolatban. Aztán most próbálom megnézni, hogy mennyi a képernyőfelbontás magassága, hogy abból kivonva valami értéket megkapjam a Tálca nélküli részt, de nem találok ilyen felbontásérték visszaadó függvényt, utasítást.
WindowState = FormWindowState.Maximized;
Size=new Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height);
Az is érdekes, hogy a Windows-ban megnézve a képernyőfelbontást, az 1920*1080, tehát 1080 képpont a magasság, viszont a C#-ot sehogysem bírom rávenni ezen érték kiírására, mert mindig 864-et mutat valamiért, mikor az egér Y koordinátáját kérdezem le, és a képernyő alján van, vagy így:e.Graphics.DrawString("Egér Yhely: "+Cursor.Position.Y+"-"+Screen.PrimaryScreen.Bounds.Height.ToString(),this.Font,new SolidBrush(Color.Black),2,2);
Valaki el tudná magyarázni nekem erre a megoldást? Tehát:
1. Miért 864 képpont nálam C#-ban a képernyőmagasság 1080 helyett?
2. Hogyan kaphatom meg csak a hasznos területet a képernyőből, tehát a Tálca és a felső menüsor magassága nélküli értéket? -
Tomi_78
aktív tag
Sziasztok!
Egyedi képeket már tudok kezelni (betölteni és megjeleníteni) a C#-pal, de jó volna tudnom kezelni képcsíkokat.
Van erre lehetőség és ha igen, hogyan, milyen utasítás alkalmas arra, hogy egy nagy képből kinyerjem annak alképeit és hozzárendeljem egy bitmap-hoz? -
Tomi_78
aktív tag
Úgy látszik, a WindowState nem állítja át az ablak Width és Height értékeit - legalábbis ha ezt a kódot alkalmazom és kiíratom az ablszel és ablmag változók értékeit, azok még mindig a 800*600-at mutatják, amik az InitializeComponent()-ben is be vannak állítva:
InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);
ablszel=Size.Width;
ablmag=Size.Height; -
-
Tomi_78
aktív tag
És az miért van, hogy ha én maximumra állítom a játéktér ablakméretét, akkor induláskor a játékelemek az eredeti, 800*600-as beállításhoz alkalmazzák a koordinátáikat?
Tehát az alábbi kód beállítja ugyan a képernyő kitöltésére a pályát, de ha pl. az a_jatekos példány lekérdezi magának induláskor a Width és Height koordinátákat, azok mintha még mindig 800 és 600 lennének, holott nálam 1600*900-nak kellene lenniük (kiírva is annyi), de mégis a közép elhelyezés helyett balra fel kerül a játékelem:InitializeComponent();
WindowState = FormWindowState.Maximized;
Size = new Size(Width,Height);a_jatekos = new Jatekos();
a_jatekos.kepe = jaturhajokepe1;
a_jatekos.xhely = Width/2+a_jatekos.kepe.Width;
a_jatekos.yhely = Height-a_jatekos.kepe.Height*2; -
pmonitor
aktív tag
-
pmonitor
aktív tag
-
Alexios
veterán
válasz
pmonitor #10049 üzenetére
Akkor még egyszer utoljára leírom.
Az állítás nem az volt hogy mindegy melyiket használod _bármelyik_ esetben, hanem hogy _ebben_ az esetben mindegy volt, hiszen ezek ciklusok, nem típusokon lehet végigmenni velük, hanem gyűjteményeken. Az eredeti kérdező kérdése az volt hogy mire jó a foreach, továbbra is fenntartom, hogy az ő esetében az lett volna a lényeg hogy gyűjteményt csináljnon és menjen rajta végig(ahogy végülis meg is csinálta), ezt pedig bármivel megcsinálhatta, foreach/for/while _ebben_ az esetben mindegy, hiszen a gond nem a foreach-el magával volt hanem hogy amit ő szeretett volna abban a formában nem lehet.
Azt hogy mit lehet módosítani közben, vagy törölni, csak te hoztad ide, senki más nem vitatta, hiszen az állítás nem az volt hogy foreachben az aktuális itemet nem lehet megváltoztatni, hanem hogy az hogy pl. foreach(string a string) miért nem értelmes.while() és a for() egyébként csak megerőszakolva működik minden enumeratoron(de nyilván nem erre tervezték.
Ez egy teljesen mellékszál, de ez nem megerőszakolás, és annyira erre tervezték hogy a foreach egy syntactic sugar ahogy fatal is írta, azaz valójában build után ez while-al fog menni az enumeratoron. Ettől függetlenül te, én, stb, mint végfelhasználó nem így fogjuk írni, hiszen nyilván azért hozták létre a syntactic sugar-t hogy használjuk, de ettől még nem árt tisztában lenni a működésével, és azzal hogy ez nem megerőszakolás.
Illetve a mindegy nem mindegy részhez annyit, hogy _mindent_ amit foreach-el meg lehet írni, meg lehet for vagy while ciklussal(hiszen a foreach is egy fancy while ciklus), de fordítva ez már nem igaz, szóval fölösleges újabb példákat hozni rá, mert senki nem vitatja ezt.+1 a linkedről:
c#-ban mindennek van egy közös szülőtípusa, úgy hívják object
Most ha attól eltekintünk hogy tök nyilvánvaló kötekvés ha azt nézzük az eredeti kérdező kérdésének mi volt a lényege, ha jól értem erre a cáfolatod a struct akar lenni [link] itt a hivatalos msdn c# language spec doksi, ez egyértelműen írja hogy All struct types implicitly inherit from the classSystem.ValueType
, which, in turn, inherits from classobject
Tehát minden struct implicit a System.ValueType-ból származik, az pedig az objectből. Ettől még nyilván van lényegi különbség a value és reference típusok között, nem kell cáfolaltot felhozni, ha ez nem tetszik a Microsoft-al vitatkozz, ők tervezték a nyelvet, és ez az ő reference dokumentumuk. -
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!
-
Alexios
veterán
válasz
Tomi_78 #10047 üzenetére
Jó lesz így már, nyilván kód szervezésre nem feltétlenül ez a legjobb, vagy nevezéktanra, de ha működik akkor működik. A lényeg az hogy valahogy nyilván kell tartanod ha valami konkrétan akarsz végigiterálni, aztán erre vannak különböző módok még, de kezdésnek elég lesz szerintem ez neked.
#10046 fatal` : Hagyd, átment a saját blogjára továbbra is csak a lényegi mondandót kiforgatva olyanokról vitatkozni amit senki nem mondott
-
Tomi_78
aktív tag
válasz
Tomi_78 #10024 üzenetére
Tanácsaitok alapján végül egy List használatával oldottam meg a problémát, mégpedig így:
class JatekElemei
{
public int xhely,yhely;
}
List<JatekElemei> jatelemeilista = new List<JatekElemei>();
class Jatekos: JatekElemei
{
public Bitmap kepe;
public byte animidozito=5,lovesvsz;
};Jatekos a_jatekos;
class JatLovedekei: JatekElemei
{
public Bitmap kepe;
};
List<JatLovedekei> jatlovlista = new List<JatLovedekei>();
class Deneverek: JatekElemei
{
public int dirx,diry;
public Bitmap kepe;
public byte animidozito=5;
}List<Deneverek> deneverlista = new List<Deneverek>();
Aztán minden példányt a létrehozásakor beleteszek ebbe a jatelemeilista listába, pl.:
a_jatekos = new Jatekos();
(...)
jatelemeilista.Add(a_jatekos);S most már mehet rajta a foreach ciklus:
foreach (var jatelem in jatelemeilista) {
jatelem.xhely=...
}
Nekem jónak tűnik így, de ha láttok benne valami hibát, írjátok meg okvetlenül. -
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ó...
-
Alexios
veterán
válasz
pmonitor #10043 üzenetére
Nincs olyan amin foreach-el végig lehet menni, de while-al nem, fentebb mutattam is példát miért van ez így(mert pl. a foreach is egy while-ra fordul), a hashset sem kivétel ezalól(for-al is meg lehet természetesen csinálni, nem muszáj indexel elérni elemeket for cikluson belül is, mégha nem is célszerű). Az más kérdés persze megint, hogy magaddal vitatkozol.
-
Alexios
veterán
válasz
pmonitor #10039 üzenetére
Nézd már meg az eredeti kérdést, nem volt benne .Count, pont erről beszéltem hogy az nem egy gyűjtemény, hanem egy típus. A JatekElemei nem egy lista, tömb, akármi más volt, hanem egy osztály típus, max statikus countja lehetne technikailag, ami nincs. Ahogy ez is volt a kérdés hogy miért nem lehet végig menni foreachel rajta, és azért mert nem egy gyűjtemény. Ugyanúgy for és while-al se lehet vegigmenni rajta, mert nem egy gyűjtemény, de még csak nem is egy peldanyositott akármi
-
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).... -
Alexios
veterán
válasz
pmonitor #10037 üzenetére
De tökmindegy, hiszen arról volt szó hogy az esetben _mindegy_ melyikkel iterálna végig rajta, egy gyűjteményen(vagy enumeratoron, mielőtt ebbe köt valaki) kell és nem egy típuson. Ebből a szempontból teljsen mindegy hogy for, while, foreach, mert a kérdés nem ez volt, hanem az hogy lehetséges-e ilyen:
foreach(tipus objnev tipus){}
ami ugye nem. Ilyen szempontból tökmindegy, mert ilyet sem lehet hogy while(tipus) meg olyat sem hogy for(tipus), mert értelmezhetetlen ebbe a formában, hiszen ez nem egy gyűjtemény. Az állítás nem az volt hogy mindig mindegy melyiket használod, hanem ebben az esetben az. -
Alexios
veterán
válasz
pmonitor #10035 üzenetére
Ha el is olvasod az egész mondatot amit írtam beszéljünk.
Ha már nagyon kötekvés akkor meg lehet nézni mit is csinál egy foreach:int number;
while (enumerator.MoveNext()) { number = enumerator.Current; }
Innen tök érthető hogy miért nem lehet megváltoztatni, csak hát sosem mondtam hogy meg lehet, sőt, teljesen másról beszéltem.
-
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?
-
Alexios
veterán
válasz
pmonitor #10030 üzenetére
Most nem teljesen értem ebből a szempontból a kötekvést, be lehet hozni persze értéktípusokat, akkor 98%-ban minden az objectből jön, a lényeg hogy nem kell csinálni egy őstípust csak azért hogy legyen egy őstípus.
Nem tök mind1. Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
Ezt pláne nem értem, ha az egész mondatot olvasod és nem csak a részét kiragadva, akkor úgy folytatódik hogy mindegy mert gyűjteményeken mennek végig. Persze most bele lehet menni iterátorokba, stb, meg abba hogy ez se teljesen igaz így, hiszen ha valami yield return-el adja a cuccokat az biztos gyűjtemény-e, de emberünk nem tudja min lehet egy ciklussal végigmenni, nem gondolnám hogy ez itt releváns.Mert pl. foreach esetén nem módosíthatod magát az objektumot. Csak az objektum.akármi-t.
Ha már ennyire kötekedni akarunk, a gyűjteményt nem tudod módosítani, pont azért mert egy enumerátoron megy a foreach -
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.
-
Alexios
veterán
válasz
Tomi_78 #10027 üzenetére
Tehát ha mindennek van egy közös szülőobjektuma
Amúgy c#-ban mindennek van egy közös szülőtípusa, úgy hívják objectAkkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett?
Igen. Foreachel, de igazából, while, for, tökmindegy mivel gyűjteményeken iterálsz végig, nem típuson.
lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle.
De valakinek csak gondoskodni kell róla nem? Vagy nem teljesen értem az elképzelésed, honnan tudja az alkalmazás hogy min akarsz végigmenni, mi legyen benne vagy nem? Az hogy van egy szülőtípus az nem azt jelenti hogy ő tisztában van minden leszármazott példányáról, ez csak a típus meghatározásban segít neked.
#10026 quailstorm : igen, én is írtam hogy reflectionnel meg lehet csinálni, csak 90%-ban ha felmerül hogy reflectionnel menne, az egy rossz gondolat
Kezdőknél pedig 100%-ban rossz gondolat, kizárt hogy egy kezdőnek bármilyen szempontból _tényleg_ szüksége legyen rá.
-
quailstorm
félisten
válasz
Tomi_78 #10027 üzenetére
Az osztály egy absztrakt fogalom, egy memóriaértelmezési térkép. Abból először példányokat kellene létrehozni hogy legyen mit foreachelni. A foreach nem típusokon tud iterálni hanem típuspéldányok felsorolásán.
Az általad említett könyvben benne van a C# és úgy egyáltalán a programozás elméleti alapjának összefoglalása, de nem a legérthetőbb és néhol pongyola. Inkább menj át a Ruzsinszki könyvön és utána csak a konkrét játékprogramozós részekkel folytasd.
-
Tomi_78
aktív tag
Quailstorm: Ron Penton: Kezdő C# játékprogramozás c. könyvéből tanulom most az alapokat, valamint a világhálóról böngészgetve.
Alexios: azt, hogy egy fő osztályból származik minden más osztály, azért csináltam, hogy megkönnyítsem a dolgom olyan esetekre, amikor a program összes elemén végig kell menni, pl. mentés esetére vagy ha az ablak átméretezésekor mindent új helyre kell rakni.
Tehát ha mindennek van egy közös szülőobjektuma, akkor elvileg elég lenne ezen végigmenni az eredmény eléréséhez. Azt gondoltam, ehhez elég egy foreach ciklus, bár azt is, hogy az nem lesz jó, hogy a JatekElemei kétszer szerepel benne, mert nem tudom, hogy osztályokat milyen változótípusként kell megadni - már ha egyáltalán lehet.
Akkor hozzak létre egy Listát is, amelybe belekerülnek az osztályobjektumok, és ennek a Listának a nevét adjam meg a foreach-ben az egyik JatekElemei helyett? Akkor így már lassanként elvész az egyszerűség, mert ezesetben ugyanúgy gondoskodni kell a Lista kezeléséről, amikor elemeket adok hozzá vagy törlök belőle. -
quailstorm
félisten
válasz
Tomi_78 #10024 üzenetére
Mi alapján tanulsz? Eddigi kommentjeidből úgy néz ki, hogy nem vagy birtokában stabil tudásnak, nem érted a fogalmakat és eszközöket amiket próbálsz használni, csak másolsz és csavarsz rajta valamit.
Mielőtt nekiállsz egy grafikus játéknak, legalább egy programozás könyvön rágd át magad.#10025 Alexios: amúgy ki lehet gyűjteni reflectionnel egy assemblyben egy adott típus összes implementációját. Pl. arra jó, hogy a tesztpluginunkba így elég egy új osztályt behajítani és a lefordított plugin már ki is teszi az új osztályt a UI-ra mint választható test scenario.
-
Alexios
veterán
válasz
Tomi_78 #10024 üzenetére
Min akarsz végig iterálni?
foreach (JatekElemei jatelem in JatekElemei) {itt a foreach ugye maga a ciklus. Ezek után a zárójelen belül először jön a típusa az adatoknak ami esetedben JatekElemei lenne(amúgy használhatsz var-t is ha nem akarod kiírni, de itt most pont jól látszik) aztán a ciklusváltozónév amit adsz az adott elemnek, majd magát a listát amin végig akarsz iterálni. Viszont te az objektum típusát adtad meg és nem egy listát/tömböt/valamit amin végig lehet menni.
Mivel egy gyűjteményed van az egészben, és az is más típusú, ezért ha tippelnem kéne nem erre akarod használni, viszont kicsit zavaros számomra hogy mit szeretnél akkor.
Ha a kérdésed az hogy az összes JatekElemei típusú objektumodat szeretnéd frissíteni, akkor ezeket valahol trackelned kéne és azon végigiterálni(vagy technikailag reflectionnel is meg lehet valószínűleg csinálni, de ne tedd), de ebben a kódrészletben az se világos igazából hol hozod létre azokat amiket frissíteni szeretnél itt
van egy fő osztály, amelyből minden más osztály származik a programban
Már ez a kiindulási pont is rosszul hangzik amúgy hogy miért akarsz ilyet csinálni, biztos erre van-e szükséged -
Tomi_78
aktív tag
Még egy kérdés a tisztelt szakértőkhöz: van rá valamilyen mód C#-ban, hogy egyszerűen végigmenjek egy osztály tagjain? Mert most én kezdőként úgy próbálkoztam, hogy van egy fő osztály, amelyből minden más osztály származik a programban és foreach ciklussal próbálkozom elérni a tagokat - sikertelenül.
Tehát ez a mostani kódom:class JatekElemei
{
public int xhely,yhely;
}
class Jatekos: JatekElemei
{
public Bitmap kepe;
public byte animidozito=5,lovesvsz; //alképváltó és lövésvisszaszámláló
};
class JatLovedekei: JatekElemei
{
public Bitmap kepe;
};
List<JatLovedekei> jatlovlista = new List<JatLovedekei>();
byte jatlovdb = 0;
class Deneverek: JatekElemei
{
public int dirx,diry;
public Bitmap kepe;
public byte animidozito=5;
};
És így próbálok végigmenni rajtuk az ablak átméretezésekor:
{
foreach (JatekElemei jatelem in JatekElemei) {
jatelem.xhely*=Width/ablakszel;
jatelem.yhely*=Height/ablakmag;
}
ablakszel=Width;
ablakmag=Height;
}Erre kapom ezt a hibaüzenetet:
A(z) „Animacios.MainForm.JatekElemei” egy „típus” konstruktor, de „változó” konstruktorként használva. (CS0118)Most akkor mi hogyan van ebben a foreach-ben? Vagy ez nem is jó erre?
Azért lenne jó valami hasonló megoldást találni, hogy amikor szükséges végigmenni valamiért a program összes elemén, el lehessen azt intézni egy ciklussal.
-
Tomi_78
aktív tag
Köszönöm mindhármótok segítségét!
A List használatával sikerült működésre bírnom a programot:
List<Deneverek> deneverlista = new List<Deneverek>(); -
-
Tomi_78
aktív tag
Sziasztok!
Arraylist-et hogy kell használni arra, hogy osztályokat teszek bele és törlöm őket? Van néhány ilyen objektumom, amiket így hozok létre:
public partial class MainForm : Form
{
Bitmap deneverkepe1 = new Bitmap("kepei\\kisdenever1bmp.bmp");
Bitmap deneverkepe2 = new Bitmap("kepei\\kisdenever2bmp.bmp");
class Deneverek
{
public int dirx,diry,xhely,yhely;
public Bitmap kepe;
};
Deneverek egydenever;
System.Collections.ArrayList deneverlista = new System.Collections.ArrayList();
public MainForm()
{
for (int i=0; i<3; i++) {
egydenever = new Deneverek();
svsz = vsz.Next(1);
if (svsz==0) {
egydenever.dirx = -1;
} else {
egydenever.dirx = 1;
};
svsz = vsz.Next(1);
if (svsz==0) {
egydenever.diry = -1;
} else {
egydenever.diry = 1;
};
svsz = vsz.Next(1);
if (svsz==0) {
egydenever.kepe = deneverkepe1;
} else {
egydenever.kepe = deneverkepe2;
};
egydenever.xhely=vsz.Next(1,Width-egydenever.kepe.Width);
egydenever.yhely=vsz.Next(1,Height-egydenever.kepe.Height);
deneverlista.Add(egydenever);
};
Eddig rendben is van (remélhetőleg), de ha pl. már ki akarom rajzolni őket így:void MainFormPaint(object sender, PaintEventArgs e)
{
for (int i=0; i<3; i++) {
var denever = deneverlista[i];
e.Graphics.DrawImage(denever.kepe,denever.xhely,denever.yhely,denever.kepe.Width,denever.kepe.Height);
};
}
akkor hibaüzenetet kapok, hogy "„object” nem tartalmazza a(z) „dirx” metódus definícióját, és nem található olyan „dirx” kiterjesztésmetódus, amely „object” típusú első argumentumot fogad el (esetleg hiányzik egy „using” direktíva vagy egy szerelvényre mutató hivatkozás). (CS1061)"
és ugyanez a többi változójára is.
Azt szeretném, hogy legyenek ilyen képi objektumok a programomban, amikből később el is távolíthatok. Eredetileg sima tömbbel próbálkoztam, de azok tartalmát nem lehet megváltoztatni. -
Szancsó
aktív tag
Aaazigen. Valóban nagyon rég koptattam az iskolapadot, nem igazán rémlett ilyesmi.
Normál "hu-HU" esetén ok is lenne, a "hu-HU_technl" -nél azért el bírtam volna viselni, ha figyel az ékezetre, de ezek szerint jogos: az a 16. pontnak megfelelő spéci rendezés lenne. ("mind a magyar, mind az idegen többjegyű betűknek minden egyes eleme külön, önálló egységnek számít, és a besorolás nincs tekintettel sem a magyar ékezetekre, sem az idegen betűk mellékjeleire")
Na szép, akkor tanulhatom a magyart, plusz lehet átverekedni ügyfél oldalra a dolgotKöszönöm!
-
vlevi
nagyúr
válasz
Szancsó #10012 üzenetére
Ennél szebb, amikor azt kérdezed tőle, hogy
string szo = "NY";
if szo.Contains("Y") {
...
}
És nem megy be az if-be, te meg lesel, mint vak a moziban, aztán rájössz, hogy az alapértelmezett culture info magyar, ezért az nem egy N és egy Y betű, hanem Ny, és abban nincs külön Y
-
dqdb
nagyúr
válasz
Szancsó #10012 üzenetére
Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom.
Nem elfelejtett, hanem megtanult.Itt tudsz kísérletezni, kifejtés itt.
A betűrendbe sorolás
14. c) A magánhangzók rövid-hosszú párjait jelölő betűk (a – á, e – é, i – í, o – ó, ö – ő, u – ú, ü – ű) betűrendbe soroláskor a kialakult szokás szerint mind a szavak elején, mind pedig a szavak belsejében azonos értékűnek számítanak. A hosszú magánhangzót tartalmazó szó tehát meg is előzheti a megfelelő rövid magánhangzót tartalmazót, például:
ír Irán író
Irak írandó iroda
iram iránt iróniaA rövid magánhangzós szó kerül viszont előbbre olyankor, ha a két szó betűsora csak a megfelelő magánhangzók hosszúságában különbözik, például:
Eger kerek szel
egér kerék szél
egyfelé keres szeles
egyféle kérés széles
elöl (hol?) koros szüret
elől (honnan?) kóros szűret -
Szancsó
aktív tag
El is felejtettem, hogy lehet kérdezni
Nem tudom más belefutott-e, de egyszerű rendezéses gondom lenne: a magyar ABC szerint Framework alatt még ment a rendezés, de Core óta nem, és most .Net 6 / 8 alatt sem.
Külsős komponenscsomagról van szó, de egyszerűen szimulálható is:var comp = System.StringComparer.Create(CultureInfo.GetCultureInfo("hu-HU_technl"), false);
var strings = new string[] { "brummm", "ábránd", "üveg", "űr", "út", "undok", "asd", "ásd", "álm", "alm" };
Console.WriteLine(string.Join(", ", strings.OrderBy(item => item, comp)));
Az elvárt: "alm, asd, ábránd, álm, ásd, brummm, undok, út, üveg, űr"Úgy tűnik, mintha a magyarhoz tartozó comparer elfelejtett volna magyarul, vagy nem tudom. Erre van valami egyszerű megoldás? (Egyelőre írtam sajátot és azt kapja a control, de nem hiszem el, egy egy beépített gyári cucc így elromlott.)
-
petyus_
senior tag
Én a helyedben egyelőre maradnék a 6-nál, novemberben úgyis lejár a support, tehát legkésőbb akkor illene frissíteni. Közben meg előfordulhat, hogy belefutsz valamibe, ahol breaking change volt 7/8 alatt, és onnantól amúgy sem tudnál továbbmenni mindhárommal egyszerre.
martonx: nem pontosan értem mire gondolsz, milyen issue-t csináljon, mert ez nem bug, hanem az elvárt működés. A multi-target nem arra való, hogy webapp-ot futtass több környezeten, inkább library-knél jó, hogy több frameworkkel is kompatibilis legyen (nyilván ilyenkor is figyelni kell a breaking changekre, és egy idő után lesz pár #if NET6_0, stb).
-
martonx
veterán
A megfelelő github action dokumentációját kellene átnézd. Ennyiből amit küldtél még az se derül ki, hogy ez App Service vagy egy virtuális gép, vagy Azure function, vagy egy docker image. Szóval amelyik lépésnél dobódik ez a hiba, annak az actionnek a doksiját nézd át, github issue-jait, hátha meg lesz a megoldás.
Ha nem lesz meg, akkor pedig érdemes indítanod github issue-t nekik. -
Keem1
veterán
válasz
petyus_ #10007 üzenetére
De-de, jó, igazából most is .net 6-ot használok, csak mivel a webapp jelenleg teljesen kompatibilis mindhárom jelenlegi verzióval, gondoltam, kicsit tervezek a jövőre is, így pl. windowson lebuildelem mindhármat, hátha valami inkompatibilitás állna elő. De jelenleg csak pár warning csúfítja az outputot. Azure-on is 6.0-n fut, pont azért, mert a legrégebbi a linux jelenleg. És mivel a VPS ownere nem én vagyok, nem sok befolyásom van a dotnet upgrade-re (lassú lenne a folyamat, ha ráállnék).
-
petyus_
senior tag
-
Keem1
veterán
Srácok, ASP.Net Core (.Net 6.0), Azure deploy Githubról.
Ez az error:
The current .NET SDK does not support targeting .NET 7.0. Either target .NET 6.0 or lower, or use a version of the .NET SDK that supports .NET 7.0.A csprojban ez van: <TargetFrameworks>net6.0;net7.0;net8.0</TargetFrameworks>
Az Azure web app runtime stack-je .Net 6.0
Ha a fenti multi FW-t kicserélem erre: <TargetFramework>net6.0</TargetFramework>, akkor működik a deploy (természetesen ha végigzongorázom 6-tól 8-ig, ugyanez, single FW ok, multi FW failure).
Ha windowson, linuxon buildelek, akkor az összes FW verzióval megy.Hogy tudom rábírni az Azure-ra hogy a neki tetszőt válassza ki, a többit hagyja figyelmen kívül?
Szerk: sajnos kell a multi FW, mert fut windowson, tesztelek Azure-on és megy egy linux szerveren is, ahol sajnos csak .NET 6.0 van. Külön fejleszteni nem akarok, mert tuti egyszer elfelejtek vmit, így meg githubról automatikusa deployódik. És a kód fordul/fut mindhárom verzión
-
-
rgeorge
addikt
Üdvözlet! Van egy .NET Framework 4.5 32 bites projekt (Visual Studio 2012), amiből az egyik assembly-nek a nevét sikerült magyarul megadni, azaz hosszú ékezetes betűket is tartalmaz.
Egy hónapja ez az alkalmazás nem indul el bizonyos eszközökön, ahol előtte igen. A program egyszerűen nem indul el, pontosabban elindul, majd az első UI felület (bejelentkezés) megjelenése előtt leáll, kivétel nem lép fel, az eseménynaplóba csak egy ucrtbase.dll hiba kerül bele.
Ha módosítjuk az assembly nevét magyar ékezetes betűk nélkülire, a program rendben működik. Találkozott más is ilyennel? Jó lenne az okokat is kideríteni, kereséssel nem találtam hasonló jelenséget. -
martonx
veterán
válasz
skyrush7 #10001 üzenetére
Szia!
Ahogy látom a booking.com-nak van nagyon profi API-ja: Booking.com APIs and Documentation
Szallas.hu esetében viszont nem igazán találtam ilyet, én a helyedben felvenném velük a kapcsolatot, szeretném hinni, hogy van nekik is API-juk.
iCal-t a helyedben nem erőltetném, API integráció irányába mennék. -
skyrush7
aktív tag
Sziasztok!
Problémáma ütköztem, nemrég kezdtem el .NET Core-ban egy foglaló oldalt lérehozni a vendégházunkhoz. Az alapfunkcionalitás rendben, tudnak dátum szerint foglalást leadni, amely mentésre kerül a DB-be.
A probléma ott van, hogy jó lenne valamilyen szinten szinkronizálni Booking és Szállás.hu-val. Mindkettőhöz van egy iCal link.
Ezt hogyan tudnám beintegrálni a .NET-es oldalamba? Lényeg, hogy ne engedjen az oldal foglalni olyan dátumra, ahova már Bookingon keresztül le lett adva foglalás.
Sajnos neten nem nagyon találtam anyagot hozzá, aránylag kezdő is vagyok még. Az iCal.NET libraryra rátaláltam, de nem nagyon találtam oktatóanyagot hozzá, hogyan is lehetne használni.
Tudtok valami tippet adni merre induljak el?
Ú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!
- OLED TV topic
- Milyen légkondit a lakásba?
- Vicces képek
- A fociról könnyedén, egy baráti társaságban
- NVIDIA GeForce RTX 5070 / 5070 Ti (GB205 / 203)
- Futás, futópályák
- Karaktere biztos lesz az első Nothing fejhallgatónak
- Autós topik
- AMD K6-III, és minden ami RETRO - Oldschool tuning
- Kínai és egyéb olcsó órák topikja
- További aktív témák...
- EJJ! Dell Latitude 7330 -65% "Kis Gamer" Üzleti Profi Ultrabook 13,3" i5-1245U 16/512 FHD IRIS Xe
- i5 10500/ RX6600XT/32GB DDR4/ 512GB m.2 alapú konfig/ garancia/ ingyen foxpost
- Szép Dell Latitude 7320 -60% "Kis Gamer" Üzleti Profi Ultrabook 13,3" i7-1185G7 32/512 FHD IRIS Xe
- LG NanoCell 50NANO759PR
- Samsung Galaxy S23 256GB (garis)
- Honor Magic V2 - Purple - Használt, szép állapot
- BESZÁMÍTÁS! Microsoft XBOX One S 1TB lemezes játékkonzol garanciával hibátlan működéssel
- Bomba ár! Lenovo ThinkPad L480 - i5-8GEN I 8-16GB I 256GB SSD I 14" FHD I HDMI I Cam I W11 I Gari!
- RAKTÁRSÖPRÉS!!! - Videókártyák, Monitorok, Notebookok, Stb. - Szaküzletből! Számlával!
- Bowers/Wilkins Px7 S2 fejhallgatók
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: Promenade Publishing House Kft.
Város: Budapest