2009-10-10 2 views
0

Помогите мне понять этот кусок кода -Массив Манипуляции в C++

После первой итерации значение PlcCode становится A1 *. Как так? Разве это не A *?

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

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

Какой класс является кодом и что делает метод Len()? –

+2

... и что такое TDataString? –

+0

Это домашнее задание? – bcat

ответ

3

Другой возможность

  • TDataString хранит ненулевые данные прекращаются, и имеет шаблонные operator= прием массивов байт.

Таким образом, вы могли бы думать о коде, как

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; 
    } 

Представьте себе следующую реализацию 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; 
}; 

Используя этот класс, мы можем назначить "A1" к Code, и он даст ему длину 3, а затем выполнит пик цикла t итерация приведет нас к A1*.

+0

Большое спасибо. – 2009-10-10 20:40:49

+0

Это имеет смысл только в том случае, если длина кода * включает в себя * нулевой ограничитель, что было бы необычным, если не сказать больше. Примечание. Длина кода равна двум, а первый подстрочный индекс (Code.Len() - 1), который я ожидал бы быть одним. – Steve314

+0

@ Steve314, что я имею в виду с «хранением ненулевых завершенных данных», заключается в том, что данные не обязательно завершаются нулем (как это обычно бывает с «нормальными» строками). То есть вы могли бы сделать «Code [2] =« B »;» и длина по-прежнему равна 3. В противном случае я думаю, что простое имя класса «TString» было бы лучшим выбором –

3

Я вижу два возможных сценария:

  • TDataString перегружает operator[ ] и использует индекс 1, как начать (скорее всего, для имитации другого языка).
  • Code.Len() не дает вам прогнозируемого выхода.

Конечно, это спекуляции, так как у меня нет никакой другой информации.

+0

Если он использовал подписку base 1, результатом будет «* 1» - индекс 2 никогда не перезаписывается циклом (при условии, что Len возвращает 2). – Steve314

+0

Если TDataString перегружает [], чтобы имитировать массивы, тогда он начинается с 0, а не 1, насколько я понимаю из кода. Я согласен с вашими полными спекуляциями :) – AraK

+0

Извините - это должно быть «*» (возможно, за ним следует мусор). – Steve314

Смежные вопросы