API Basic For it - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki
For / To / Step / Next / Exit For
ClassicUO • Basic
For ripete un blocco lungo un intervallo numerico inclusivo. Serve per indici o un numero noto di operazioni; For Each visita i valori degli elementi.
Sintassi esatta
For [VAR] counter = start To limit [Step increment]
statements
Next [counter]
Continue For
Exit For
Break
Parametri
counter / VAR— Contatore scalare modificabile. VAR lo dichiara nella procedura; altrimenti usa una variabile esistente. Con Option Explicit On dichiaralo prima o usa For Var. Per un tipo esplicito scrivi DIM counter AS Integer prima del ciclo: AS nell’intestazione numerica non è supportato.start— Espressione numerica iniziale, valutata una volta e assegnata prima di limit e increment.limit— Estremo incluso, valutato una volta all’ingresso. Passo positivo: counter <= limit; negativo: counter >= limit.increment— Passo numerico facoltativo, predefinito 1. Ammessi valori negativi e frazionari; zero causa un errore intercettabile. Tipo e passo devono permettere l’avanzamento.statements / Next / exit— Corpo e Next su righe separate. Il nome facoltativo dopo Next deve corrispondere. Continue For passa al prossimo passo; Exit For esce dal For/For Each più vicino; Break esce dal ciclo più interno di qualsiasi tipo.
Restituisce
For, Next ed Exit For non restituiscono valori. Il contatore è un numero, non automaticamente un ID. Alla fine normale il motore conserva l’ultimo valore eseguito, non un valore oltre il limite. Un ciclo saltato conserva start; un’uscita anticipata il valore corrente. Gli esempi restituiscono Integer 12,28,395.
Comportamento
- Ingresso: assegnare start, memorizzare limite e passo, rifiutare zero, controllare il primo valore. Una direzione incompatibile salta il corpo; start=limit lo esegue una volta.
- Next controlla counter+step e lo assegna solo se resta nell’intervallo. 1 To 5 Step 3 visita 1 e 4. Cambiare le variabili originali del limite/passo non cambia i valori memorizzati; cambiare il contatore influenza il passo successivo.
- Struttura e nome Next vengono verificati prima dell’esecuzione; errori strutturali danno SC020. Usa contatori diversi nei cicli annidati. Uscire da Try esegue Finally. Pausa/arresto restano attivi; nessun ritardo o timeout automatico.
Esempi
1. Sommare le celle
# values[2] crea gli indici 0,1,2 con valori 2,4,6. Sum riceve l’array ByVal, parte da index=0 e memorizza length-1=2. Il passo implicito 1 visita tre celle; total=12 ritorna a Main.
Option Explicit On
Function Sum(ByVal items)
Var total = 0
For Var index = 0 To GetArrayLength(items) - 1
total += items[index]
Next index
Return total
End Function
Sub Main()
Dim values[2]
values[0] = 2
values[1] = 4
values[2] = 6
Return Sum(values)
End Sub
Spiegazione dei parametri e dell’esecuzione:
values[2] crea gli indici 0,1,2 con valori 2,4,6. Sum riceve l’array ByVal, parte da index=0 e memorizza length-1=2. Il passo implicito 1 visita tre celle; total=12 ritorna a Main.
2. Eliminare dalla fine
# items contiene -1,3,-2,5. Inizio Count()-1=3, limite 0, passo -1. Eliminare un valore negativo sposta solo indici già visitati, senza saltare elementi ancora da leggere. Restano 3 e 5; Count()*10+3+5 restituisce 28.
Option Explicit On
Sub Main()
Var items = List()
items.Add(-1)
items.Add(3)
items.Add(-2)
items.Add(5)
For Var index = items.Count() - 1 To 0 Step -1
If items[index] < 0 Then
items.RemoveAt(index)
End If
Next index
Return items.Count() * 10 + items[0] + items[1]
End Sub
Spiegazione dei parametri e dell’esecuzione:
items contiene -1,3,-2,5. Inizio Count()-1=3, limite 0, passo -1. Eliminare un valore negativo sposta solo indici già visitati, senza saltare elementi ancora da leggere. Restano 3 e 5; Count()*10+3+5 restituisce 28.
3. Limiti memorizzati e contatore finale
# ReadLimit incrementa calls ByRef e restituisce value. Inizio=1, limite=5, passo=2 sono valutati una volta ciascuno: calls=3. upper=99 e stride=1 nel corpo non li cambiano. Visite 1,3,5; total=9, index resta 5. Main restituisce 395.
Option Explicit On
Function ReadLimit(ByRef calls, ByVal value)
calls += 1
Return value
End Function
Sub Main()
Var calls = 0
Var upper = 5
Var stride = 2
Var total = 0
For Var index = ReadLimit(calls, 1) To ReadLimit(calls, upper) Step ReadLimit(calls, stride)
total += index
upper = 99
stride = 1
Next index
Return calls * 100 + total * 10 + index
End Sub
Spiegazione dei parametri e dell’esecuzione:
ReadLimit incrementa calls ByRef e restituisce value. Inizio=1, limite=5, passo=2 sono valutati una volta ciascuno: calls=3. upper=99 e stride=1 nel corpo non li cambiano. Visite 1,3,5; total=9, index resta 5. Main restituisce 395.