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

 

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

Ερώτηση για Array [Vb.net 2010]

Îåêßíçóå áðü ôï ìÝëïò AlKiS. Τελευταία δημοσίευση από το μέλος AlKiS στις 28-12-2011, 19:11. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  24-12-2011, 19:43 68702

    Ερώτηση για Array [Vb.net 2010]

    Καλησπέρα,

    Ήθελα να ρωτήσω, αν έχω ένα δύο 1-dimensional arrays, και έχω και ένα 2-dimensional array,

    πως μπορώ να δώσω όλο το πρώτο 1-dimensional array σαν το (0,Χ) του 2-dimsnional array και το δεύτερο 1-densional array σαν το (1,Χ)  του 2-dimsnional array?

    Αλλά ας το γράψω και προγραμματιστικά γτ παίζει να μην καταλάβατε Χριστό έτσι όπως το είπα πάνω

    Θέλα να κάνω αυτό:

        Dim Set1(), Set2(), SetWhole(,) As Decimal
    

                ReDim Set1(-1), Set2(-1)
                For i As Integer = 0 To dgvData.Rows.Count - 1
                    ReDim Preserve Set1(i), Set2(i)
                    Set1(i) = CDec(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value)
                    Set2(i) = CDec(dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value)
                    'MsgBox(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value.ToString & " <-> " & dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value.ToString)
                Next
                NumberOfErrors = Set1.Length
     
                ReDim SetWhole(1, NumberOfErrors - 1)
                SetWhole(0, ) = Set1
                SetWhole(1, ) = Set2

    Όμως μου βγάζει πρόβλημα στις 2 τελευταίες γραμμές.
    Δηλαδή δεν μπορώ να χώσω το 1dimensional array Set1 μέσα στο Setwhole(0,X)
    και δεν καταλαβαίνω γιατί... αφού ουσιαστικά το (0,Χ) είναι 1-dimensional. Το (Χ,Χ) είναι 2-Dimensional
    Είναι ακριβώς όπως το (0,0) είναι ένας σκέτος decimal. Δλδ είναι σαν να μην μπορώ να πω SetWhole(0,0) = 555.


  •  27-12-2011, 22:43 68725 σε απάντηση της 68702

    Απ: Ερώτηση για Array [Vb.net 2010]

    Μπορείς να το κάνεις είτε με τον απλό τρόπο (Copy Κάθε element), είτε με την Buffer.BlockCopy (γιά να παίζει με Decimals θα πρέπει να κάνεις μετατροπές αλλά έχε την υπόψιν σου), είτε με Jagged Arrays (arrays από Arrays).
    Με Jagged Arrays δεν χρειάζεται να κάνεις copy όπως στις προηγούμενες περιπτώσεις γιατί δείχνουν (στην κυριολεξία) στα arrays που θέλεις να διαχειριστείς,
    τα οποία επίσης δεν χρειάζεται να έχουν τον ίδιο αριθμό στοιχείων (εξ ου και το όνομα Jagged).

     

    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
     
    Option Strict On
    
    Public Class Form1
        Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
            Dim Set1() As Double = {10.1, 20.234, 30.567}
            Dim Set2() As Double = {40.026, 50.0564, 60.456834567534123}
            Dim Whole(1, 2) As Double
    
            Buffer.BlockCopy(Set1, 0, Whole, 0, 3 * 8)
            Buffer.BlockCopy(Set2, 0, Whole, 3 * 8, 3 * 8)
    
            ' Jagged Arrays -------------------------------------
            Dim Set3() As Decimal = {1.1D, 2.2D} ' D = Decimal Literal
            Dim Set4() As Decimal = {3.1D, 4.1D, 5.1D}
            Dim Set5() As Decimal = {6.1D, 7.1D, 8.7D, 9.1D}
            Dim Jagged()() As Decimal = {(Set3), (Set4), (Set5)}
    
            ' Ή έτσι
            Dim Jagged1(2)() As Decimal
    
            Jagged1(0) = Set3
            Jagged1(1) = Set4
            Jagged1(2) = Set5
        End Sub
    
        ' ΕΠΙΣΗΣ:
        Sub [Sub]()
            Dim iCount As Integer = 5 ' ας υποθέσουμε ότι το dgvData.Rows.Count είναι 5. 
            ' Να αποφεύγεις να παίρνεις τιμές από Class properties (dgvData.Rows.Count) κάθε φορά που τις χρειάζεσαι εφόσον είναι στατικές, 
            ' να τις αποθηκεύεις σε μεταβλητές τοπικά (στην iCount στην περίπτωση μας).
            Dim Set1(iCount), Set2(iCount) As Decimal
            Dim SetWhole(,) As Decimal
    
            'ReDim Set1(-1), Set2(-1) ' Το -1 θα μπορούσε να μπει στην δήλωση των arrays, δεν χρειάζεται εδώ, 
            ' στην συγκεκριμένη περίπτωση δεν χρειάζεται καθόλου.
    
            For i As Integer = 0 To iCount - 1
                ' ReDim Preserve Set1(i), Set2(i) ' Το redim preserve δεν χρειάζεται από την στιγμή που γνωρίζεις το τελικό μήκος του array από την αρχή,
                ' επίσης κάθε φορά που κάνεις redim preserve δημιουργείται ένα νέο array και χάνεις perfomance.
    
                Set1(i) = CDec(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value)
                Set2(i) = CDec(dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value)
    
    #If DEBUG Then
                MessageBox.Show("Kati")
    #End If
            Next
    
            NumberOfErrors = iCount ' Το έχεις ήδη δεν χρειάζεται το Set1.Length
    
            ReDim SetWhole(1, NumberOfErrors - 1)
    
            'SetWhole(0, ) = Set1 ' Πριτς!
            'SetWhole(1, ) = Set2 ' Πριτς2!
        End Sub
    End Class
  •  28-12-2011, 00:13 68726 σε απάντηση της 68725

    Απ: Ερώτηση για Array [Vb.net 2010]

    (1)

    Τα JaggedArray μιλάμε μου άρεσαν πολύ!!

    Δεν ήξερα ότι μπορείς να βάλεις ()() σε κάτι..

    Ουσιαστικά το ()() είναι ίδιο με το (,) έτσι? Είναι πάλι ένας πίνακας με 2 διαστάσεις.. μόνο που μπορείς να κάνεις αυτό που θέλω πανεύκολα ^^

    Ευχαριστώ πολύ για ακόμα μια φορά! Είσαι εκπληκτικός :)


    (2)

    Αν και δεν θα χρησιμοποιήσω το Buffer.BlockCopy, πρέπει να το μάθω κι αυτό, και για να πώ την αλήθεια δεν το κατάλαβα.

    Okay, είναι απόλυτα κατανοητό μέχρι εδώ: "Buffer.BlockCopy(Set1, 0, Whole, 0,"

    Απο κει και πέρα όμως, έχουμε αυτό το "3 * 8)" Το οποίο είναι τα πόσα bytes θα δώσει (εεε?? γιατί δεν μπορεί να το υπολογίσει μόνο του? Οο)

    Βλέπω λοιπών το 3 * 8, και παρατηρώ ότι έχουμε 3 τιμές στο set1, άρα λέω, 3 τιμές * 8bit λογικά θα είναι.. άρα να το το 3*8.

    Όμως στην κάτω σειρά έρχεται η κάτω σειρά και μου τα χαλάει όλα.. Γιατί βλέπω το 3*8 και στο DestinationOffset. Και δεν καταλαβαίνω τι μπαίνει που και γιατί...


    (3)

    Χαχα τι τέλειο το #IF Debug

    Ούτε αυτό το ήξερα... πολύ χρήσιμο.


    (4)

    Το DataGrid δεν είναι στατικό. Ο χρήστης κάνει import ένα αρχείο, και μετά μπορεί να αλλάξει γνώμη και να κάνει import ένα άλλο αρχείο, οπότε όλα τα δεδομένα αλλάζουν.

    Επίσης το αρχείο μπορεί να περιέχει πολλές στήλες με δεδομένα, αλλά το permutation το οποίο θα γίνετε είναι για 2 στήλες μόνο, άρα το Set1 και set2 (που είναι οι 2 στήλες που θα επιλεγούν απο το datagrid) αλλάζουν επίσης. (δλδ και για ένα στατικό DataGrid το οποίο περιέχει 5 στήλες με errors, ο χρήστης μπορεί να επιλέξει μόνο 2 στήλες, όποιες θέλει, άρα το set1,2 θα αλλάζουν κάθε φορά.


    Λολ, τώρα κατάλαβα τι εννοείς.. Μπορούσα να βάλω στο πάνω redim το σκέτο, αντί για "ReDim Set1(-1), Set2(-1)", ένα απλό "ReDim Set1(NumberOfErrors), Set2(NumberOfErrors) " 

    Έχεις δίκιο.. απίστευτα χαζό λάθος.. ασχολίαστο βασικά -ακόμα κι εγώ το κατάλαβα :Ρ


    (5)

    'SetWhole(0, ) = Set1 ' Πριτς!
      'SetWhole(1, ) = Set2 ' Πριτς2!

    Πέεεεεεεεεεεεθανα στο γέλιο ^^ αχαχαχα μάρεσε το πρίτς :Ρ Πάντως είχα μια λογική όμως, έτσι? αφού μπορείς να πείς SetWhole(0,0) = ΜηArrayΜεταβλητή, γιατί να μην μπορείς να πεις SetWhole(0,) = Μεταβλητή1αςΔιάστασηςArray? (ρητορική ερώτηση..)


    (6)

    Έκανα τις αλλαγές σύμφωνα με αυτά που μου είπες. Ρίξε μια ματιά πλζ και πες μου τη γνώμη σου :)

        Private Sub btnPermutation_Click(sender As System.Object, e As System.EventArgsHandles btnPermutation.Click
     
            'TODO
            'If rows(1).count = rows(2).count then ...
     
            If dgvData.SelectedColumns.Count = 2 Then
                NumberOfErrors = dgvData.Rows.Count
     
                ReDim Set1(NumberOfErrors), Set2(NumberOfErrors)
     
                For i As Integer = 0 To NumberOfErrors - 1
                    Set1(i) = CDec(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value)
                    Set2(i) = CDec(dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value)
                    'MsgBox(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value.ToString & " <-> " & dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value.ToString)
                Next
     
                SetWhole(0) = Set1
                SetWhole(1) = Set2
     
    #If DEBUG Then
                MsgBox(SetWhole(0)(0) & " " & SetWhole(1)(0))
    #End If
     
                Call TwoPairedSamplesPermutation(Set1, Set2)

    (7)
    Και πάλι ευχαριστώ πολύ για την συνεχή βοήθεια που προσφέρεις.
    Χρόνια πολλά και χαρούμενα Χριστούγεννα και πρωτοχρονιά!!!!

    (αν θες κοίτα λίγο και ένα module Που έφτιαξα σαν γενικό, το έκανα update κιόλλας: http://www.dotnetzone.gr/cs/forums/ShowThread.aspx?PostID=68587#68587 )
  •  28-12-2011, 18:32 68729 σε απάντηση της 68726

    Απ: Ερώτηση για Array [Vb.net 2010]

    AlKiS:

    (1)

    Τα JaggedArray μιλάμε μου άρεσαν πολύ!!
    Δεν ήξερα ότι μπορείς να βάλεις ()() σε κάτι..
    Ουσιαστικά το ()() είναι ίδιο με το (,) έτσι? Είναι πάλι ένας πίνακας με 2 διαστάσεις.. μόνο που μπορείς να κάνεις αυτό που θέλω πανεύκολα ^^

    - Στην περίπτωση που κάθε array έχει τον ίδιο αριθμό στοιχείων θα μπορούσες να το θεωρήσεις σαν πίνακα.


    (2)

    Αν και δεν θα χρησιμοποιήσω το Buffer.BlockCopy, πρέπει να το μάθω κι αυτό, και για να πώ την αλήθεια δεν το κατάλαβα.
    Okay, είναι απόλυτα κατανοητό μέχρι εδώ: "Buffer.BlockCopy(Set1, 0, Whole, 0,"
    Απο κει και πέρα όμως, έχουμε αυτό το "3 * 8)" Το οποίο είναι τα πόσα bytes θα δώσει (εεε?? γιατί δεν μπορεί να το υπολογίσει μόνο του? Οο)
    Βλέπω λοιπών το 3 * 8, και παρατηρώ ότι έχουμε 3 τιμές στο set1, άρα λέω, 3 τιμές * 8bit λογικά θα είναι.. άρα να το το 3*8.
    Όμως στην κάτω σειρά έρχεται η κάτω σειρά και μου τα χαλάει όλα.. Γιατί βλέπω το 3*8 και στο DestinationOffset. Και δεν καταλαβαίνω τι μπαίνει που και γιατί...

    - Γιατί μπορείς με την BlockCopy να μεταφέρεις όσα bytes θέλεις σε ότι σημείο θέλεις. Κάνε Debug το παρακάτω παράδειγμα και δες από το Watch τι γίνεται στην Whole. Στο 1ο BlockCopy μεταφέρω μόνο τα πρώτα 2 στοιχεία (10.1, 20.234) και στο 2ο τα 40.026 και 50.0564 αφήνωντας 2 κενά elements με τιμή 0 στο τέλος. Αυτό μπορεί να φαίνεται σαν μειονέκτημα αλλά όμως η σωστή εκμετάλλευση τέτοιας λειτουργικότητας μπορεί να δημιουργήσει μικρότερο και γρηγορότερο κώδικα.

     

    1
    2
    3
    4
    5
    6
    7
     
    Const SIZE_OF_DOUBLE = 8
            Dim Set1() As Double = {10.1, 20.234, 30.567}
            Dim Set2() As Double = {40.026, 50.0564, 60.456834567534123}
            Dim Whole(1, 2) As Double
    
            Buffer.BlockCopy(Set1, 0, Whole, 0, 2 * SIZE_OF_DOUBLE)
            Buffer.BlockCopy(Set2, 0, Whole, 2 * SIZE_OF_DOUBLE, 2 * SIZE_OF_DOUBLE)

     

    (3)

    Χαχα τι τέλειο το #IF Debug
    Ούτε αυτό το ήξερα... πολύ χρήσιμο.

    - Ναι, μπορείς να φτιάξεις και δικά σου Compilation Constants π.χ. DEMO .

    (4)

    Το DataGrid δεν είναι στατικό. Ο χρήστης κάνει import ένα αρχείο, και μετά μπορεί να αλλάξει γνώμη και να κάνει import ένα άλλο αρχείο, οπότε όλα τα δεδομένα αλλάζουν.
    Επίσης το αρχείο μπορεί να περιέχει πολλές στήλες με δεδομένα, αλλά το permutation το οποίο θα γίνετε είναι για 2 στήλες μόνο, άρα το Set1 και set2 (που είναι οι 2 στήλες που θα επιλεγούν απο το datagrid) αλλάζουν επίσης. (δλδ και για ένα στατικό DataGrid το οποίο περιέχει 5 στήλες με errors, ο χρήστης μπορεί να επιλέξει μόνο 2 στήλες, όποιες θέλει, άρα το set1,2 θα αλλάζουν κάθε φορά.

    Ok.

    (5)

    'SetWhole(0, ) = Set1 ' Πριτς!
      'SetWhole(1, ) = Set2 ' Πριτς2!

    Πέεεεεεεεεεεεθανα στο γέλιο ^^ αχαχαχα μάρεσε το πρίτς :Ρ Πάντως είχα μια λογική όμως, έτσι? αφού μπορείς να πείς SetWhole(0,0) = ΜηArrayΜεταβλητή, γιατί να μην μπορείς να πεις SetWhole(0,) = Μεταβλητή1αςΔιάστασηςArray? (ρητορική ερώτηση..)

    - Δεν ξέρω.Smile

    (6)

    Έκανα τις αλλαγές σύμφωνα με αυτά που μου είπες. Ρίξε μια ματιά πλζ και πες μου τη γνώμη σου :)

        Private Sub btnPermutation_Click(sender As System.Object, e As System.EventArgsHandles btnPermutation.Click
     
            'TODO
            'If rows(1).count = rows(2).count then ...
     
            If dgvData.SelectedColumns.Count = 2 Then
                NumberOfErrors = dgvData.Rows.Count
     
                ReDim Set1(NumberOfErrors), Set2(NumberOfErrors)
     
                For i As Integer = 0 To NumberOfErrors - 1
                    Set1(i) = CDec(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value)
                    Set2(i) = CDec(dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value)
                    'MsgBox(dgvData.Item(dgvData.SelectedColumns(0).Index, i).Value.ToString & " <-> " & dgvData.Item(dgvData.SelectedColumns(1).Index, i).Value.ToString)
                Next
     
                SetWhole(0) = Set1
                SetWhole(1) = Set2
     
    #If DEBUG Then
                MsgBox(SetWhole(0)(0) & " " & SetWhole(1)(0))
    #End If
     
                Call TwoPairedSamplesPermutation(Set1, Set2)
    - ReDim Set1(NumberOfErrors - 1), Set2(NumberOfErrors - 1). Σίγουρα είναι Πολύ πιό "καθαρό" από το προηγούμενο.

    (7)
    Και πάλι ευχαριστώ πολύ για την συνεχή βοήθεια που προσφέρεις.
    Χρόνια πολλά και χαρούμενα Χριστούγεννα και πρωτοχρονιά!!!!
    Χρόνια πολλά σε Εσένα και σε όλα τα μέλη του .NETZone!

    (αν θες κοίτα λίγο και ένα module Που έφτιαξα σαν γενικό, το έκανα update κιόλλας: http://www.dotnetzone.gr/cs/forums/ShowThread.aspx?PostID=68587#68587 )
  •  28-12-2011, 19:11 68730 σε απάντηση της 68729

    Απ: Ερώτηση για Array [Vb.net 2010]

    Cool :)

    Σημείωσα λοιπών το thread σαν επιλυμένο μιας που λύθηκε η απορία μου :)


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