Newsgroup: it.comp.lang.visual-basic
Titolo: Ciclo For e Reset della variabile utilizzata. Perchè?

Ciao a tutti, non riesco a capire come mai all'interno di un ciclo for la 
variabile che utilizzo per sommare le distanze che ad ogni next vengono 
calcolare, ad ogni next questa mi torna a 0. Mi pare molto strano. Sapete 
spiegarmi perchè e come risolvere?
For pt = 0 To pPtColl.PointCount - 1  'Questo numero viene calcolato 
dinamicamente e cambia di volta in volta
                Numero_Lati = pPtColl.PointCount 'Numero lati calcolato 
correttamente per ogni edificio
                If Check = 1 Then
                    Var_X_1 = pPtColl.Point(pt).x
                    Var_Y_1 = pPtColl.Point(pt).y
                    'Calcolo la distanza tra un punto e quello successivo
                    Distanza = Sqr((Var_X_2 - Var_X_1) ^ 2 + (Var_Y_2 - 
Var_Y_1) ^ 2)
                End If
                If Check = 2 Then
                    Var_X_2 = pPtColl.Point(pt).x
                    Var_Y_2 = pPtColl.Point(pt).y
                    'Calcolo la distanza tra un punto e quello successivo
                    Distanza = Sqr((Var_X_2 - Var_X_1) ^ 2 + (Var_Y_2 - 
Var_Y_1) ^ 2)
                End If
                If Check = 0 Then
                    Var_X_1 = pPtColl.Point(pt).x
                    Var_Y_1 = pPtColl.Point(pt).y
                    Var_X_2 = pPtColl.Point(pt).x
                    Var_Y_2 = pPtColl.Point(pt).y
                End If
                If Check = 0 Then
                    Check = 1
                Else
                    If Check = 1 Then
                        Check = 2
                    Else
                    If Check = 2 Then
                        Check = 1
                    End If
                    End If
                End If
                Lunghezza_Media = Distanza + Lunghezza_Media ' Non risco a 
capire come mai ogni volta che viene eseguito il next la variabile Lunghezza 
Media torna a 0
            Next pt 

se ti spieghi meglio magari ti si puņ aiutare. qual'č la variabile che ti si 
resetta? 

            Next pt
Lunghezza_Media è la variabile che torna a 0 ogni volta che viene eseguito 
un next! 

                 Lunghezza_Media = Distanza + Lunghezza_Media ' Non risco a 
-- 
Computers...  are not designed, as we are, for ambiguity.  - Thomas
News 2000 [v 2.06] - 
http://www.akapulce.net/socket2000

 somma...
Che vuol dire che in distanza ci sia qualche cosa prima?
Il codice completo è questo, ma essendo fatto per VBA di ArcView 9.x è 
sconoscito a molti. Per quello avevo postato quella versione semplificata.
Private Sub ExportPolygons_X_Orientamento(pFtrCls As IFeatureClass)
    Dim pPolygon As IPolygon2
    Dim pExRings() As IRing
    Dim pPtColl As IPointCollection
    Dim expg As Long
    Dim pt As Long
    Dim pFtrCsr As IFeatureCursor
    Dim pFtr As IFeature
    Dim pgNo As Long
    Dim exRingCnt As Long
    Dim Lunghezza_Lato_Minore As Double
    Dim Lunghezza_Lato_Maggiore As Double
    Dim Numero_Lati As Long
    Dim Orientamento As Single
    Dim Distanza As Double
    Dim Lunghezza_Media As Double
    Dim dx As Double, dy As Double
    Dim theTang As Double
    Dim theAngle As Single
    Dim Var_X_1 As Double, Var_Y_1 As Double
    Dim Var_X_2 As Double, Var_Y_2 As Double
    Dim Check As Integer
    Dim esiste1 As Long
    Dim esiste2 As Long
    Dim esiste3 As Long
    Dim esiste4 As Long
    Dim esiste5 As Long
    Dim PI_GRECO As Double
    esiste1 = pFtrCls.FindField("Min_Lenght")
    esiste2 = pFtrCls.FindField("Max_Lenght")
    esiste3 = pFtrCls.FindField("Mean")
    esiste4 = pFtrCls.FindField("Bearing_°_")
    esiste5 = pFtrCls.FindField("Numero_Lat")
    Lunghezza_Lato_Minore = 10000
    Var_X_1 = 0
    Var_Y_1 = 0
    Var_X_2 = 0
    Var_Y_2 = 0
    Check = 0
    Distanza = 0
    Lunghezza_Lato_Maggiore = 0
    PI_GRECO = 3.1416
    Set pFtrCsr = pFtrCls.Update(Nothing, False)
    Set pFtr = pFtrCsr.NextFeature
    While Not pFtr Is Nothing
        pgNo = 0
        Set pPolygon = pFtr.Shape
        exRingCnt = pPolygon.ExteriorRingCount
        ReDim pExRings(exRingCnt)
        pPolygon.QueryExteriorRingsEx exRingCnt, pExRings(0)
        For expg = 0 To exRingCnt - 1
            Set pPtColl = pExRings(expg)
            For pt = 0 To pPtColl.PointCount - 1 'Queste sono le operazione 
che compie all'interno di ogni edificio
                Numero_Lati = pPtColl.PointCount - 1 'Numero lati calcolato 
correttamente per ogni edificio
                If Check = 1 Then
                    Var_X_1 = pPtColl.Point(pt).X
                    Var_Y_1 = pPtColl.Point(pt).Y
                    'Calcolo la distanza tra un punto e quello successivo
                    Distanza = Sqr((Var_X_2 - Var_X_1) ^ 2 + (Var_Y_2 - 
Var_Y_1) ^ 2)
                End If
                If Check = 2 Then
                    Var_X_2 = pPtColl.Point(pt).X
                    Var_Y_2 = pPtColl.Point(pt).Y
                    'Calcolo la distanza tra un punto e quello successivo
                    Distanza = Sqr((Var_X_2 - Var_X_1) ^ 2 + (Var_Y_2 - 
Var_Y_1) ^ 2)
                End If
                If Check = 0 Then
                    Var_X_1 = pPtColl.Point(pt).X
                    Var_Y_1 = pPtColl.Point(pt).Y
                    Var_X_2 = pPtColl.Point(pt).X
                    Var_Y_2 = pPtColl.Point(pt).Y
                    Lunghezza_Media = 0 'Ci sono ancora dei problemi su 
questa lunghezza media
                End If
                Check = Check + 1
                If Check = 3 Then
                    Check = 1
                End If
                If Distanza > 0 Then
                    If Distanza > Lunghezza_Lato_Maggiore Then
                    Lunghezza_Lato_Maggiore = Distanza
                    dx = Var_X_2 - Var_X_1
                    dy = Var_Y_2 - Var_Y_1
                    If dx <> 0 And dy <> 0 Then
                        theTang = dx / dy
                        theAngle = Atn(theTang) * 180 / PI_GRECO
                        If (theAngle < 0) Then
                            theAngle = theAngle + 180
                        End If
                    Else
                        If ((dx = 0) And (dy = 0)) Then
                            theAngle = -999
                        Else
                               If (dx = 0) Then
                                theAngle = 0
                        Else
                                theAngle = 90
                                End If
                         End If
                    End If
                    End If
                    If Distanza < Lunghezza_Lato_Minore Then
                    Lunghezza_Lato_Minore = Distanza
                    End If
                End If
            Next pt
            pFtr.Value(esiste1) = Lunghezza_Lato_Minore
            pFtr.Value(esiste2) = Lunghezza_Lato_Maggiore
            pFtr.Value(esiste3) = Lunghezza_Media / Numero_Lati 'Ci sono 
ancora dei problemi su questa lunghezza media
            pFtr.Value(esiste4) = theAngle
            pFtr.Value(esiste5) = Numero_Lati
            Var_X_1 = 0
            Var_Y_1 = 0
            Var_X_2 = 0
            Var_Y_2 = 0
            Check = 0
            Distanza = 0
            Lunghezza_Lato_Maggiore = 0
            Lunghezza_Lato_Minore = 10000
            Lunghezza_Media = 0 'Ci sono ancora dei problemi su questa 
lunghezza media
            pgNo = pgNo + 1
        Next expg
        pFtrCsr.UpdateFeature pFtr
        Set pFtr = pFtrCsr.NextFeature
    Wend
End Sub 


Grazie ho risolto! 

 Grazie ho risolto! 
Non basta scrivere: ho risolto. Devi dire come se vuoi renderti utile
anche agli altri.
-- 
An Elephant is a Mouse built to government specs. 


 anche agli altri.
Hai ragione vi posto il codice corretto!
Credo che il problema fosse che la variabile era innestata in un ciclo If e 
quindi questo creava problemi di inizializzazione:
----CODE----
...
While Not pFtr Is Nothing
        pgNo = 0
        Set pPolygon = pFtr.Shape
        exRingCnt = pPolygon.ExteriorRingCount
        ReDim pExRings(exRingCnt)
        pPolygon.QueryExteriorRingsEx exRingCnt, pExRings(0)
        For expg = 0 To exRingCnt - 1
            Set pPtColl = pExRings(expg)
            For pt = 0 To pPtColl.PointCount - 1 'Queste sono le operazione 
che compie all'interno di ogni edificio
                Numero_Lati = pPtColl.PointCount - 1 'Numero lati calcolato 
correttamente per ogni edificio
                If Check = 1 Then
                    Var_X_1 = pPtColl.Point(pt).X
                    Var_Y_1 = pPtColl.Point(pt).Y
                    'Calcolo la distanza tra un punto e quello successivo
                    Distanza = Sqr((Var_X_2 - Var_X_1) ^ 2 + (Var_Y_2 - 
Var_Y_1) ^ 2)
                End If
                If Check = 2 Then
                    Var_X_2 = pPtColl.Point(pt).X
                    Var_Y_2 = pPtColl.Point(pt).Y
                    'Calcolo la distanza tra un punto e quello successivo
                    Distanza = Sqr((Var_X_2 - Var_X_1) ^ 2 + (Var_Y_2 - 
Var_Y_1) ^ 2)
                End If
                  Lunghezza_Media = Lunghezza_Media + Distanza
                If Check = 0 Then
                    Var_X_1 = pPtColl.Point(pt).X
                    Var_Y_1 = pPtColl.Point(pt).Y
                    Var_X_2 = pPtColl.Point(pt).X
                    Var_Y_2 = pPtColl.Point(pt).Y
                    'Riinizializziamo le variabili alle condizioni iniziali
                    Distanza = 0
                    Lunghezza_Media = 0 'Ci sono ancora dei problemi su 
questa lunghezza media
                    Lunghezza_Lato_Maggiore = 0
                    Lunghezza_Lato_Minore = 10000
                End If
                Check = Check + 1
                If Check = 3 Then
                    Check = 1
                End If
                If Distanza > 0 Then
                    If Distanza > Lunghezza_Lato_Maggiore Then
                    Lunghezza_Lato_Maggiore = Distanza
                    dx = Var_X_2 - Var_X_1
                    dy = Var_Y_2 - Var_Y_1
                    If dx <> 0 And dy <> 0 Then
                        theTang = dx / dy
                        theAngle = Atn(theTang) * 180 / PI_GRECO
                        If (theAngle < 0) Then
                            theAngle = theAngle + 180
                        End If
                    Else
                        If ((dx = 0) And (dy = 0)) Then
                            theAngle = -999
                        Else
                               If (dx = 0) Then
                                theAngle = 0
                        Else
                                theAngle = 90
                                End If
                         End If
                    End If
                    End If
                    If Distanza < Lunghezza_Lato_Minore Then
                    Lunghezza_Lato_Minore = Distanza
                    End If
                End If
            Next pt
            pFtr.Value(esiste1) = Lunghezza_Lato_Minore
            pFtr.Value(esiste2) = Lunghezza_Lato_Maggiore
            pFtr.Value(esiste3) = Lunghezza_Media / Numero_Lati 'Ci sono 
ancora dei problemi su questa lunghezza media
            pFtr.Value(esiste4) = theAngle
            pFtr.Value(esiste5) = Numero_Lati
            Var_X_1 = 0
            Var_Y_1 = 0
            Var_X_2 = 0
            Var_Y_2 = 0
            Check = 0
            pgNo = pgNo + 1
        Next expg
        pFtrCsr.UpdateFeature pFtr
        Set pFtr = pFtrCsr.NextFeature
    Wend
....