приемлемая фиксация для большинства предупреждений со знаком/неподписанных?

Используйте Rows.Add без параметра, и новая строка будет вставлена ​​в конец таблицы. Параметр (как указано в разделе справки для Rows.Add) позволяет коду вставлять новые строки перед конкретной строкой.

Чтобы работать с новой строкой, объявите переменную объекта и присвойте ей строку при ее создании. Это также хорошая идея сделать это с объектом Table. Таким образом, можно обращаться к объектам напрямую, вместо того, чтобы всегда использовать что-то вроде rng.Tables(index).Rows(index), это не только проще читать и писать, он также выполняется быстрее.

Итак, основываясь на коде в вопросе, моя рекомендация:

Dim tbl as Word.Table, rw as Word.Row
Set tbl = rng.Tables(1)
Set rw = tbl.Rows.Add
rw.Cells(1).Range.Text = "cell content"
rw.Cells(2).Range.Text = "other cell content"
9
задан Tobi 9 November 2008 в 11:56
поделиться

6 ответов

Я сделал эту общественную Wiki... Отредактируйте его. Я больше не соглашаюсь с советом против "интервала". Я теперь рассматриваю его как не плохо.

Да, я соглашаюсь с Richard. Вы никогда не должны использовать 'int' как переменная подсчета в цикле как те. Следующее - то, как Вы могли бы хотеть сделать различные циклы с помощью индексов (хотя существует мало причины для, иногда это может быть полезно).

Передать

for(std::vector<int>::size_type i = 0; i < someVector.size(); i++) {
    /* ... */
}

Назад

Можно сделать это, которое отлично определяется behaivor:

for(std::vector<int>::size_type i = someVector.size() - 1; 
    i != (std::vector<int>::size_type) -1; i--) {
    /* ... */
}

Скоро, с C++ 1x (следующая версия C++) приходящий приятно, можно сделать это как это:

for(auto i = someVector.size() - 1; i != (decltype(i)) -1; i--) {
    /* ... */
}

Постепенное уменьшение ниже 0 заставит i повторяться, потому что это не подписано.

Но неподписанный заставит ошибки хлебать в

Это никогда не должно быть аргументом для создания этого неправильным путем (использование 'int').

Почему бы не использовать станд.:: size_t выше?

Стандарт C++ определяет в 23.1 p5 Container Requirements, это T::size_type , для T быть некоторыми Container, то, что этот тип является некоторой реализацией, определило неподписанный целочисленный тип. Теперь, использование std::size_t для i выше позволит ошибкам хлебать в тихо. Если T::size_type меньше или больше, чем std::size_t, затем это переполнится i, или даже не доберитесь (std::size_t)-1 если someVector.size() == 0. Аналогично, условие цикла было бы нарушено полностью.

3
ответ дан 4 December 2019 в 10:34
поделиться

Не происходите публично из контейнеров STL. У них есть невиртуальные деструкторы, который вызывает неопределенное поведение, если кто-либо удаляет один из Ваших объектов через указатель - для базирования. Если необходимо произойти, например, из вектора, сделайте это конфиденциально и выставьте части, с которыми необходимо выставить using объявления.

Здесь, я просто использовал бы a size_t как переменная цикла. Это просто и читаемо. Плакат, кто прокомментировал то использование int индекс подвергает Вас, поскольку n00b корректен. Однако использование итератора для цикличного выполнения по вектору подвергает Вас как немного более опытный n00b - тот, кто не понимает, что нижний оператор для вектора является постоянным временем. (vector<T>::size_type точный, но напрасно подробный IMO).

7
ответ дан 4 December 2019 в 10:34
поделиться

В то время как я не думаю "итераторы использования, иначе Вы смотрите, n00b" является хорошим решением проблемы, происходящей из станд.:: вектор кажется намного хуже, чем это.

Во-первых, разработчики действительно ожидают, что вектор будет std:.vector и отобразится, чтобы быть станд.:: карта. Во-вторых, Ваше решение не масштабируется для других контейнеров, или для других классов/библиотек, которые взаимодействуют с контейнерами.

Да, итераторы ужасны, циклы итератора не являются очень хорошо читаемыми, и определениями типов, только покрывают путаницу. Но по крайней мере, они действительно масштабируются, и они - каноническое решение.

Мое решение? stl-each макрос. Это не без проблем (главным образом, это - макрос, фу), но это объясняет значение. Это столь не совершенствуется как например, этот, но делает задание.

4
ответ дан 4 December 2019 в 10:34
поделиться

Вы сверхдумаете проблема.

Используя size_t переменную предпочтительно, но если Вы не доверяете своих программистов для использования неподписанный правильно, пойдите с броском и просто имейте дело с уродством. Заставьте интерн изменять их всех и не волноваться об этом после этого. Включите предупреждения как ошибки, и никакие новые не закрадутся. Ваши циклы могут быть "ужасными" теперь, но можно понять что как последствия религиозной позиции по со знаком по сравнению с неподписанным.

0
ответ дан 4 December 2019 в 10:34
поделиться

Определенно используйте итератор. Скоро Вы сможете использовать 'автоматический' тип для лучшей удобочитаемости (одна из Ваших проблем) как это:

for (auto i = someVector.begin();
     i != someVector.end();
     ++i)
3
ответ дан 4 December 2019 в 10:34
поделиться

vector.size() возвраты a size_t var, поэтому просто изменитесь int кому: size_t и это должно быть прекрасным.

Ответ Richard более корректен, за исключением того, что это - большая работа для простого цикла.

0
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

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