Почему мой конструктор последовательности не работает должным образом?

Вот что сработало для меня, по крайней мере, для входа в исходный код Android SDK:

  1. Установите платформу SDK и источники для Android SDK точно для уровня API версии Android, на которой вы находитесь во время разработки (используйте страницу истории версий Android , чтобы узнать, какой уровень API у вашего устройства есть).
  2. Скомпилируйте приложение именно для этой версии. Например, в Android Studio откройте файл build.gradle вашего приложения и установите значение compileSdkVersion соответственно.
  3. Отлаживайте приложение. Когда вы переходите в исходный файл Android SDK, вы должны увидеть правильную строку.
  4. (необязательно) Перед развертыванием перекомпилируйте последнюю версию SDK. Другими словами, измените compileSdkVersion назад.

-4
задан Remy Lebeau 20 February 2019 в 21:49
поделиться

1 ответ

Ваш конструктор выделяет массив очень хорошо (хотя убедитесь, что остальная часть вашего класса правильно реализует правило 3/5/0 ), но он не заполняет массив какими-либо начальными значениями .

Ваш insert(), с другой стороны, имеет несколько проблем:

  • он проходит через 1 слишком много элементов. Массивы имеют индекс 0, что означает, что допустимыми индексами будут 0..sz-1, поэтому вам нужно использовать < вместо <= в цикле.

  • elts[i]; на самом деле не делает ничего значимого. Он просто читает значение из массива (в случае, когда значение i совпадает со значением numElts, оно будет считываться после конца массива в окружающую память), но оно ничего не делает с этим значением.

  • if (i = position) присваивает значение position i, а затем оценивает результат этого назначения (новое значение i) как логическое выражение. Таким образом, если position равно 0, то ничего не происходит вообще, поскольку 0 оценивается как ложное, но любое другое значение будет оцениваться как истина, и каждая итерация цикла (включая упомянутое выше 1 ошибочное значение) будет назначать value указанному индексу массива по position, который сам может выйти за пределы массива, поскольку вы его не проверяете. Чтобы сравнить исходное значение i как есть со значением position, вам нужно использовать операцию сравнения == вместо оператора присваивания =.

Вместо этого попробуйте что-то вроде этого:

Sequence::Sequence(size_type sz)
{
    numElts = sz;
    elts = new int[sz];
    // or: elts = new int[sz]();

    for (size_type i = 0; i < sz; ++i) {
        elts[i] = 0;
    }
    // or: std::fill(elts, elts + sz, 0);
    // or: std::fill_n(elts, sz, 0);
}

void Sequence::insert(size_type position, value_type value)
{
    for (size_type i = 0; i < numElts; ++i) {
        if (i == position) {
            elts[i] = value;
            break;
        }
    }
}

Однако, insert() можно значительно упростить, удалив цикл полностью:

void Sequence::insert(size_type position, value_type value)
{
    // NOTE: checking for '>= 0' can be skipped if size_type is unsigned ...
    if ((position >= 0) && (position < numElts)) {
        elts[position] = value;
    } 
}
0
ответ дан Remy Lebeau 20 February 2019 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: