2009-10-10 9 views
0

Aidez-moi à comprendre ce morceau de code -Manipulation Array en C++

Après la première itération de la valeur PlcCode devient A1 *. Comment venir? Ne devrait-il pas être A *?

Code = "A1"; 
    char Wild = '*'; 
    TDataString PlcCode(Code); 

    for (int i = (Code.Len() - 1); i >= 0; i--) 
    {   
     PlcCode[i] = Wild; 
    } 
+1

Quelle classe est le code et que fait la méthode Len()? –

+2

... et qu'est-ce que TDataString? –

+0

Est-ce que ce sont les devoirs? – bcat

Répondre

3

Une autre possibilité

  • TDataString est terminée stocker des données non nul, et a un operator= basés sur des modèles acceptant des tableaux d'octets.

De cette façon, vous pourriez penser du code comme

TDataString Code(3); 
    Code[0] = 'A'; 
    Code[1] = '1'; 
    Code[2] = '\0'; 

    char Wild = '*'; 
    TDataString PlcCode(Code); 

    for (int i = 2; i >= 0; i--) 
    {    
     PlcCode[i] = Wild; 
    } 

Imaginez la mise en œuvre suivante de TDataString

struct TDataString { 
    typedef unsigned char TElement; 

public: 
    TDataString(std::size_t n):data(n) { } 

    template<typename T, std::size_t N> 
    TDataString(T const (&d)[N]):data(d, d+N) { } 

    TElement &operator[](std::size_t i) { 
    return data[i]; 
    } 

    std::size_t Len() const { return data.size(); } 

private: 
    std::vector<TElement> data; 
}; 

En utilisant cette classe, nous pouvons attribuer "A1"-Code, et il va lui donner une longueur de 3, puis en exécutant les sapins de la boucle L'itération nous amènera à A1*.

+0

Merci beaucoup. –

+0

Cela n'a de sens que si la longueur de Code * inclut * le terminateur null, ce qui serait inhabituel, c'est le moins qu'on puisse dire. Note - la longueur du code est deux, et le premier indice écrasé est (Code.Len() - 1) que je m'attendrais à être un. – Steve314

+0

@ Steve314, ce que je veux dire par "stocker des données terminées non nulles", c'est que les données ne sont pas nécessairement terminées par un caractère nul (comme c'est généralement le cas avec les chaînes "normales"). Autrement dit, vous auriez pu faire 'Code [2] = 'B';' et la longueur est toujours 3. Sinon, je pense que nommer simplement la classe 'TString' serait un meilleur choix –

3

Je vois deux scénarios possibles:

  • TDataString sature operator[ ] et utilise l'index 1 comme un début (le plus susceptible de simuler une autre langue).
  • Code.Len() ne vous donne pas la sortie prévisible.

Bien sûr, ce sont des spéculations, puisque je n'ai pas d'autres informations.

+0

S'il utilisait l'indice de base 1, le résultat serait "* 1" - l'indice 2 n'est jamais écrasé par la boucle (en supposant que Len renvoie 2). – Steve314

+0

Si TDataString surcharge [] pour imiter des tableaux, alors il commence à partir de 0 et non pas autant que je comprends du code. Je suis d'accord avec vos spéculations générales :) – AraK

+0

Désolé - cela devrait être "*" (peut-être suivi par indésirable). – Steve314