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
10 svar · 413 visningar · startad av neversleep
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
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.
.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 ..
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
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.
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])
Flyttad från Visual Basic (som endast gäller version 6)
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?
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