webForumDet fria alternativet

slumpa array -- fel i kod hos pellesoft

ASP

19 svar · 440 visningar · startad av Eclipse

Medlem sedan juli 20003 825 inlägg
Frågan#1

http://www.pellesoft.se/area/articles/article.aspx?artid=808

Hittade denna som jag skulle vilja använda... Det andra exemplet.

Men det är två fel. Jag har sktivit till honom, men inte fått svar.

byt från: RandomNumber = Int(RND(*MaxValues) + 1
byt till: RandomNumber = Int(RND * MaxValues) + 1

Sen blir det fel vid denna raden och jag fattar inte varför!

MaxItems = UBound(Array)

Microsoft VBScript runtime error '800a000d'

Type mismatch: 'UBound'

/random.asp, line 29

Medlem sedan juli 2004206 inlägg
#2

Uhm nu var det ett tag sedan jag kodade asp, men variabeln Array är väl ingen array just vid det tillfället? (man kan väl inte köra en ubound på en icke-array?)

Medlem sedan juli 20003 825 inlägg
#3

Hmmm... nej, jag har också filosoferat i dom banorna!

Är det så?

Varför döper man en lokal variabel till Array när det är ett reserverat ord i ASP?

Varför postar man kod som inte fungerar som exempel på kod som fungerar?

Medlem sedan juli 20003 825 inlägg
#4

Grrr....

Han har glömt att DIM b !!!

Vad står det här??

Response object error 'ASP 0251 : 80004005' 

Response Buffer Limit Exceeded 

/random.asp, line 0 

Execution of the ASP page caused the Response Buffer to exceed its configured limit.
Medlem sedan juli 2004206 inlägg
#5

..det står att du loopar så jävla mycket så att output-buffern på servern spydde. Dvs du måste bryta dig ur loopen... kan ju iofs bero på att din array är gigantiskt stor...

Medlem sedan juli 20003 825 inlägg
#6

IF IsArray(Array) THEN MaxItems = UBound(Array) ELSE MaxItems = 1

OK, mitt fel.

Jag bytte 0 mot 1 och då blev det inte så...

***
Nu är det bara type mismatch....

Response.write varType(Array(b)) & "<BR>"

Microsoft VBScript runtime error '800a000d'

Type mismatch

/random.asp, line 47

***
Finn Fem Fel...!! :-)

Medlem sedan juli 20003 825 inlägg
#7

Mycket snyggare, mycket mindre!

http://www.webforum.nu/showthread.php?s=&postid=59777#post59777

dim allpictures(4)

  'läs in alla filnamn i en array allpictures, 
  'utlämnas som övning till läsaren
	  allpictures(0) = "1.jpg"
	  allpictures(1) = "33.jpg"
	  allpictures(2) = "56.jpg"
	  allpictures(3) = "77.jpg"

  dim choosen(4)
  dim i,pictures,choice

  randomize
  for i = 0 to 4
      choice = int((ubound(allpictures)+1-i)*rnd())
      choosen(i) = allpictures(choice)
      allpictures(choice) = allpictures(ubound(allpictures)-i)
  next

FOR i = 0 TO UBound(choosen,1)
	response.write choosen(i) & " "
NEXT
Medlem sedan juli 2004206 inlägg
#8

for i = 0 to 4 <--- jag tror du bara ska loopa till 3 då arrayer är 0-baserade (dvs du har dimmat 4 dimensioner = 0 till 3)

Medlem sedan juli 20003 825 inlägg
#9

OK, sorry. Kåden kommer från LarsG och är tänkt som insperation. Visst, du har rätt, sånt får man fixa.

Jag kan posta min kod sen, men nu ska jag hem och schlafen! :-)

Medlem sedan juli 20003 825 inlägg
#10
myRow = application("activeUsers")

IF IsArray(myRow) THEN response.write "xxxxxx " ELSE response.write "nooo!!"

response.write  UBound(myRow)

i = UBound(myRow)
'  dim choosen(4)
  [b]dim choosen(UBound(myRow))[/b]
'  dim i,pictures,choice

randomize
for i = 0 to UBound(myRow)
	choice = int((ubound(myRow)+1-i)*rnd())
	choosen(i) = myRow(choice)
	myRow(choice) = myRow(ubound(myRow)-i)
next

FOR i = 0 TO UBound(choosen,1)
	response.write choosen(i) & " "
NEXT

***
Så här ser koden ut nu och felmeddlandet lyder:

Microsoft VBScript compilation error '800a0402' 

Expected integer constant 

/v1/random.asp, line 40 

dim choosen(UBound(myRow))
------------^

Jag har testat lite olika varianter och nu undrar jag varför jag inte kan sätta längden på en array till samma längd som en annan array...??

Medlem sedan juni 200032 967 inlägg
#11

Av någon anledning får du inte göra så vid dim, däremot vid redim. Detta fungerar:

  dim choosen
  redim choosen(UBound(myRow))

mvh

Medlem sedan juni 2004533 inlägg
#12

Ännu snyggare, ännu mindre. ;)

http://guffa.com.loopiadns.com/Programming_archive.asp?id=8

Medlem sedan juli 20003 825 inlägg
#13

Imponerande, verkligen! Nu är det itne siffror jag ska skumpa fram utan ord som ska byta plats... Jag vet inte vilket som är bäst!

Medlem sedan juni 2004533 inlägg
#14

Lägg det som ska slumpas i en array, och använd talet som index i arrayen.

Ifall du bara vill kasta om värdena så lämpar sig naturligtvis inte metoden jag visade. Den visar alltid värdena i ordning.

Medlem sedan juli 20003 825 inlägg
#15
SQL = "SELECT intID, strName FROM [users];"
set mySQL = Conn.Execute(SQL)
IF NOT mySQL.EOF THEN 
	myRow = mySQL.GetRows()
  redim myUsers(UBound(myRow,2))

	FOR j = 0 TO UBound(myRow,2)
		myUsers(j) = myRow(1,j)
	NEXT
END IF

redim choosen(UBound(myUsers))

randomize
for i = 0 to UBound(myUsers)
	choice = int((ubound(myUsers)+1-i)*rnd())
	choosen(i) = myUsers(choice)
	myUsers(choice) = myUsers(ubound(myUsers)-i)
next

FOR i = 0 TO UBound(choosen)
	response.write choosen(i) & " "
NEXT

Denna koden hämtar användarna och tilldelar ett värde i en array:
myUsers(0) = "Anders"
myUsers(1) = "Krabban"
myUsers(2) = "Erik"
myUsers(3) = "Pelle"

Sen tar koden dom fyra och kastar om ordningen.

Medlem sedan juli 20003 825 inlägg
#16

2-dimmensionell array

Jag kom på att det blir snyggare med en tvådimmensionell array!

Men det är alltid bara första raden som fungerar!

rundan runda konst vasstena vadstena
vasstena vasstena vadstena vadstena vasstena
vasstena vasstena vasstena vasstena vasstena
vasstena vasstena vasstena vasstena vasstena
vasstena vasstena vasstena vasstena vasstena

IF NOT mySQL.EOF THEN 
	myRow = mySQL.GetRows()
	redim myWords(UBound(myRow,2))

	FOR j = 0 TO UBound(myRow,2)
		myWords(j) = myRow(1,j)
	NEXT
END IF

redim choosen(UBound(myWords),UBound(myWords))

FOR j = 0 TO UBound(myWords)
	randomize
	FOR i = 0 TO UBound(myWords)
		choice = INT((ubound(myWords)+1-i)*RND())
		choosen(i,j) = myWords(choice)
		myWords(choice) = myWords(UBound(myWords)-i)
	NEXT

	FOR i = 0 TO UBound(choosen,2)
		response.write choosen(i,j) & " "
		IF i = UBound(choosen,2) THEN response.write "<BR>"
	NEXT
NEXT
Medlem sedan juni 2004533 inlägg
#17

När du loopat igenom arrayen en gång så har du ju tagit bort värdena i den. För varje värde du slumpar fram så skrivs det ju över av det sista värdet i arrayen. Alltså kan du inte använda arrayen mer än en gång.

Medlem sedan juli 20003 825 inlägg
#18

Nej... jag har förstått att det måste vara nåt sånt! Men man måste ju kunna återställa den...

Eller det kanske inte går!?

Spara i nån slags temp array... Återkommer!

Medlem sedan juni 2004533 inlägg
#19

Du kan göra en array med index som du tar bort värdena i istället för att flytta om värdena i arrayen med ord. Den är enklare att fylla med nya värden än att kopiera arrayen med ord.

Såg ett fel i slumpfunktionen. Den kommer aldrig att slumpa fram det sista ordet i arrayen först.

Int((UBound(myWords) - i) * Rnd())

ska vara:

Int((UBound(myWords) + 1 - i) * Rnd())

Medlem sedan juli 20003 825 inlägg
#20

Min vän!

Du har ögon som en hök! Jättetack! Jag har ändrat detta fel på hela denna sidan.

***
Jag har sovit på saken och kommit fram till att jag nöjer med det sm fungerar nu.

Det är kod som kommer att hänga med länge...

257 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)