Avatar billede tjacob Juniormester
01. april 2002 - 12:15 Der er 9 kommentarer og
1 løsning

Kalde "fremmede" API'er

Jeg har brug for at anvende funktionerne rand() og srand() fra C++.
(Da de ikke giver helt de samme værdier som Randomize og Rnd())
Jeg er ved at "oversætte" et C++ prog til VB, og jeg SKAL have de samme pseudo-tilfældige talsekvenser som i originalen, og det kan jeg simpelthen ikke få med VB-funktionerne.
Hvordan gør jeg dette?

Jeg kan godt kalde funktionerne således:

    Declare Function rand Lib "MSVCRT.DLL" () As Long

    Declare Function srand Lib "MSVCRT.DLL" () As Long

    RetVal = rand (eller srand)

Men de virker KUN således, -altså hvis de bliver erklæret og kaldt helt uden argumenter. Det er OK for rand(), men srand() skulle jo fungere med en seed-værdi!
Altså noget a la:
   
    Declare Function srand Lib "MSVCRT.DLL" (Byval SeedVal as long) As Long

-Men det virker som sagt ikke!

Men man kan måske slet ikke bruge disse funktioner i VB?
Avatar billede sjh Nybegynder
03. april 2002 - 08:21 #1
Prøv at se her:
http://www.allapi.net/vbtutor/tutmain.shtml
(Tutorial 9: Creating and using your own VC++ DLLs)
Avatar billede nolle_k Nybegynder
03. april 2002 - 10:26 #2
Hvis du kalder Randomize før du benytter rand og srand i VB får du samme funktionalitet som i C++! Hvis ikke dette gøres kommer du ud for det du beskriver!

Ved kaldet til Randomize har du også mulighed for at specificere seed værdi

//Nolle_K
Avatar billede tjacob Juniormester
03. april 2002 - 10:48 #3
>>sjh  Jeg har tjekket allapi.net, men det hjælper mig ikke rigtigt, da jeg ikke ved præcist hvordan rand og srand fungerer. (hvilke algoritmer der er anvendt.)

>>nolle k    Nej det er ikke helt korrekt. Hvis man sætter Rnd til finde et tilfældigt tal mellem 0 og 32768 (det gør rand), efter at have kørt Randomize med en seedværdi (f.eks. 1786), så får du IKKE det samme tal, som hvis du kører rand efter srand(1786). Det er netop det, der er mit problem.
Funktionaliteten er den samme, men resultatet er IKKE.

Baggrund: Jeg er ved at klone win-spillet Napoleon (freecell). Der skal blandes kort på en bestemt måde, og jeg ønsker at kunne genskabe de spil der er i originalen. Det gøres ved at generere pseudo-tilfældige tal, hvor man (i originalen) først kører srand med en seedværdi som er spilnummeret (0-32.000). Derefter genereres et tal mellem 0 og 51 (et kort) med rand, og de efterfølgende 51 tal genereres med rand ud fra det foregående.

Derfor ønsker jeg med Randomize(1786) efterfulgt af rnd(mellem 0 og 51), at få det samme tal som srand og rand giver. Dette kan jeg ikke få til at fungere, og derfor tænkte jeg at jeg måske kunne hente C++ funktionerne ind i VB.

/tjacob
Avatar billede tjacob Juniormester
03. april 2002 - 10:54 #4
Der er mere baggrund her: (og også den oprindelige C++ kode):
http://www.eksperten.dk/spm/184564
Avatar billede nolle_k Nybegynder
03. april 2002 - 10:58 #5
Ved tilfældige tal kan du da ikke forvente noget bestemt!!! Er det ikke derfor man kalder det for tilfældigt??????
Avatar billede tjacob Juniormester
03. april 2002 - 11:02 #6
Jo, netop hvis du anvender en seedværdi, så får du det samme tal hver gang.
-Som nævnt i Napoleon(XP) er der 1.000.000 forskellige spil, og hvis du loader spil nr 378.964, så er det ens hver gang.
Tallene er kun pseudo-tilfældige. Kun hvis du f.eks. anvender Randomize med systemtiden (uden argument) får du et "ægte" tilfældigt tal.
Avatar billede tjacob Juniormester
03. april 2002 - 11:06 #7
Følgende kode vil ALTID give a = 4:
Randomize (25)
a = Int(30 * Rnd)
Avatar billede tjacob Juniormester
03. april 2002 - 11:11 #8
Følgende kode:
Dim a(4), i
Randomize (25)
For i = 0 To 4
a(i) = Int(30 * Rnd)
Next i

vil ALTID give talrækken 4,23,3,25,1
Avatar billede nolle_k Nybegynder
03. april 2002 - 11:16 #9
OK!! Så har jeg også lært noget i dag!!
Avatar billede tjacob Juniormester
06. april 2002 - 10:00 #10
OK -nu er der gået 6 dage. Jeg må nok finde en anden løsning.
-lukker spm.
/tjacob
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester