Potreboval by som Ode Geom-u nastavit data, co je IntPtr, ako odkaz na nejaku instanciu mojej triedy. Totiz pri nastani kolizie mi to vrati a potreboval by som pouzit, to ako odkaz na tu instanciu z ktorej by som si pobral este nejake parametre. resp. moze to byt aj nejako inac, napr. ze by mi to vratilo hash kod, a pomocou hashtable by som to spravil ale neviem ako.
Fórum › .NET
Ode Data
Tak tedka sem fakt presne nepochopil, co poradne chces.Bud dej nejaky kod nebo to popis "normalne" a vecne.Tenhle popis je fakt na facku.
Akorat k tomu IntPtr => je to vlastne ukazatel na neco.Vetsinou se to pouziva v c++/cli nebo pri psani nejakych wrapperu, ktere vyuzivaji ukazatele. Ten by pak pomoci nejake Marshaling funkce mel jit pretypovat na nejakou tridu.
Napr.:
public class MyObject
{
string anything;
IntPtr geom;
public MyObject(IntPtr colspace)
{
geom = Ode.dCreateBox(colspace, 1f, 1f, 1f);
Ode.dGeomSetData(geom, /* potrebujem tu dostat odkaz na seba */);
}
}
public class MyLayout
{
MyObject[] objs1...
MyObject[] objs2...
public MyLayout
{
// tu sa vytvoria objekty
}
protected void OnCollisionCallback(IntPtr data, IntPtr geom1, IntPtr geom2)
{
anything = (/* potrebujem dostat to data */).anything;
}
}
dufam ze toto by sa uz dalo pochopit, avsak to som len napisal ako priklad a je to asi 1/50 celeho kodu.
Aha, tak takhle moc neporadim. Koukni do nejakeho helpu toho wrapperu na ODE. Jak sem koukal na priklad na strankach ODE pro c++, tak to pretypovaval na ukazatel na tridu.
Tu ti nezbyde asi nic jineho, nez kouknout do documentace nebo se poptat na forech ODE nebo ODE.NET (nebo odkud mas ten wrapper).
Koukni tady:
http://msdn.microsoft.com/en-us/library/4ca6d5z7.aspx
Melo by to byt aplikovatelne i na tridy,ale odzkousene to nemam.
dajak tomu IntPtr este stale nechapem. ako spravim:
MyObject obj...
IntPtr ptr = /* neco ako dostat sem intptr z obj*/;
((MyObject)/* neco na dostatie to z toho ptr */).anything = ...
lebo ked pouzijem:
IntPtr ptr = (MyObject*)obj;
tak mi vypise CS0208
Pro z obj => IntPtr by melo jit toto:
IntPtr ptr = new IntPtr(obj);
Pak podle te msdn by melo jit zpet toto:
MyObject newObj = (MyObject)Marshal.PtrToStructure(ptr, typeof(MyObject));
Toto mi nejde:
IntPtr ptr = new IntPtr(obj);
tak som skusil toto:
[AttributeUsage(AttributeTargets.Class)]
public abstract class MyObject: Attribute
{...
IntPtr ptr = new IntPtr((int)0123456789);
Marshal.StructureToPtr(this, ptr, true);
No a dostal som toto:
** ERROR **: Type Engine.GameObject which is passed to unmanaged code must have a StructLayout attribute
aborting...
Stacktrace:
at (wrapper managed-to-native) System.Runtime.InteropServices.Marshal.StructureToPtr (object,intptr,bool) <0x00004>
at (wrapper managed-to-native) System.Runtime.InteropServices.Marshal.StructureToPtr (object,intptr,bool) <0xffffffff>
at...
Pouzil som teraz toto:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
[StructLayout(LayoutKind.Sequential)]
[ComVisible(true)]
A dostal som:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object
at (wrapper unknown) Engine.GameObjectBox:StructureToPtr (object,intptr,bool)
at (wrapper managed-to-native) System.Runtime.InteropServices.Marshal:StructureToPtr (object,intptr,bool)
at...
OK, uz to takmer je:
Marshallovat do Ptr mi ide, ale kedze ta trieda obshahuje aj Array nejakej struct, tak mi vypise(pri deMarshallovani):
Structure field of type Draw_Info[] can't be marshalled as LPArray.
A potom este, dalsia vec, ako sa da z Marshallovat System.Type?? lebo ak sa o to pokusim tak mi vypise>
** ERROR **: Type System.Type which is passed to unmanaged code must have a StructLayout attribute
aborting...
Stacktrace:...
Alebo ako ziskat z demarshalovanej triedy, type, kedze to pravdepodobne bude 3-5 trieda zalozena na nej.
Lebo som to chcel takto:
public struct OdeData
{
public System.Type GOType; // typ obj marshallovaneho, ktora sa pouzije na demarshallovanie GO
public IntPtr GO; // zmarshallovany obj
}
Tedka vazne nevim, budes se muset tim progooglovat a prokousat se dokumentaci nebo msdn.
Mi to pripada strasne prekomplikovane, podle me ten wrapper musi mit nejake jednodussi reseni.
alebo asi by to neslo pomocou nejakeho indexu a vsetky objekty(data by bolo int) by som po vytvoreni tam daval, ale co je na to lepsie pouzit?? ja by som pouzil array, ale neni neco lepsie nato??
Mozna struktury by byly lepsi.
myslis, array struktur?? lebo to tak aj chcem, lebo tam budem mat viac veci, alebo namiesto class MyObject pouzit struct??
Ono je to vesmes jedno, protoze muze udelat i pole trid.Zalezi na slozitosti vnitrku (nejake potrebne metody nebo jen property?)
Co je property(som len amater, zatial)??
A metoty to je napr. void xyz()???
EDIT: Aha, nasiel som si to v msdn, oboje tam mam.
Tak pak mas treba lepsi pole trid.Ale jelikoz uz sem se docela solidne ztratil v tom vsem, tak asi vic nebudu schopny pomoct.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
ODE metodou střelby — založil Charles
Když uživate napíše data do formuláře, jak dostat ty data do title? — založil Starý chábr
Data Scientist / Statistik / Data Mining Professional — založil Profinit EU
BASCOM : data(1), &HFF snížit o jednu jednotku dolů na data(1),… — založil grantorino
Hledáme parťáka Big Data Engineera - Big Data na platformě Hadoop — založil Profinit EU
Moderátoři diskuze