Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Πρόβλημα με τύπο μεταβλητής

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 14-02-2012, 19:27. Υπάρχουν 8 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-02-2012, 20:42 69190

    Πρόβλημα με τύπο μεταβλητής

    Καλησπέρα φόρουμ!

    Έχω φτιάξει ένα function το οποίο παίρνει μια μεταβλητή() array, και μου δείχνει σε string ότι έχει μέσα, το ένα κάτω απο το άλλο, ή χωρισμένα σε σειρές.

    Μπορώ να το χρησιμοποιήσω άμα δηλώσω ότι η μεταβλητή που θα δοθεί είναι π.χ. Double. και δουλεύει τέλεια! Αν όμως το βάλω γενικά "as Object", και την καλέσω με μια μεταβλητή Double, τότε μου βγάζει "System.Double[]"

    ο κώδικας (που δουλεύει) είναι ο εξής:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
        Public Function ArrayBox(ByVal SplitNum As Integer, ByVal ParamArray Var() As Double) As String
            Dim CurrentCount As Integer = 0
    
            Dim strVar As String = String.Empty
    
            For i = 0 To Var.Length - 1
                If CurrentCount <> 0 Then
                    strVar &= "	" & (i + 1) & ") " & Var(i).ToString
    
                Else
                    If CurrentCount >= SplitNum Then
                        CurrentCount = 0
                        strVar &= vbCrLf & (i + 1) & ") " & Var(i).ToString
    
                    Else
                        If CurrentCount <> 0 Then
                            strVar &= "	" & (i + 1) & ") " & Var(i).ToString
                        Else
                            strVar &= (i + 1) & ") " & Var(i).ToString
                        End If
    
                        CurrentCount += 1
                    End If
    
                End If
    
            Next
    
            If SplitNum = 0 Then
                strVar = strVar.Substring(2)
            End If
    
            Return strVar
        End Function

    Αν αλλάξω όμως την πρώτη σειρά σε:

    Public Function ArrayBox(ByVal SplitNum As Integer, ByVal ParamArray Var() As Object) As String
    Τότε μου βγάζει εκείνο το " System.Double[]" αντί να μου πει "0.001" πχ.


  •  08-02-2012, 21:30 69225 σε απάντηση της 69190

    Απ: Πρόβλημα με τύπο μεταβλητής

    Να ελέγξεις το τι παραμέτρους περνάς σε κάθε στοιχείο του Paramarray, δεν φταίει το ότι έχεις αλλάξει το Var από double σε object. Το 1ο παράδειγμα δείχνει τις τιμές ενώ το δεύτερο όταν θέλει να δείξει το array, πολύ φυσικά σου κάνει ToString τον τύπο που περιέχει (System.Double[]). Επίσης το function δεν δουλεύει όπως θα έπρεπε αφού αγνοεί την τιμή της splitNum όταν είναι > 0 (Boolean ίσως;).

    1
    2
     
            ArrayBox(2, 1.2#, 2.5#, 3.1#, 4.2#, "klp")
            ArrayBox(0, 1.2#, 2.5#, 3.1#, New Double() {1.2#, 2.5#, 3.1#})

  •  11-02-2012, 16:49 69257 σε απάντηση της 69225

    Απ: Πρόβλημα με τύπο μεταβλητής

    Δεν ήξερα καν ότι μπορεί να γίνει αυτό! δηλαδή όχι μπορείς να βάλεις πάνω από μια μεταβλητές μέσα!

    Εγώ πάντως θέλω να το χρησιμοποιώ έτσι:

    ArrayBox(Νούμερο,Μεταβλητή())

    αν το νούμερο είναι 0, τότε βγαίνουν όλα σε μια σειρά, αν το νούμερο είναι 1, τότε βγαίνουν όλα σε μια στήλη (το ένα κάτω απο το άλλο), αν το νούμερο έιναι 2, τότε όλα βγαίνουν σε 2 στήλες, κ.ο.κ.


    Είχες απόλυτο δίκιο ότι ο κώδικας ήταν λάθος.. με τις αλλαγές που έκανα εκείνο τον καιρό τον διέλυσα εντελώς!

    Όμως τον ξανάφτιαξα και δουλεύει (με το ίδιο πρόβλημα, δεν μπορώ να το βάλω να δέχεται μεταβλητή οποιουδήποτε τύπου..)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
        Public Function ArrayBox(ByVal SplitNum As Integer, ByVal ParamArray Var() As Object) As String
            Dim CurrentCount As Integer = 0
            Dim strVar As String = String.Empty
    
            If SplitNum = 0 Then
                For i = 0 To Var.Length - 1
                    If CurrentCount <> 0 Then
                        strVar &= "	" & (i + 1) & ") " & Var(i).ToString()
    
                    Else
                        strVar &= (i + 1) & ") " & Var(i).ToString()
                        CurrentCount += 1
                    End If
                Next
    
            ElseIf SplitNum = 1 Then
                For i = 0 To Var.Length - 1
                    strVar &= vbCrLf & (i + 1) & ") " & Var(i).ToString()
                Next
                strVar = strVar.Substring(2)
    
    
            Else
                For i = 0 To Var.Length - 1
                    If CurrentCount = 0 Then 'CurrentCount <> SplitNum - 1 Then
                        strVar &= (i + 1) & ") " & Var(i).ToString()
                        CurrentCount += 1
    
                    ElseIf CurrentCount <> SplitNum - 1 Then
                        strVar &= "	" & (i + 1) & ") " & Var(i).ToString()
                        CurrentCount += 1
    
                    Else 'If CurrentCount = SplitNum - 1
                        strVar &= "	" & (i + 1) & ") " & Var(i).ToString() & vbCrLf
                        CurrentCount = 0
    
                    End If
                Next
    
    
            End If
    
            Return strVar
        End Function
    CurrentCount color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;

    Υ.Γ. ο λόγος που το έχω ParamArray είναι γιατί μπορεί να θέλω να μην μπει array, αλλά μονή μεταβλητή κάποια στιγμή


  •  12-02-2012, 06:44 69264 σε απάντηση της 69257

    Απ: Πρόβλημα με τύπο μεταβλητής

    AlKiS:

    Δεν ήξερα καν ότι μπορεί να γίνει αυτό! δηλαδή όχι μπορείς να βάλεις πάνω από μια μεταβλητές μέσα!

    -Ναι είναι array από παραμέτρους και όχι array σαν παράμετρος (τώρα νομίζω κατάλαβα τι θέλεις να κάνεις, θέλεις να περάσεις array σε ParamArray;)

    Εγώ πάντως θέλω να το χρησιμοποιώ έτσι:

    ArrayBox(Νούμερο,Μεταβλητή())

    Υ.Γ. ο λόγος που το έχω ParamArray είναι γιατί μπορεί να θέλω να μην μπει array, αλλά μονή μεταβλητή κάποια στιγμή

    - Τότε θα μπορούσες να φτιάξεις 2 functions με το ίδιο όνομα και διαφορετικές παραμέτρους (Overloading), μία με array από objects και μία με μία μονή μεταβλητή.

    Αν θέλεις να έχεις ένα function μόνο θα πρέπει να ελέγχεις αν κάθε στοιχείο του ParamArray είναι array και τότε να βάλεις τις τιμές του σε κάποιο άλλο array που θα γίνει parse από το funtion που έφτιαξες.
    Εν πάσει περιπτώσει ότι και να κάνεις χρησιμοποίησε αν θέλεις το παρακάτω function σαν βάση, είναι πιό μικρό και κάνει το ίδιο με αυτό που έχεις ήδη.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
        Private Shared Function ArrayBox(ByVal splitNum As Integer, ByVal ParamArray var() As Object) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function

  •  12-02-2012, 11:31 69266 σε απάντηση της 69264

    Απ: Πρόβλημα με τύπο μεταβλητής

    Πράγματι αυτός ο κώδικας κάνει ακριβώς αυτό που κάνει κι ο δικός μου, μόνο που είναι και 4 φορές μικρότερος :)

    Είναι απίστευτο το πόσα λίγα ξέρω..... μερικές στιγμές απογοητεύομαι. Το StringBuilder ας πούμε, πρώτη φορά το χρησιμοποιώ.. δεν το ήξερα.


    Και το καλύτερο???

    Έμαθα τι είναι και το overload :P

    Δεν ήξερα ότι μπορώ να κάνω κάτι τέτοιο, αλλά πράγματι δουλεύει!!

    Να ο κώδικας:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
        Public Function ArrayBox(ByVal splitNum As Integer, ByVal ParamArray var() As Object) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function
        Public Function ArrayBox(ByVal splitNum As Integer, ByVal ParamArray var() As Double) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function
        Public Function ArrayBox(ByVal splitNum As Integer, ByVal ParamArray var() As Decimal) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function
        Public Function ArrayBox(ByVal splitNum As Integer, ByVal ParamArray var() As Integer) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function
        Public Function ArrayBox(ByVal splitNum As Integer, ByVal ParamArray var() As Boolean) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function

    Ευχαριστώ πολύ :)

    (Αλλάζω την κατάσταση του thread σε επιλυμένο)


  •  12-02-2012, 20:08 69269 σε απάντηση της 69266

    Απ: Πρόβλημα με τύπο μεταβλητής

    Να αποφεύγεις να κάνεις copy paste το ίδιο Block σε διαφορετικά functions, αν θελήσεις να κάνεις αλλαγές τι θα γίνει; Θα έπρεπε να φτιάξεις ένα εσωτερικό function πχ _ArrayBox και να το καλούν τα άλλα. Επίσης δες και τον παρακάτω κώδικα.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    Public Class frmMain
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            MessageBox.Show(ArrayBox(Of Object)(3, 1, True, 3, "a string")) ' Εδώ του λες εσύ το type (of Object).
            MessageBox.Show(ArrayBox(3, 1, 2, 3, 4)) ' εδώ το καταλαβαίνει μόνο του (integer).
            MessageBox.Show(ArrayBox(3, 1.1!, 2.2!, 3.3!, 4.4!)) ' (Single) κάνε hover το ποντίκι πάνω από το Arraybox.
            MessageBox.Show(ArrayBox(3, True, False, True))
            ' κλπ
        End Sub
    
        ' Όταν ένα function, property κλπ δεν χρησιμοποιεί methods, properties, events, fields κλπ
        ' από το Class ή structure στο οποίο εμπεριέχεται τότε κάντο shared.
        ' Όταν ένα function class κλπ επεξεργάζεται διαφορετικούς τύπους με τον ίδιο τρόπο τότε το κάνουμε Generic.
        ' Δίνε στο T ένα φιλικό όνομα αν θες.
        Public Shared Function ArrayBox(Of T)(ByVal splitNum As Integer, ByVal ParamArray var() As T) As String
            Dim sbRet As New System.Text.StringBuilder
    
            For i = 0 To var.Length - 1
                sbRet.Append(i + 1).Append(") ").Append(var(i).ToString)
    
                If splitNum > 0 AndAlso (i + 1) Mod splitNum = 0 Then
                    sbRet.AppendLine()
                ElseIf i < var.Length - 1 Then
                    sbRet.Append(ControlChars.Tab)
                End If
            Next
    
            Return sbRet.ToString
        End Function
    End Class

  •  12-02-2012, 20:51 69270 σε απάντηση της 69269

    Απ: Πρόβλημα με τύπο μεταβλητής

    Άλλο πάλι κι αυτό το (of T)... το έχω ξαναδεί κάπου αλλά δεν μου έλεγε κάτι. Κάνει σούπερ δουλειά όμως!


    Πρέπει να μου εξηγήσεις γιατί δουλεύει όμως. Δεν είμαι σίγουρος ότι κατάλαβα...

    Το μόνο που μπορώ να συμπεράνω είναι ότι, παλιά δεν δούλευε γιατί δεν ήξερε τι τύπος ήταν η μεταβλητή(), και το as object δεν του έφτανε. Ενώ τώρα με το "of T" του φτάνει (δλδ μπορεί να καταλάβει τι τύπος είναι για τον μοναδικό λόγο του ότι λεμε of T...)

    Αυτό συμβαίνει??


    Επίσης, αυτό είναι overload?? Κατάλαβα ότι δεν πρέπει να κάνω copy/paste τον κώδικα για να γίνει το overload αλλά, δεν κατάλαβα τι πρέπει να κάνω ανταυτου...


  •  13-02-2012, 01:10 69274 σε απάντηση της 69270

    Απ: Πρόβλημα με τύπο μεταβλητής

    Ακόμα δεν δουλεύει. Στην περίπτωση που περάσεις paramarray of Object και βάλεις παραμέτρους πχ ArrayBox(of Object)(1, new integer() {1,2,3}, 7)  θα σου βγάλει το integer[] αντί γιά τα περιεχόμενα του.

    To generic το φτιάχνεις γιά να αποφύγεις στην ουσία να περνάς παραμέτρους χύμα σαν object σε μία συνάρτηση (όπως κακώς κάναμε) ή σε ένα class και γιά να γλυτώσεις κάθε φορά να φτιάχνεις το ίδιο function με διαφορετικούς τύπους σαν παράμετρο.

    Θα μπορούσες να το έχεις απλά σαν Object αλλά το performance που κερδίζεις με τα generics είναι καλύτερο ιδίως σε περιπτώσεις που απαιτούν μεγαλύτερη επεξεργασία στα δεδομένα και στους τύπους που δίνεις.

    Επίσης δες το παρακάτω παράδειγμα που περιγράφει ένα class Glass με τα περιεχόμενα του.

    Έχουμε 3 classes Milk Beer and Pencils. Παρόλο που αποφύγαμε να κάνουμε το property Contents as object καί κάναμε Implements ένα χαζόInterface το IMatter (η φιλοσοφία στον OO προγραμματισμό είναι μεγάλο μειονέκτημα) δεν μπορούμε ακόμα να δούμε τα properties και τα methods του κάθε class που περιέχει σαν Contents παρά μόνο με Casting ή conversion  (Ctype, directcast κλπ).

    Από την άλλη μεριά όμως το generic σε γλυτώνει από αυτό το πρόβλημα γιατί το Contents as T σου γυρνάει τον Τύπο με τον οποίο το έχεις Δηλώσει.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
        Interface IMatter
        End Interface
    
        Class Glass
            Property Contents As IMatter
        End Class
    
        Class Milk : Implements IMatter
            Property IsCowMilk As Boolean
        End Class
    
        Class Beer : Implements IMatter
            Property HasFoam As Boolean
        End Class
    
        Class Pencils : Implements IMatter
            Property Count As Integer
        End Class
    
        Class Glass(Of T)
            Property Contents As T
        End Class
    
        Private Sub ASub()
            Dim glass As New Glass
    
            glass.Contents = New Milk
            glass.Contents = New Beer
            glass.Contents = New Pencils
    
            If TypeOf glass.Contents Is Pencils Then
                DirectCast(glass.Contents, Pencils).Count = 8
            End If
    
            Dim glass1 As New Glass(Of Pencils)
            '' glass1.Contents = New Milk ' Δεν το δέχεται (μόνο Pencils)
            glass1.Contents = New Pencils
    
            glass1.Contents.Count = 2
    
            Dim glass2 As New Glass(Of Milk)
            glass2.Contents = New Milk
    
            glass2.Contents.IsCowMilk = False
        End Sub

     

     

     

  •  14-02-2012, 19:27 69336 σε απάντηση της 69274

    Απ: Πρόβλημα με τύπο μεταβλητής

    Κατάλαβα τώρα τι κάνει το of T,

    Δυστυχώς όμως δεν μπορώ να καταλάβω ολόκληρο τον κώδικα που έφτιαξες... δεν μπορώ να "πάρω" όσα θα έπρεπε.


    Κατάλαβα ότι:

    0) Έχουμε ένα απλό περιβάλλον που έχει ένα ποτήρι στο οποίο μπορεί να υπάρχει μέσα γάλα (αγελαδινό ή όχι), μπύρα (με αφρό ή όχι) ή μολύβια (άγνωστο πλήθος).

    1) Μπορούμε να βάλουμε "Property" μέσα σε ένα class, και λειτουργούν παρόμοια με το My.Settings (σωστά??)

    2) Όταν έχουμε κάπου (Of T) μπορούμε να παραλείψουμε το Τ, ή να το γράψουμε άμα θέλουμε.

    3) Άμα δεν ορίσουμε το Of T, τότε για να κάνουμε access το κάθε πράγμα, πρέπει να χρησιμοποιήσουμε DirectCast, ενώ άμα το πούμε ξεκάθαρα πατάμε απλώς μια τελεία και έχουμε access στο πράγμα που θέλουμε (πχ contents.Count)


    Δεν κατάλαβα/Δεν ξέρω τα εξής:

    1) Interface (δεν έχω ιδέα τι είναι, τι κάνει....)

    2) Implements (το ίδιο..)

    3) Δεν μπορώ να το συνδυάσω με κάτι στο μυαλό μου ώστε να το χρησιμοποιήσω κάπου αργότερα (όπως έχω κάνει με όλα τα άλλα που μου έμαθες Smile )




Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems