Посмотрите внимательно, сколько скобок имеет ваш массив. Я встретил пример, когда функция вернула ответ с дополнительной скобкой, например:
>>>approx
array([[[1192, 391]],
[[1191, 409]],
[[1209, 438]],
[[1191, 409]]])
И это не сработало
>>> approx[1,1]
IndexError: index 1 is out of bounds for axis 1 with size 1
. Это может открыть скобки:
>>> approx[:,0]
array([[1192, 391],
[1191, 409],
[1209, 438],
[1191, 409]])
Теперь можно использовать стандартную запись доступа к элементу:
>>> approx[:,0][1,1]
409
Правила (который не изменился в C++ 11):
std
, пространство имен резервируется. (Вам разрешают добавить шаблонные специализации, все же.) Из Стандарта C++ 2003 года:
17.4.3.1.2 Глобальных набора [lib.global.names]
Certain имен имен и функциональных подписей всегда резервируются к реализации:
- Каждое имя, которое содержит двойное подчеркивание (
__
) или начинается с подчеркивания, сопровождаемого прописной буквой (2.11), резервируется к реализации для любого использования.- Каждое имя, которое начинается с подчеркивания, резервируется к реализации для использования в качестве имени в глобальном пространстве имен. <глоток> 165 глоток>
<глоток> 165) глоток> Такие имена также резервируются в пространстве имен
::std
(17.4.3.1).
, поскольку C++ основан на стандарте C (1.1/2, C++ 03), и C99 является нормативной ссылкой (1.2/1, C++ 03), они также применяются с 1999 C Стандарт:
7.1.3 Зарезервированных идентификатора
Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в его связанном подпункте, и дополнительно объявляет или определяет идентификаторы, перечисленные в его связанном будущем подпункте направлений библиотеки и идентификаторах, которые всегда резервируются или для любого использования или для использования в качестве идентификаторов объема файла.
- Все идентификаторы, которые начинаются с подчеркивания и или прописная буква или другое подчеркивание, всегда резервируются для любого использования.
- Все идентификаторы, которые начинаются с подчеркивания, всегда резервируются для использования в качестве идентификаторов с объемом файла и в пробелах обычного и в имени тега.
- Каждое макро-имя в любом из следующих подпунктов (включая будущие направления библиотеки) резервируется для использования, как определено, если какой-либо из его связанных заголовков включен; если явно не указано иначе (см. 7.1.4).
- Все идентификаторы с внешней связью в любом из следующих подпунктов (включая будущие направления библиотеки) всегда резервируются для использования в качестве идентификаторов с внешней связью. <глоток> 154 глоток>
- Каждый идентификатор с объемом файла, перечисленным в любом из следующих подпунктов (включая будущие направления библиотеки), резервируется для использования в качестве макро-имени и в качестве идентификатора с объемом файла в том же пространстве имен, если какой-либо из его связанных заголовков включен.
Никакие другие идентификаторы не резервируются. Если программа объявляет или определяет идентификатор в контексте, в котором она резервируется (кроме, как позволено 7.1.4) или определяет зарезервированный идентификатор как макро-имя, поведение не определено.
, Если программа удаляет (с
#undef
) какое-либо макроопределение идентификатора в первой упомянутой выше группе, поведение не определено.<глоток> 154) глоток> список зарезервированных идентификаторов с внешней связью включает
errno
,math_errhandling
,setjmp
, иva_end
.
Другие ограничения могли бы применяться. Например, стандарт POSIX резервирует много идентификаторов, которые, вероятно, обнаружатся в нормальном коде:
E
, следовали за цифрой или прописной буквой: is
или to
сопровождаемый строчной буквой LC_
сопровождаемый прописной буквой l
, резервируются SIG
сопровождаемый прописной буквой, резервируются SIG_
сопровождаемый прописной буквой, резервируются str
, mem
, или wcs
сопровождаемый строчной буквой, резервируются PRI
или SCN
сопровождаемый любой строчной буквой или X
, резервируются При использовании этих названий собственных целей прямо сейчас не мог бы вызвать проблему, они действительно указывают на возможность конфликта с будущими версиями того стандарта.
<час>Лично я просто не запускаю идентификаторы с подчеркиваний. Новое дополнение к моему правилу: не используйте двойные подчеркивания нигде, который легок, поскольку я редко использую подчеркивание.
После проведения исследований в области этой статьи я больше не заканчиваю свои идентификаторы [1 123], поскольку это резервируется стандартом POSIX.
правило о любом идентификаторе, заканчивающемся [1 124], удивило меня много. Я думаю, что это - стандарт POSIX (не уверенный все же) поиск разъяснения и официальной главы и стиха. Это от GNU libtool руководство , перечисляя зарезервированные имена.
CesarB обеспечил следующую ссылку на POSIX 2004 зарезервированные символы и примечания, 'которыми много других зарезервированных префиксов и суффиксов... могут быть найдены там'. POSIX 2008 зарезервированные символы определяются здесь. Ограничения несколько более детальны, чем те выше.
Что касается другой части вопроса, распространено поместить подчеркивание в конец из имени переменной для не столкновения с чем-либо внутренним.
я делаю это ровные внутренние классы и пространства имен, потому что я тогда только еще должен помнить одно правило (по сравнению с "в конце имени в глобальной области видимости, и начало имени везде").
Да, подчеркивания могут использоваться где угодно в идентификаторе. Я полагаю, что правила: любой из a-z, A-Z, _ в первом символе и тех + 0-9 для следующих символов.
префиксы Подчеркивания распространены в коде C - одинарное подчеркивание означает, что "частные", и двойные подчеркивания обычно резервируются для использования компилятором.
От MSDN:
Использование двух последовательных символов подчеркивания (__) в начале идентификатора или единственного начального символа подчеркивания, сопровождаемого прописной буквой, резервируется для реализаций C++ во всех объемах. Необходимо избегать использования одного начального символа подчеркивания, сопровождаемого строчной буквой для имен с объемом файла из-за возможных конфликтов с текущими или будущими зарезервированными идентификаторами.
Это означает, что можно использовать одинарное подчеркивание в качестве членского префикса переменной, пока это сопровождается строчной буквой.
Это, по-видимому, взято от раздела 17.4.3.1.2 из стандарта C++, но я не могу найти первоисточник для полного стандарта онлайн.
См. также этот вопрос .
Правила избежать коллизии имен находятся оба в стандарте C++ (см. книгу Stroustrup), и упомянул гуру C++ (Sutter, и т.д.).
, поскольку я не хотел иметь дело со случаями и хотел простое правило, я разработал персональный то, которое и просто и корректно:
При именовании символа, Вы избежите коллизии с библиотеками компилятора/ОС/стандарта если Вы:
, Конечно, помещая Ваш код в уникальное пространство имен помогает избежать коллизии, также (но не защитит от злых макросов)
(я использую макросы, потому что они - более загрязняющие код из символов C/C++, но это могло быть что-либо от имени переменной до имени класса)
#define _WRONG
#define __WRONG_AGAIN
#define RIGHT_
#define WRONG__WRONG
#define RIGHT_RIGHT
#define RIGHT_x_RIGHT
От n3242.pdf файл (я ожидаю, что заключительный стандартный текст будет подобен):
17.6.3.3.2 Глобальных набора [global.names]
Certain имен имен и функциональных подписей всегда резервируются к реализации:
— Каждое имя, которое содержит двойное подчеркивание _ _ или начинается с подчеркивания, сопровождаемого прописной буквой (2.12), резервируется к реализации для любого использования.
— Каждое имя, которое начинается с подчеркивания, резервируется к реализации для использования в качестве имени в глобальном пространстве имен.
, Но также и:
17.6.3.3.5 Пользовательских литеральных Литерала суффиксов [usrlit.suffix]
снабжают суффиксом идентификаторы, которые не запускаются с подчеркивания, резервируются для будущей стандартизации.
Этот последний пункт сбивает с толку, если Вы не полагаете, что имя, запускающееся с одного подчеркивания и сопровождаемый строчной буквой, было бы в порядке, если бы не определил в глобальном пространстве имен...