|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
если имеем 3 файла main.cpp , constants.cpp, constants.hpp, то вот это не компилируется : constants.cpp: Код: plaintext 1. 2.
constants.hpp: Код: plaintext 1. 2. 3. 4.
main.cpp : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
но если это сделать в одном файле, то всё ОК: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.07.2021, 22:05 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81 constants.hpp: Код: plaintext 1. 2. 3. 4.
sizeof() дает размер типа данных, а не размер конкретного экземпляра этого типа в памяти. Ну ты "недоопределил" тип данных массива arr, указав []. Определение для const должно быть тут же, в объявлении, если бы не extern. Но ты указал extern, в итоге, в .hpp имеем лишь указатель на где-то определенные данные, связь с определением в .cpp переложена на момент линковки. Main() ничего не знает об определении, видит только объявление, вот и "ругается". Определи в .hpp, и всё будет хорошо. Ну, если не забывать возможности повторного объявления (используй inline). :) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 00:06 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ andron81 constants.hpp: Код: plaintext 1. 2. 3. 4.
sizeof() дает размер типа данных, а не размер конкретного экземпляра этого типа в памяти. Ну ты "недоопределил" тип данных массива arr, указав []. Определение для const должно быть тут же, в объявлении, если бы не extern. Но ты указал extern, в итоге, в .hpp имеем лишь указатель на где-то определенные данные, связь с определением в .cpp переложена на момент линковки. Main() ничего не знает об определении, видит только объявление, вот и "ругается". Определи в .hpp, и всё будет хорошо. Ну, если не забывать возможности повторного объявления (используй inline). :) опредеделять в hpp разве по феншую ? ) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 08:22 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, если новая версия компилятора и нужна глобальная переменная - то да, рекомендуют. Из плюсов: например, меньше вероятность получить облом "повтор имени" на этапе линковки: главное, чтобы имя переменной было уникально лишь в рамках единицы компиляции. Ну и - как у тебя, тип сразу известен. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 08:40 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ andron81 constants.hpp: Код: plaintext 1. 2. 3. 4.
sizeof() дает размер типа данных, а не размер конкретного экземпляра этого типа в памяти. Ну ты "недоопределил" тип данных массива arr, указав []. Определение для const должно быть тут же, в объявлении, если бы не extern. Но ты указал extern, в итоге, в .hpp имеем лишь указатель на где-то определенные данные, связь с определением в .cpp переложена на момент линковки. Main() ничего не знает об определении, видит только объявление, вот и "ругается". Определи в .hpp, и всё будет хорошо. Ну, если не забывать возможности повторного объявления (используй inline). :) сегодня я это переварил. прихожу к выводу , что лучше писать размер во всех файлах . вот так arr[4][4] ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 11:55 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, Ещё можно std::array использовать. В нем есть информация о размере и тапе элемента. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 12:41 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ Ещё можно std::array использовать. А ещё лучше std::vector. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 13:31 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ andron81, если новая версия компилятора и нужна глобальная переменная - то да, рекомендуют. Из плюсов: например, меньше вероятность получить облом "повтор имени" на этапе линковки: главное, чтобы имя переменной было уникально лишь в рамках единицы компиляции. Ну и - как у тебя, тип сразу известен. Т.е. вы хотите сказать, что в новом стандарте С++ переменную определяют в *.h с помощью спецификатора inline? Мне кажется, вы не слишком ясно выразились. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 18:47 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
petravТ.е. вы хотите сказать, что в новом стандарте С++ переменную *определяют* в *.h с помощью спецификатора inline? Вы не поверите... https://en.cppreference.com/w/cpp/language/inline Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 18:54 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravТ.е. вы хотите сказать, что в новом стандарте С++ переменную *определяют* в *.h с помощью спецификатора inline? Вы не поверите... https://en.cppreference.com/w/cpp/language/inline Т.е. можно не писать так: Код: plaintext 1. 2. 3. 4.
А просто написать: Код: plaintext 1. 2.
Я не знал об этом. Нужно поискать статью на Хабре. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 19:21 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ andron81, если новая версия компилятора и нужна глобальная переменная - то да, рекомендуют. Окей, с этим разобрались. Определяем глобальную переменную как inline в *.h. ъъъъъ Из плюсов: например, меньше вероятность получить облом "повтор имени" на этапе линковки: главное, чтобы имя переменной было уникально лишь в рамках единицы компиляции. Ну и - как у тебя, тип сразу известен. Но тут то, что написано и как это понять? Складывается впечатление, что переменная определённая в *.h как inline становится static (аналог анонимного пространства имён). Но я вижу, что это не так. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 19:58 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
petrav, есть вопрос? Cформулируй. "Как это понять?" - не вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 20:50 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
petrav Но тут то, что написано и как это понять? Складывается впечатление, что переменная определённая в *.h как inline становится static (аналог анонимного пространства имён). Но я вижу, что это не так. Тут все написано https://en.cppreference.com/w/cpp/language/inline Из всех копий inline остается только одна глобальная переменная. Так же как и с функциями. Основное достоинство inline переменных по сравнению с extern - возможность реализации любых header-only библиотек. Вспомогательная фича - они устраняют во многих случаях так называемый Initialization Order Fiasco , когда порядок инициализации между единицами трансляции не гарантируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 20:54 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
C extern: Пусть a.h Код: plaintext 1.
b.h Код: plaintext 1.
Тогда: 1. c.cpp Код: plaintext 1.
- компилируется, но не собирается. 2. c.cpp Код: plaintext 1. 2. 3. 4. 5.
- тоже компилируется и собирается, при линковке все ссылки на x разрешаются объектом в a.obj. 3. c.cpp Код: plaintext 1. 2. 3.
- тоже компилируется и собирается, при линковке все ссылки на x разрешаются объектом в a.obj. ~~~~~~~~~~~~~~~~~~ С inline. Пусть a.h Код: plaintext 1.
b.h Код: plaintext 1.
Тогда: c.cpp Код: plaintext 1. 2.
- не скомпилируется: повторное определение и многократная инициализация в рамках одной единицы компиляции c.cpp. Дополнительно. a.cpp Код: plaintext 1. 2.
b.cpp Код: plaintext 1. 2.
c.h Код: plaintext 1. 2.
тогда: c.cpp Код: plaintext 1. 2. 3. 4. 5. 6.
- компилируется и собирается, получаем разные "глобальные" x для единиц компиляции a.cpp и b.cpp. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 22:11 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ, Какая разница что там выводится в результате UB? )) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 23:08 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, а где UB? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 23:11 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ Пусть a.h Код: plaintext 1.
b.h Код: plaintext 1.
If an inline function or variable (since C++17) with external linkage is defined differently in different translation units, the behavior is undefined. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 23:35 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, не вижу, откуда тут может взяться "external linkage". Поясни, пожалуйста. ... Ага, нашел: по умолчанию. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 23:44 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
ъъъъъ Anatoly Moskovsky, не вижу, откуда тут может взяться "external linkage". Поясни, пожалуйста. ... Ага, нашел: по умолчанию. Спасибо. А в MSVS вроде как не external linkage, а вполне себе в компайл-тайме. Или я не разобрался. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.07.2021, 23:55 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Начал читать: https://habr.com/ru/company/jugru/blog/506104/ - страшно, нафиг... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 00:18 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Удалено ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 00:19 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky ъъъъъ, Какая разница что там выводится в результате UB? )) Это же должно быть нарушением ODR? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 09:10 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
d7i ъъъъъ Ещё можно std::array использовать. А ещё лучше std::vector. в векторе я не умею хранить объекты класса. только указатели получается. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:11 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, Это не массив, а указатель. Ты ходишь по охриненно тонкому льду... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:26 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, Код: plaintext 1. 2. 3. 4. 5.
crutchmaster andron81, Это не массив, а указатель. Ты ходишь по охриненно тонкому льду... Чего ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:30 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, И вообще. Ты задал 4 строки. Зачем их считать? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:33 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
crutchmaster, затем чтобы скорректировать массив легко было в константе . добавил элементов или убрал и всё. и не надо ещё где-то константы длин контролировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:35 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:36 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81 затем чтобы скорректировать массив легко было в константе Сделай через std::array, пока ничего себе не отстрелил. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:38 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Siemargl andron81, Код: plaintext 1. 2. 3. 4. 5.
crutchmaster andron81, Это не массив, а указатель. Ты ходишь по охриненно тонкому льду... Чего ? в данном случае я лоханулся , сделав конструктор с параметром. Но если сделать конструктор по умолчанию тогда по-моему не скомпилируется : AA.push_back(); AA.push_back(); а почему ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:38 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
crutchmaster ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:47 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, Ты забыл написать, _что_ ты хочешь положить в массив. Кстати, меняющий содержимое конструктор копирования это очень весело. Посмотри потом содержимое =) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:47 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Siemargl andron81, Кстати, меняющий содержимое конструктор копирования это очень весело. Посмотри потом содержимое =) это я для того чтобы отследить , что именно он отработал ) мне казалось , что при хранении в векторе отрабатывает именно копирующий. я stl ещё не читал просто ))) мне надо хранить именно объекты классов. Но получилось в векторе хранить через указатель на этом и остановился. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 10:53 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Siemargl Сам сначала выучи уроки, чепуху пишешь. arr[500] "массива" из 4-х элементов вернёт тебе что нибудь определённое/выкинит out-of-bound exception, как должно быть в нормальном человеческом массиве или вернёт мусор/сегфолт (как повезёт). ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 11:07 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81 мне надо хранить именно объекты классов. andron81 Но получилось в векторе хранить через указатель на этом и остановился. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 11:29 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
crutchmaster Siemargl Сам сначала выучи уроки, чепуху пишешь. arr[500] "массива" из 4-х элементов вернёт тебе что нибудь определённое/выкинит out-of-bound exception, как должно быть в нормальном человеческом массиве или вернёт мусор/сегфолт (как повезёт). Так что приводи примеры и лучше проверенные хотя бы тут cpp.sh ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 11:33 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81 Код: plaintext 1.
vec.emplace_back(/*аргументы конструктора*/) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2021, 12:27 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
Siemargl Я не очень понимаю, как это относится к вектору и вообще о чем ты пишешь ТС считает массивом то, что массивом не является по сути. Одно неверное движение и он останется без пальцев ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 07:55 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, extern const int arr[][4] = { {13,344,55}, { 13,344,55 }, { 13,344,55 }, { 13,344,55 } }; -- это ОБЪЯВЛЕНИЕ, а не определение. Соответственно, тут не может быть инициализатора. И если не будет инициализатора, размерности массива должны быть указаны явно (а не взяты из инициализатора, который тут применить нельзя) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 08:56 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
MasterZiv, а по мне так это объявление. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 09:06 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81, ой, пардон. определение. не проснулся ещё. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 09:21 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
andron81 MasterZiv, а по мне так это объявление. Ну, по тебе может быть что угодно, главное -- как компилятор считает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 09:31 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
MasterZiv andron81 MasterZiv, а по мне так это объявление. Ну, по тебе может быть что угодно, главное -- как компилятор считает. да ладно ?? Ну сделай файл header.h со строкой : Код: plaintext 1.
а потом сделай main.cpp Код: plaintext 1. 2. 3. 4.
или так Код: plaintext 1. 2. 3. 4. 5.
если бы extern const int arr[][4] = { {13,344,55}, { 13,344,55 }, { 13,344,55 }, { 13,344,55 } }; было бы только объявлением тогда это бы не работало ваще, а если работает значит память выделилась. так что это определение причем как следствие с указанием длины массива . ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 09:55 |
|
не могу посчитать количество строк в массиве.
|
|||
---|---|---|---|
#18+
MasterZiv extern const int arr[][4] = { {13,344,55}, { 13,344,55 }, { 13,344,55 }, { 13,344,55 } }; -- это ОБЪЯВЛЕНИЕ, а не определение. Соответственно, тут не может быть инициализатора. И если не будет инициализатора, размерности массива должны быть указаны явно (а не взяты из инициализатора, который тут применить нельзя) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.07.2021, 13:49 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017191]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
52ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
others: | 285ms |
total: | 477ms |
0 / 0 |