[C#]Pointer naar item uit ArrayList

Pagina: 1
Acties:

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
Stel ik heb een arraylist waar bepaalde object van een 1 type inzitten. Van een bepaald item uit die lijst wil ik een veld veranderen.
Een gewone toekenning werkt dan niet.

((objecttype)ArrayList[item]).veldnaam = ....;

Dit mag niet omdat de compiler aangeeft dat het linker deel geen variabele is die hij mag veranderen.
Toen heb ik geprobeerd om een variabele te laten verwijzen naar dit object door een simpele toekenning.

objecttype Test = (objecttype)ArrayList[item];
Test.veldnaam = ....;

Maar dit werkt ook niet omdat hij een nieuwe instantie maakt, daardoor is de variabele Test een nieuw object. Hetobject dat in de Arraylist staat blijft dus onveranderd.

De enige oplossing die volgens mij toen overbleef was een pointer te plaatsen naar het veld of het hele object. Maar deze pogingnen stranden tot nu toe allemaal, omdat de compiler problemen heeft met de volgende regels.

Even voor de duidelijkheid:
UserInfo is het object type(struct) dat in de lijst zit.
UserList is de ArrayList.
Status is het veld van type int dat veranderd moet worden.


eerst geprobeert om een pointer naar het hele object te zetten:

fixed(UserInfo* User= &(UserInfo)UserList[ID])

Hierbij krijg ik de volgende errors:

- Cannot take the address or size of a variable of a managed type(deze er heeft betrekking op de '*')
- Cannot take the address of the given expression.(deze er heeft betrekking op de '&')

Bij het plaatsen van een pointer naar het veld:

fixed(int* User = &((UserInfo)UserList[ID]).Status)

Krijg ik al weer de 2e error:

- Cannot take the address of the given expression.(deze er heeft betrekking op de '&')


Heeft iemand een idee hoe ik toch het veld van dat object in die ArrayList kan veranderen?

Alvast hartelijk dank!

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je eerste syntax moet gewoon werken.

Ben je echter wel zeker dat je de goeie syntax gebruikt? Bv:
code:
1
2
3
4
ArrayList arr = new ArrayList();
      
arr.Add (new Button());
((Button)arr[0]).Text = "blaat";


Verder kan je in C# enkel pointers gebruiken binnen een unsafe code block.

https://fgheysels.github.io/


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
whoami schreef op 24 februari 2004 @ 15:08:
Je eerste syntax moet gewoon werken.

Ben je echter wel zeker dat je de goeie syntax gebruikt? Bv:
code:
1
2
3
4
ArrayList arr = new ArrayList();
      
arr.Add (new Button());
((Button)arr[0]).Text = "blaat";


Verder kan je in C# enkel pointers gebruiken binnen een unsafe code block.
Bij het gebruik van die manier krijg ik ook problemen bij het compilen:

((UserInfo)UserList[ID]).Status = 0;

dit geeft de volgende error:

The lefthand-side of the assignment must be a variable, property or indexer.


En de pointers gebruik ik inderdaad een in een unsafe block.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Wat is ID voor type?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
Dat is een int.

Ik mag trouwens wel dat veld uitlezen, maar schrijven vind hij niet goed. Dan krijg ik dus de bovenstaande foutmelding.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Is Status een public property of field van UserInfo ?

Ah, die Status property heeft dus wel een get, maar geen set?

[ Voor 39% gewijzigd door whoami op 24-02-2004 15:19 ]

https://fgheysels.github.io/


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
whoami schreef op 24 februari 2004 @ 15:19:
Is Status een public property of field van UserInfo ?

Ah, die Status property heeft dus wel een get, maar geen set?
Hij is gewoon public. Dus ik zou volledige toegang tot het veld moeten hebben.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

AquilaDus schreef op 24 februari 2004 @ 16:15:
Hij is gewoon public. Dus ik zou volledige toegang tot het veld moeten hebben.
Ik denk dat het 2e gedeelte van whoami's opmerking over Get en Set wel eens de oorzaak van je probleem kan zijn.

[ Voor 5% gewijzigd door gorgi_19 op 24-02-2004 16:16 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
gorgi_19 schreef op 24 februari 2004 @ 16:16:
[...]

Ik denk dat het 2e gedeelte van whoami's opmerking over Get en Set wel eens de oorzaak van je probleem kan zijn.
Als hij public is heeft hij toch geen custom get of set nodig. Want als je een instantie maakt, dan kun je er wel gewoon inschrijven. Maar het probleem treedt op als je hem wilt benaderen als hij in ArrayList zit.
Misschien komt het omdat een struct is, maar dat lijkt mij ook sterk.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Het heeft idd te maken met het feit dat je item een struct is.

Een struct is nl. een value type, en een class is een reference type.

[ Voor 83% gewijzigd door whoami op 24-02-2004 16:27 ]

https://fgheysels.github.io/


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
whoami schreef op 24 februari 2004 @ 16:22:
Is 'Status' nu een property of een variabele?

Kan je eens wat relevante code van die struct posten?
Dit is de exacte struct:

code:
1
2
3
4
5
6
7
8
9
public struct UserInfo
    {
        public string Name;
        public IPAddress IP;
        public int Status;
        public DateTime LastAlive;
        public DateTime AddTime;
        public ArrayList PostBox;
    }

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Het heeft dus te maken met die struct. Een struct is een value-type.

Je kan het 'oplossen' door als volgt te werk te gaan:

code:
1
2
3
arr.Add(new TestInfo());
TestInfo i = (TestInfo)arr[0];
i.blaat = "test";


Echter, dan moet je wel beseffen dat arr[0].blaat != i.blaat.
In fact, arr[0] en i zijn 2 verschillende structs dan. Een assignment van een value-type zorgt er nl. voor dat de variabele gekopieerd wordt, terwijl dit bij een reference type niet het geval is.

https://fgheysels.github.io/


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
whoami schreef op 24 februari 2004 @ 16:33:
Het heeft dus te maken met die struct. Een struct is een value-type.

Je kan het 'oplossen' door als volgt te werk te gaan:

code:
1
2
3
arr.Add(new TestInfo());
TestInfo i = (TestInfo)arr[0];
i.blaat = "test";


Echter, dan moet je wel beseffen dat arr[0].blaat != i.blaat.
In fact, arr[0] en i zijn 2 verschillende structs dan. Een assignment van een value-type zorgt er nl. voor dat de variabele gekopieerd wordt, terwijl dit bij een reference type niet het geval is.
Ik dacht al dat dat het probleem was. Ik ga er eens een class van maken, want dat levert toch een reference op als het goed is.

  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
Ik heb er een class van gemaakt en het werkt nu. Tis niet een echt nette oplossing, maar het werkt. :D

Bedankt voor de hulp.

[ Voor 12% gewijzigd door AquilaDus op 24-02-2004 16:45 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

AquilaDus schreef op 24 februari 2004 @ 16:44:
Ik heb er een class van gemaakt en het werkt nu. Tis niet een echt nette oplossing, maar het werkt. :D

Bedankt voor de hulp.
Wat is er niet netjes aan een class? :?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • AquilaDus
  • Registratie: Januari 2004
  • Laatst online: 21-03 00:33
gorgi_19 schreef op 24 februari 2004 @ 16:49:
[...]

Wat is er niet netjes aan een class? :?
Ik vind het een beetje overkill om alleen maar voor dataopslag een complete klasse te gebruiken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
:?
Wat versta je onder een 'complete' class ?
Het grote verschil tussen een class en een struct, is dat het ene een reference type en het andere een value type is.
Dat wil zeggen dat een struct op de stack, en een class op de heap gealloceerd wordt.

Het accessen van iets dat op de stack staat, gaat vlugger. Maar grote stukken data zet je beter op de heap.

https://fgheysels.github.io/

Pagina: 1