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

 

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

[C++] For Loop σε String Array

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

    [C++] For Loop σε String Array

    Καλησπέρα σε όλους!!!!! :)


    Έφυγα από την Visual Basic  (προσωρινά τουλάχιστον), και άρχισα τώρα c++ (αλλά αγνή, χωρίς header των windows ή οποιουδήποτε λειτουργικού).

    Δυστυχώς τα πράγματα είναι πολύ διαφορετικά στη c++ οπότε νιώθω ότι τώρα κάνω το πρώτο μου πρόγραμμα :S


    θέλω να κάνω ένα string function που θα έχει ένα for loop και θα παίρνει για argument ένα string* (array). θα πάει σε ότι περιέχει το array αυτό, και σειρά σειρά θα την προσθέτει σε ένα απλό string. (δλδ μετατροπή String* σε string ουσιαστικά.

    Το άτιμο, από την αρχή ακόμα με παιδεύει..

    έγραψα:

    1
    2
    3
    4
    5
    6
     
    string ArrayBox(string *Var) {
    	for (int i = 0; i < Var.size(); i++)
    	{
    
    	}
    }

    όμως μου βγάζει πρόβλημα στη μεταβλητή Var: "expression must have class type".

    Τι θέλει??? Τι θα πει "η φράση πρέπει να έχει τύπο κλάσης" ?? δεν το καταλαβαίνω..


    Αρχικά σκεφτόμουν να μεταφράσω ολόκληρο το function που είχα στην VB

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
     
    #Region "ArrayBox"
        ' => List(Of T)
        Public Function ArrayBox(Of T)(ByVal var As List(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", 1, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems => List(Of T)
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal var As List(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(doNumeriseItems, "", 1, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doDelimitItems => List(Of T)
        Public Function ArrayBox(Of T)(ByVal doDelimitItems As String, ByVal var As List(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, doDelimitItems, 0, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'SplitOnNum => List(Of T)
        Public Function ArrayBox(Of T)(ByVal SplitOnNum As Integer, ByVal var As List(Of T), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", SplitOnNum, True, var, IgnoreDelimitSpace, NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems, doDelimitItems, SplitOnNum, IgnoreNullValues, var => List(of T)
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal SplitOnNum As Integer, ByVal IgnoreNullValues As Boolean, ByVal var As List(Of T), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
    
            For i = 0 To var.Count - 1
                If var.Item(i) IsNot Nothing OrElse Not IgnoreNullValues Then
                    If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                    sbRet.Append(var.Item(i).ToString)
                    If doDelimitItems <> "" AndAlso i <> var.Count - 1 Then
                        sbRet.Append(doDelimitItems)
                        If Not IgnoreDelimitSpace Then sbRet.Append(" ")
                    End If
    
                    If SplitOnNum > 0 AndAlso (i + 1) Mod SplitOnNum = 0 AndAlso i <> var.Count - 1 Then
                        If doDelimitItems <> "" AndAlso Left(Right(sbRet.ToString, doDelimitItems.Length + 1), doDelimitItems.Length) = doDelimitItems Then
                            sbRet.Remove(sbRet.Length - (doDelimitItems.Length + 1), doDelimitItems.Length)
                        End If
                        sbRet.AppendLine()
                    ElseIf i < var.Count - 1 AndAlso doDelimitItems = "" Then
                        sbRet.Append(NonDelimitDelimiter)
                    End If
                End If
            Next
    
            If doDelimitItems <> "" AndAlso Left(Right(sbRet.ToString, doDelimitItems.Length + 1), doDelimitItems.Length) = doDelimitItems Then
                sbRet.Remove(sbRet.Length - (doDelimitItems.Length + 1), doDelimitItems.Length + 1)
            End If
    
            Return sbRet.ToString
        End Function
    
        ' => T()
        Public Function ArrayBox(Of T)(ByVal var() As T, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", 1, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems => T()
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal var() As T, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(doNumeriseItems, "", 1, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doDelimitItems => T()
        Public Function ArrayBox(Of T)(ByVal doDelimitItems As String, ByVal var() As T, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, doDelimitItems, 0, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'SplitOnNum => T()
        Public Function ArrayBox(Of T)(ByVal SplitOnNum As Integer, ByVal var() As T, Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", SplitOnNum, True, var, IgnoreDelimitSpace, NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems, doDelimitItems, SplitOnNum, IgnoreNullValues, var => T()
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal SplitOnNum As Integer, ByVal IgnoreNullValues As Boolean, ByVal var() As T, Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
    
            For i = 0 To var.Length - 1
                If (var.ToString <> "" AndAlso var(i) IsNot Nothing) OrElse Not IgnoreNullValues Then
                    If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                    sbRet.Append(var(i).ToString)
                    If doDelimitItems <> "" AndAlso i <> var.Length - 1 Then
                        sbRet.Append(doDelimitItems)
                        If Not IgnoreDelimitSpace Then sbRet.Append(" ")
                    End If
    
                    If SplitOnNum > 0 AndAlso (i + 1) Mod SplitOnNum = 0 AndAlso i <> var.Length - 1 Then
                        If doDelimitItems <> "" AndAlso Left(Right(sbRet.ToString, doDelimitItems.Length + 1), doDelimitItems.Length) = doDelimitItems Then
                            sbRet.Remove(sbRet.Length - (doDelimitItems.Length + 1), doDelimitItems.Length)
                        End If
                        sbRet.AppendLine()
                    ElseIf i < var.Length - 1 AndAlso doDelimitItems = "" Then
                        sbRet.Append(NonDelimitDelimiter)
                    End If
                End If
            Next
    
            Return sbRet.ToString
        End Function
    
        ' => IEnumerable(Of T)
        Public Function ArrayBox(Of T)(ByVal var As IEnumerable(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", 1, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems => IEnumerable(Of T)
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal var As IEnumerable(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(doNumeriseItems, "", 1, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doDelimitItems => IEnumerable(Of T)
        Public Function ArrayBox(Of T)(ByVal doDelimitItems As String, ByVal var As IEnumerable(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, doDelimitItems, 0, True, var, , NonDelimitDelimiter)
            Return Result
        End Function
        'SplitOnNum => IEnumerable(Of T)
        Public Function ArrayBox(Of T)(ByVal SplitOnNum As Integer, ByVal var As IEnumerable(Of T), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", SplitOnNum, True, var, IgnoreDelimitSpace, NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems, doDelimitItems, SplitOnNum, IgnoreNullValues, var => IEnumerable(Of T)
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal SplitOnNum As Integer, ByVal IgnoreNullValues As Boolean, ByVal var As IEnumerable(Of T), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
    
            For i = 0 To var.Count - 1
                If (var.ToString <> "" AndAlso var(i) IsNot Nothing) OrElse Not IgnoreNullValues Then
                    If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                    sbRet.Append(var(i).ToString)
                    If doDelimitItems <> "" AndAlso i <> var.Count - 1 Then
                        sbRet.Append(doDelimitItems)
                        If Not IgnoreDelimitSpace Then sbRet.Append(" ")
                    End If
    
                    If SplitOnNum > 0 AndAlso (i + 1) Mod SplitOnNum = 0 AndAlso i <> var.Count - 1 Then
                        If doDelimitItems <> "" AndAlso Left(Right(sbRet.ToString, doDelimitItems.Length + 1), doDelimitItems.Length) = doDelimitItems Then
                            sbRet.Remove(sbRet.Length - (doDelimitItems.Length + 1), doDelimitItems.Length)
                        End If
                        sbRet.AppendLine()
                    ElseIf i < var.Count - 1 AndAlso doDelimitItems = "" Then
                        sbRet.Append(NonDelimitDelimiter)
                    End If
                End If
            Next
    
            Return sbRet.ToString
        End Function
    
        ' => [ T1(), T2() ]
        Public Function ArrayBox(Of T)(ByVal var1() As T, ByVal var2() As T, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", var1, var2, , NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems => [ T1(), T2() ]
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal var1() As T, ByVal var2() As T, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(doNumeriseItems, "", var1, var2, , NonDelimitDelimiter)
            Return Result
        End Function
        'doDelimitItems => [ T1(), T2() ]
        Public Function ArrayBox(Of T)(ByVal doDelimitItems As String, ByVal var1() As T, ByVal var2() As T, Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelispan style=
            miter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, doDelimitItems, var1, var2, IgnoreDelimitSpace, NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems, doDelimitItems, SplitOnNum, IgnoreNullValues, var => [ T1(), T2() ]
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal var1() As T, ByVal var2() As T, Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
            Dim Var1Length As Integer = var1.Length
            Dim Var2Length As Integer = var2.Length
            Dim MaxLength As Integer
            If Var1Length >= Var2Length Then MaxLength = Var1Length Else MaxLength = Var2Length
    
            For i = 0 To MaxLength - 1
                If var1.Length > i OrElse var2.Length > i Then
                    If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                    If var1.Length > i Then sbRet.Append(var1(i).ToString) Else sbRet.Append(" ")
    
                    If doDelimitItems <> "" Then
                        sbRet.Append(doDelimitItems)
                        If Not IgnoreDelimitSpace Then sbRet.Append(" ")
                    Else
                        sbRet.Append(NonDelimitDelimiter)
                    End If
    
                    If var2.Length > i Then sbRet.Append(var2(i).ToString) Else sbRet.Append(" ")
    
                    If i <> MaxLength - 1 Then sbRet.AppendLine()
                End If
            Next
    
            If doDelimitItems <> "" AndAlso Left(Right(sbRet.ToString, doDelimitItems.Length + 1), doDelimitItems.Length) = doDelimitItems Then
                sbRet.Remove(sbRet.Length - (doDelimitItems.Length + 1), doDelimitItems.Length)
            End If
    
            Return sbRet.ToString
        End Function
    
        ' => [ List(Of T2), List(Of T2) ]
        Public Function ArrayBox(Of T)(ByVal var1 As List(Of T), ByVal var2 As List(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", var1, var2, , NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems => [ List(Of T2), List(Of T2) ]
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal var1 As List(Of T), ByVal var2 As List(Of T), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(doNumeriseItems, "", var1, var2, , NonDelimitDelimiter)
            Return Result
        End Function
        'doDelimitItems => [ List(Of T2), List(Of T2) ]
        Public Function ArrayBox(Of T)(ByVal doDelimitItems As String, ByVal var1 As List(Of T), ByVal var2 As List(Of T), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, doDelimitItems, var1, var2, IgnoreDelimitSpace, NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems, doDelimitItems, SplitOnNum, IgnoreNullValues, var => [ List(of T1), List(of T2) ]
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal var1 As List(Of T), ByVal var2 As List(Of T), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
            Dim Var1Length As Integer = var1.Count
            Dim Var2Length As Integer = var2.Count
            Dim MaxLength As Integer
            If Var1Length >= Var2Length Then MaxLength = Var1Length Else MaxLength = Var2Length
    
            For i = 0 To MaxLength - 1
                If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                If var1.Count >= i Then sbRet.Append(var1.Item(i).ToString) Else sbRet.Append(" ")
    
                If doDelimitItems <> "" Then
                    sbRet.Append(doDelimitItems)
                    If Not IgnoreDelimitSpace Then sbRet.Append(" ")
                Else
                    sbRet.Append(NonDelimitDelimiter)
                End If
    
                If var2.Count >= i Then sbRet.Append(var2.Item(i).ToString) Else sbRet.Append(" ")
    
                If i <> MaxLength - 1 Then sbRet.AppendLine()
            Next
    
            Return sbRet.ToString
        End Function
    
        ' => [ List(Of Double()) ]
        Public Function ArrayBox(ByVal var As List(Of Double()), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, "", var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems => [ List(Of Double() ]
        Public Function ArrayBox(ByVal doNumeriseItems As Boolean, ByVal var As List(Of Double()), Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(doNumeriseItems, "", var, , NonDelimitDelimiter)
            Return Result
        End Function
        'doDelimitItems => [ List(Of Double() ]
        Public Function ArrayBox(ByVal doDelimitItems As String, ByVal var As List(Of Double()), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim Result As String = ArrayBox(False, doDelimitItems, var, IgnoreDelimitSpace, NonDelimitDelimiter)
            Return Result
        End Function
        'doNumeriseItems, doDelimitItems, SplitOnNum, IgnoreNullValues, var => [ List(Of Double() ]
        Public Function ArrayBox(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal var As List(Of Double()), Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
            Dim LastRowIndex As Integer
            For i = 0 To var.Count - 1
                If var(i).Length > LastRowIndex Then LastRowIndex = var(i).Length
            Next
    
            For i = 0 To LastRowIndex - 1
                If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                For j = 0 To var.Count - 1
                    If var.Item(j).Length > i Then sbRet.Append(var.Item(j)(i)) Else sbRet.Append(" ")
                    If doDelimitItems <> "" Then
                        If j <> var.Count - 1 Then sbRet.Append(doDelimitItems)
                        If j <> var.Count - 1 AndAlso Not IgnoreDelimitSpace Then sbRet.Append(" ")
    
                    ElseIf j <> var.Count - 1 Then
                        sbRet.Append(NonDelimitDelimiter)
                    End If
    
                Next
    
                If i <> LastRowIndex - 1 Then sbRet.AppendLine()
            Next
    
            Return sbRet.ToString
        End Function
    #End Region

    όμως βλέποντας ότι κολλάω σε αυτό.. αναθεώρησα.. και τώρα λέει να σταθώ σε μια απλή αλλαγή του string* σε string...

    /spancolor: #666666;background-color: #e4e4e4;font-family: Courier New;font-size: 11px;font-weight: normal;color: Green;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal; ArrayBox(Return
  •  20-02-2013, 15:23 72173 σε απάντηση της 72170

    Απ: [C++] For Loop σε String Array

    Σου σκάει γιατί κατ' αρχήν θέλει να κάνεις dereference τον δείκτη σου.

    (*var).size() ή πιό απλά var->size().

    Επίσης δεν καταλαβαίνω τι θέλεις να κάνεις με το size().

    Θα σου δείχνει το μήκος του 1ου element του array πάντα και θα κάνει for τόσες φορές όσες είναι αυτό.

  •  20-02-2013, 15:35 72174 σε απάντηση της 72173

    Απ: [C++] For Loop σε String Array

    Η χρήση pointers και απλών array στην C++ είναι εντελώς απαρχαιωμένη και οδηγεί σε άπειρα bugs. Καταρχήν, η C++ έχει references (& αντί για *) οπότε δεν χρειάζεται να χρησιμοποιήσει κανείς pointers, ούτε χρειάζεται pointer arithmetic. Δεύτερον, το Standard Template Library έχει πάρα πολλά και χρήσιμα containers και αλγόριθμους για να κάνει κανείς ό,τι θέλει. Από τη στιγμή που χρησιμοποιείς μία κλάση του STL (την string) γιατί να μην χρησιμοποιήσεις και τις άλλες? Αντί για χύμα array, μπορείς να χρησιμοποιήσεις την vector.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-02-2013, 16:09 72175 σε απάντηση της 72173

    Απ: [C++] For Loop σε String Array

     
    Libra Storm:

    Σου σκάει γιατί κατ' αρχήν θέλει να κάνεις dereference τον δείκτη σου.

    (*var).size() ή πιό απλά var->size().

    Επίσης δεν καταλαβαίνω τι θέλεις να κάνεις με το size().

    Θα σου δείχνει το μήκος του 1ου element του array πάντα και θα κάνει for τόσες φορές όσες είναι αυτό.

    Όχι, όχι! Δεν θέλω το μήκος του πρώτου element.. θέλω το πλήθος των elements που υπάρχουν στο array.

    Ουσιαστικά θέλω να πω "για ι=0 έως όσα elements έχει το string array, βάλε το κάθε string του array σε ένα απλό string προσθέτοντας ένα NewLine (\n) την κάθε φορά"

    δηλαδή θέλω να κάνω strip down αυτό το function που είχα σε VB:

    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
     
        Public Function ArrayBox(Of T)(ByVal doNumeriseItems As Boolean, ByVal doDelimitItems As String, ByVal SplitOnNum As Integer, ByVal IgnoreNullValues As Boolean, ByVal var() As T, Optional ByVal IgnoreDelimitSpace As Boolean = False, Optional ByVal NonDelimitDelimiter As String = ControlChars.Tab) As String
            Dim sbRet As New StringBuilder
    
            For i = 0 To var.Length - 1
                If (var.ToString <> "" AndAlso var(i) IsNot Nothing) OrElse Not IgnoreNullValues Then
                    If doNumeriseItems Then sbRet.Append(i + 1).Append(") ")
    
                    sbRet.Append(var(i).ToString)
                    If doDelimitItems <> "" AndAlso i <> var.Length - 1 Then
                        sbRet.Append(doDelimitItems)
                        If Not IgnoreDelimitSpace Then sbRet.Append(" ")
                    End If
    
                    If SplitOnNum > 0 AndAlso (i + 1) Mod SplitOnNum = 0 AndAlso i <> var.Length - 1 Then
                        If doDelimitItems <> "" AndAlso Left(Right(sbRet.ToString, doDelimitItems.Length + 1), doDelimitItems.Length) = doDelimitItems Then
                            sbRet.Remove(sbRet.Length - (doDelimitItems.Length + 1), doDelimitItems.Length)
                        End If
                        sbRet.AppendLine()
                    ElseIf i < var.Length - 1 AndAlso doDelimitItems = "" Then
                        sbRet.Append(NonDelimitDelimiter)
                    End If
                End If
            Next
    
            Return sbRet.ToString
        End Function

    Σε ένα τέλειο κόσμο, θα έγραφα όλο το function αυτό, όμως προς το παρόν θα αρκεστώ στο να δουλέψει το stripped down version.

    Παναγιώτης Καναβός:
    Η χρήση pointers και απλών array στην C++ είναι εντελώς απαρχαιωμένη και οδηγεί σε άπειρα bugs.

    Ότι έμαθα το διάβασα από το http://www.cplusplus.com/doc/tutorial/

    Για την ακρίβεια, το διάβασα όλο, από το "Instructions for use" μέχρι "Polymorphism" μέχρι "Preprocessor directives" μέχρι και το τέλος "Input/Output with files".

    Όμως, αν και έχω γράψει πολυμορφική κλάση, υπάρχουν τόσα πολλά απλά πράγματα που δεν ξέρω να κάνω ακόμα.

    Παναγιώτης Καναβός:
    Καταρχήν, η C++ έχει references (& αντί για *) οπότε δεν χρειάζεται να χρησιμοποιήσει κανείς pointers, ούτε χρειάζεται pointer arithmetic.
     

    Δεν καταλαβαίνω για τι πράγμα μιλάς. Πες σε παρακαλώ λίγο πιο συγκεκριμένα σε ποιο πράγμα αναφέρεσαι. 

     

    Παναγιώτης Καναβός:
    Δεύτερον, το Standard Template Library έχει πάρα πολλά και χρήσιμα containers και αλγόριθμους για να κάνει κανείς ό,τι θέλει. Από τη στιγμή που χρησιμοποιείς μία κλάση του STL (την string) γιατί να μην χρησιμοποιήσεις και τις άλλες? Αντί για χύμα array, μπορείς να χρησιμοποιήσεις την vector.

    Θα ήθελα να χρησιμοποιήσω και τις άλλες. Αλλά ποιες είναι? και πως χρησιμοποιούνται?

    Την Vector την προσπάθησα, αλλά έφτασα σε dead end... θα χρειαστώ μερικά παραδείγματα για να μπορέσω να τη χρησιμοποιήσω επαρκώς. Είναι ουσιαστικά σαν το "List (of Κάτι)" που χρησιμοποιούσα στην VB και ήταν το αγαπημένο μου! Αυτό επειδή είχε dynamic allocation και μπορούσα να γράψω ListVariable.Add(Kati) και μετά να πατήσω και ένα ListVariable.ToArray και να έχω Array με το σωστό πλήθος απευθείας. Γενικά είχε πολλά καλά και βόλευε τόσο πολύ!


  •  20-02-2013, 16:27 72176 σε απάντηση της 72175

    Απ: [C++] For Loop σε String Array

    Δεν μπορείς να μάθεις μία γλώσσα όπως η C++ διαβάζοντας ένα tutorial. Η προηγούμενη γνώση VB δεν μετράει. Ένα πολύ καλό εισαγωγικό βιβλιο είναι το Accelerated C++, το οποίο φροντίζει να σου πει να ΜΗΝ χρησιμοποιήσεις pointers. Υπάρχουν και άλλα καλά εισαγωγικά (αν και αρκετά μεγαλύτερα) όπως το C++ Primer του Lippmann. Όλως τυχαίως, θα τα βρεις όλα στην ίδια σελίδα του Amazon.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  20-02-2013, 18:36 72177 σε απάντηση της 72176

    Απ: [C++] For Loop σε String Array

    Παναγιώτης Καναβός:
    Δεν μπορείς να μάθεις μία γλώσσα όπως η C++ διαβάζοντας ένα tutorial. Η προηγούμενη γνώση VB δεν μετράει. Ένα πολύ καλό εισαγωγικό βιβλιο είναι το Accelerated C++, το οποίο φροντίζει να σου πει να ΜΗΝ χρησιμοποιήσεις pointers. Υπάρχουν και άλλα καλά εισαγωγικά (αν και αρκετά μεγαλύτερα) όπως το C++ Primer του Lippmann. Όλως τυχαίως, θα τα βρεις όλα στην ίδια σελίδα του Amazon.

    Ευχαριστώ.

    Θα τα έχω υπόψη μου τα βιβλία και με την πρώτη ευκαιρία θα τα διαβάσω (btw δεν χρειάζομαι να μάθω το 100% της c++, απλώς κάποιες γνώσεις για να μπορώ να προγραμματίσω βασικά πράγματα).

    Προς το παρόν όμως, με τη σχολή (ηλεκτρολογίας), τα papers και την ερευνιτική ομάδα, δεν μου περισσεύει καθόλου χρόνος για βιβλίο σε c++ :( έχω ακόμα να τελειώσω το βιβλίο για Small Angle X-ray Scattering, και να θυμηθώ fourier, πολλαπλά ολοκληρώματα και πολλά άλλα ώστε να βγει το paper...

    Άρα πίσω στο original θέμα του topic: Πως μπορώ να κάνω ένα loop που θα διαβάζει ένα-ένα τα string που περιέχονται σε ένα string[Array]? (εξηγώ αναλυτικότατα παραπάνω το τι ακριβώς θέλω να πετύχω.)



  •  21-02-2013, 01:19 72178 σε απάντηση της 72177

    Απ: [C++] For Loop σε String Array

    Στο for loop πρέπει να βάλεις μόνος σου τις διαστάσεις του array,πχ:
    void ArrayBox(string *Var,int N) {
    	for (int i = 0; i <N; i++)
    	{
               //do sth with Var[ i ]
    	}
    }


    Βέβαια υπάρχει τρόπος να βρεις το μέγεθος του array αν η συνάρτησή σου γραφτεί κάπως έτσι:
    template<size_t N>void ArrayBox(string (&Var)[ N ]) {
    	for (int i = 0; i <N; i++)
    	{
               //do sth with Var[ i ]
    	}
    }

    Σε αυτήν όμως τη συνάρτηση πρέπει να περάσεις αυστηρά το ίδιο το array,όχι ένα δείκτη προς αυτό (χρησιμοποιώντας reference to array αποφεύγεις να μετατραπεί σε δείκτη το ίδιο το όνομα του array).
    Έτσι η συνάρτηση μπορεί να χρησιμοποιηθεί ως εξής:

    string strarray[ ]={"Mpampis","Nikos","Soula"};
    string *strarrayptr=strarray;
    ArrayBox(strarray);//correct use
    ArrayBox(strarrayptr);//wrong!code won't even compile

    Σαφώς πιο περιορισμένη και λειτουργεί αυστηρά με static arrays,δεν κοίταξα αναλυτικά τον κώδικα της VB να δω ποια έκδοση σε καλύπτει καλύτερα.
  •  21-02-2013, 15:22 72180 σε απάντηση της 72178

    Απ: [C++] For Loop σε String Array

    αααα, άρα μπορείς να κάνεις array που δεν είναι Pointer! Δεν το ήξερα... στο site που διάβαζα c++ έλεγε ότι εξ'ορισμού το array είναι pointer

    Νομίζω ότι το δεύτερο κομμάτι κώδικα είναι αυτό που χρειάζομαι. Ευχαριστώ :)

    Θα το δοκιμάσω και θα κάνω reply με το αν πέτυχε ή όχι.


  •  07-03-2013, 22:33 72259 σε απάντηση της 72180

    Απ: [C++] For Loop σε String Array

    ok, το έκανα να δουλέψει!

    Σας ευχαριστώ όλους για τη βοήθεια :)


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