webForumDet fria alternativet

array, nybörjarfråga

10 svar · 413 visningar · startad av neversleep

neversleepMedlem sedan okt. 2001230 inlägg
#1

hur skickar anger man adressen till en plats i arrayen i vb? Pekarhantering existerar inte va?

Motsvarande i C kod:
*hej = &arr(30)

tack på förhand

nikoMedlem sedan juni 20022 599 inlägg
#2
dim lAddress as long

lAddress=VarPtr(arr(30))

eller ..

lAddress=StrPtr(arr(30))

eller ..

lAddress=ObjPtr(arr(30))

beroende på om arrayen innehåller enkla datatyper, strängar, eller objektreferenser.
Det är dock odokumenterade "features" som man normalt inte behöver använda.

neversleepMedlem sedan okt. 2001230 inlägg
#3

Tack nico
Skulle nog ha lagt till att det var till vb.net, verkar itne som om det går att arbeta med pekare där. Vet du?

nikoMedlem sedan juni 20022 599 inlägg
#4

.NET? I .NET är det överhuvudtaget inte normalt att använda adresser på det här sättet eftersom garbage collectorn optimerar heapen och när som helst kan flytta en variabel (eg. ett objekt) till en annan plats.

I C# finns nyckelordet fixed om man vill sätta denna mekanism ur spel:

fixed (long * pekare=& mittObjekt)
{
	//mittobjekt ligger kvar på samma plats i detta block.
}

I VB.NET tror jag inte man har tillgång till fixed men däremot borde man ju kunna skriva en klass i C# som gör jobbet och sen använda den i VB. Det beror ju lite på vad man vill göra ..

neversleepMedlem sedan okt. 2001230 inlägg
#5

Möblerar garbage collectorn om i minnet? Det var ju bra att veta:)

Jag vill inte pyssla med ngn avancerad pekarhantering med en specifik adress, utan eg bara göra ett anrop med en array, där jag inte vill ha in hela arrayen till subrutinen. Säg att jag vill skicka in min array från 5 elementet och framåt, hur gör man då smidigast?

Eftersom du verkar ha en jäkla koll kanske du även kan säga om det är mer optimerat att skicka in arrayen byRef än byVal. Är det bara en adress som skickas vid call by ref medan hela arrayen måste kopieras vid call by val?

tack på förhand

nikoMedlem sedan juni 20022 599 inlägg
#6

Möblerar garbage collectorn om i minnet?

Ja, i allra högsta grad. Precis som i Java så sveper GC:en ibland över (den managade) heapen och komprimerar och flyttar grejer. Om man genom nåt API-trixande skulle lyckas få tag på en adress så kan man alltså aldrig vara helt säker på att den fortfarande är giltig på nästa rad.

om det är mer optimerat att skicka in arrayen byRef än byVal.

En array ärver alltid (implicit) av System.Array som är en referenstyp. Så när du skickar in en array i en funktion så skickas alltid en referens/pekare och inte en kopia av hela arrayn.

När jag testar nu så verkar det inte inte finnas någon skillnad mellan att skriva ByVal eller ByRef. I båda fallen så kan man ändra enskilda element inifrån funktionen precis som om det var en referens/pekare. Eventuellt så tolkas ByVal som att det ska skickas en kopia av referensen? Vet inte riktigt. Har lite dålig koll på VB.NET.

neversleepMedlem sedan okt. 2001230 inlägg
#7

Okej tackar niko för svaren. Dock vet jag fortfarande inte hur jag "pekar" om min array. I mitt anrop vill jag ju inte skicka in hela arrayen, utan bara från ett visst element och framåt.

För närvarande så skapar jag en ny array, kör en array.copy till denna från de element och framåt som jag vill använda. Detta känns dock lite omständigt, men det kanske man får leva med?

jag vill ju göra som i C
anrop(&array[element])

Marcus EMedlem sedan maj 20021 466 inlägg
#8

Flyttad från Visual Basic (som endast gäller version 6)

nikoMedlem sedan juni 20022 599 inlägg
#9

Tja.. Om du inte kör C# och har tillgång till fixed och unsafe så har jag nog ingen riktigt bra lösning.

Ett sätt om du inte ska ändra i arrayen inifrån funktionen är ju att göra precis som du gör: Skapa en kopia av en delmängd mha Array.Copy.

Ett annat sätt kunde ju vara att skicka in hela arrayen ByRef och dessutom skicka in ett startindex?

GladhMedlem sedan maj 20012 812 inlägg
#10

Jag håller med niko. Skicka med Arrayn och eftersom det ær en referens så spelar det ingen roll, eftersom du då inte skickar en massa data, utan endast en "pekare". Skicka sedan med start och slutindex (om det inte alltid ær sista posten).

Så kan du i din funktion hæmta ut den datan du vill, och gøra vad du vill med den.

- M

neversleepMedlem sedan okt. 2001230 inlägg
#11

Ok då får det bli så

jag bugar och tackar så mycket!

131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)