Gå til innhold

Variabler med samme minne område


Anbefalte innlegg

I Clarion kan jeg gjøre slik:

MyArray       STRING(5),dim(2)
MyString       STRING(10),OVER(MyArray)
 CODE
 MyArray[1] = "HELLO"
 MyArray[2] = "WORLD"
 Message(MyString)

resultatet vil være en messagebox som sier HELLOWORLD

 

Vet man kan (som Jørn beviste i en anne thread) gå veien om å lage en NEW STRING basert på strengen, men poenget med OVER() i Clarion er at de to definisjonene faktisk deler samme minne område og vil til en hver tid ha samme innhold.

 

Vet jeg kansje skyter litt over mål her da .NET skal være så safe etc. men man vet jo aldri.... kansje det går alikevel ;-)

 

Ole

Lenke til kommentar
Videoannonse
Annonse

Makan til mas on Clarion da :-P

 

Alle reference type variabler deler samme minneområde automatisk. Men selve pekeren til objektet kan endre seg:

MittObject o = new MittObject();

MittObject o2 = o;

o2.Tull = 'A';

// her vil også o.Tull være 'A'

o2 = new MittObject();

o2.Tull = 'B';

// her vil o.Tull fortsatt være 'A'

 

 

Value types deler ikke samme minneområde:

int A = 5;

int B = A;

B = 1;

// her vil A fortsatt være 5

 

 

Jeg vil tro at eksempelet ditt fra Clarion vil være vanskelig å få til i VB.Net....

 

 

En ganske spesiell ting med String (igjen...) er mulig å se i dette eksempelet:

Prøv å gjette hva som skrives ut før du skriver koden :D

       static void Main(string[] args)
       {
           string a = "tester";
           string b = "tester";
           Test(ref a);

           Console.WriteLine(a);
           Console.WriteLine(b);

           Console.ReadKey();
       }

       unsafe static private void Test(ref string s)
       {
           fixed (char* sptr = s)
               sptr[2] = 'Z';
       }

:tease:

Endret av jorn79
Lenke til kommentar
Makan til mas on Clarion da :-P

 

Alle reference type variabler deler samme minneområde automatisk. Men selve pekeren til objektet kan endre seg:

MittObject o = new MittObject();

MittObject o2 = o;

o2.Tull = 'A';

// her vil også o.Tull være 'A'

o2 = new MittObject();

o2.Tull = 'B';

// her vil o.Tull fortsatt være 'A'

 

 

Value types deler ikke samme minneområde:

int A = 5;

int B = A;

B = 1;

// her vil A fortsatt være 5

 

 

Jeg vil tro at eksempelet ditt fra Clarion vil være vanskelig å få til i VB.Net....

 

 

En ganske spesiell ting med String (igjen...) er mulig å se i dette eksempelet:

Prøv å gjette hva som skrives ut før du skriver koden :D

       static void Main(string[] args)
       {
           string a = "tester";
           string b = "tester";
           Test(ref a);

           Console.WriteLine(a);
           Console.WriteLine(b);

           Console.ReadKey();
       }

       unsafe static private void Test(ref string s)
       {
           fixed (char* sptr = s)
               sptr[2] = 'Z';
       }

:tease:

8141576[/snapback]

Tja, Clarion er jo liksom vert mitt hovedverktøy i snart 20 år så det ligger vel noe der tenker jeg ;-)

Når det gjelder eksemplet ditt så tipper jeg noe slikt vil skje:

Test(ref a) sender referansen til a inn i metoden Test, som igjen endrer char(2) i strengen til Z. Siden det er en referanse så vil også dette endre andre element i a til Z og konsollet vil vise følgende to strenger:

 

teZter

tester

 

Jeg bruker denne formen for parameter overføring i mange tilfeller. Var litt usikker på den FIXED greia du hadde der, men gjettet bare på at det bare var en slags prefix for deklarasjonen.

 

 

Ole

Lenke til kommentar
Når det gjelder eksemplet ditt så tipper jeg noe slikt vil skje:

Test(ref a) sender referansen til a inn i metoden Test, som igjen endrer char(2) i strengen til Z.  Siden det er en referanse så vil også dette endre andre element i a til Z og konsollet vil vise følgende to strenger:

 

teZter

tester

8141717[/snapback]

 

Du får prøve å kompilere og kjøre den og se om du blir overrasket :)

Lenke til kommentar
Jeg bruker denne formen for parameter overføring i mange tilfeller.  Var litt usikker på den FIXED greia du hadde der, men gjettet bare på at det bare var en slags prefix for deklarasjonen.

8141717[/snapback]

 

Jo, det kan nok sammenlignes:

 

string a = "tester";
unsafe
{
     fixed (char* s = a)
     {
           s[2] = 'Z';
     }
}

 

men som du ser så må da koden være unsafe.... og så virker det kun i C# og ikke VB.Net.. Og du vil få "rare problemer" om lengden av s er mindre enn 3...

Lenke til kommentar
Jeg bruker denne formen for parameter overføring i mange tilfeller.   Var litt usikker på den FIXED greia du hadde der, men gjettet bare på at det bare var en slags prefix for deklarasjonen.

8141717[/snapback]

 

Jo, det kan nok sammenlignes:

 

string a = "tester";
unsafe
{
     fixed (char* s = a)
     {
           s[2] = 'Z';
     }
}

 

men som du ser så må da koden være unsafe.... og så virker det kun i C# og ikke VB.Net.. Og du vil få "rare problemer" om lengden av s er mindre enn 3...

8141780[/snapback]

Skjønner. Må med andre ord legge inn verdiene fra arrayen manuellt. Jeg får heller skrive om litt. Synd egentlig for den aktuelle koden jeg prøver å gjøre er allerede laget i Clarion og virker som bare det. Dette dreier seg om en "piratkopiering" stopper. Ganske effektiv faktisk og er vanskelig å hacke hvis du ikke vet hvordan du skal avlese minnet under kjøring. Har hørt noe om at .NET på en måte er åpent under kjøring og at alle variabler skal kunne leses av gjennom en eller annen form for monitor.

 

Ole

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...