/////
Сообщение отредактировано: Andrewshkovskii -
stl vector, multiple definition error., C++\eclipse cdt 3.4.0 |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.
stl vector, multiple definition error., C++\eclipse cdt 3.4.0 |
Andrewshkovskii |
Сообщение
#1
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
/////
Сообщение отредактировано: Andrewshkovskii - |
volvo |
Сообщение
#2
|
Гость |
Цитата Смотрел я в стловском заголовке, нет там вектора с тем же названием. В чем проблема? Проблема не в STL совсем... А в том, что в твоём проекте 2 разных CPP-файла подключают Realiz.H, и в итоге FileA получается определённым дважды. А этого делать нельзя...Опиши FileA как внешнюю переменную в Realiz.H #include <vector.h>, а само определение переменной FileA вынеси в любой из CPP-файлов... |
Andrewshkovskii |
Сообщение
#3
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
а можно как-нибудь обойтись без extern переменной, но решить проблему с мультивлючаймостью?
Я не вижу просто выхода из этой ситуации, кроме как последовать твоему совету. |
volvo |
Сообщение
#4
|
Гость |
Цитата можно как-нибудь обойтись без extern переменной, но решить проблему с мультивлючаймостью? Нет... Для успешной сборки проекта переменная должна быть описана (declared) в каждой единице компиляции, т.е., в каждом файле, и определена (defined) только в одном месте. Другими средствами (кроме описания внешней переменной: extern) это недостижимо. |
Andrewshkovskii |
Сообщение
#5
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
Получается так, что мне надо в main.cpp и в realiz.h описать вектор как extern, а в realiz.cpp описать как обычно?
|
volvo |
Сообщение
#6
|
Гость |
Цитата мне надо в main.cpp и в realiz.h описать вектор как extern Зачем описывать его еще и в main.CPP? Ты ж подключаешь там realiz.H... В этом-то и весь смысл, что в одном, заголовочном, файле переменная описывается как внешняя, и этот файл подключается ко всем CPP, в которых нужно описание переменной. А один CPP-файл мало того, что включает тот же header, так еще и содержит определение, то бишь выделение памяти под переменную. А потом уж линкер разруливает все это...Иначе представляешь, что было бы, если б тебе в десятке-другом CPP-файлов пришлось добавлять extern-описание? |
Andrewshkovskii |
Сообщение
#7
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
Ну теперь то понятно, но всё равно, не работает..
в хидере как экстерн объявил, в файле реализации описал как подобает. Всё тоже самое. А если объявить и в хидере и в реализации как экстерн, то программа выполняется не корректно. |
volvo |
Сообщение
#8
|
Гость |
На самом деле при внимательном рассмотрении твоей программы выясняется, что
1) функция GetFileList написана неправильно: ты вторам параметром передаешь в нее char*, и тут же внутри этой функции обращаешься: lstrcat(&(argv[1]),"\\*.txt");, и что, по-твоему, это должно делать? Куда будет записываться результирующая строка? Ты ж весь стек себе испортишь... 2) тебе действительно не нужно extern-переменных... Все проще гораздо. Смотри: realiz.h #ifndef __REALIZ_H__ realiz.cpp #include <iostream>, и наконец, main.cpp: #include <iostream> Все работает... |
Andrewshkovskii |
Сообщение
#9
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
что, спасибо за советы. Но я опять к вас с вопросами и проблемами:) :
Переписал код, получилось вот что : main.cpp :
functions_realization.cpp :
functions_interface.h :
Программа крашиться при попытке обращения к вектор Strings. Почем? вроде бы и тип ф-ции string, и тип вектора такой же..Где-то переполнение идет??.. |
volvo |
Сообщение
#10
|
Гость |
Цитата Программа крашиться при попытке обращения к вектор Strings. Почем? Потому, что ты описать-то Strings описал, но памяти-то под него сколько-нибудь выделил? Одно дело, если б ты заполнял Strings с использованием push_back(), но ты же хочешь сразу начать присваивать значения конкретному элементу вектора? А чему равен его размер, перед тем, как ты делаешь в первый раз (да и не только в первый)Strings[ i ] = GetStringsFromFile(Paths,i);? Нулю... Отсюда и крах: Цитата( Nicolai M. Josuttis: C++ STL) The most important issue for the caller is whether these operations perform range checking. Only at() performs range checking. If the index is out of range, it throws an out_of_range exception (see Section 3.3). All other functions do not check. A range error results in undefined behavior. Calling operator [], front(), and back() for an empty container always results in undefined behavior Сообщение отредактировано: volvo - |
Andrewshkovskii |
Сообщение
#11
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
Доброго времени суток всем! Особенно volvo, потому что он он один разбирается во всем бреде, что я пищу)
В общем я опять пришёл за помощью. Программа, которую я пытаюсь написать, должна считывать из файлов строки.разбивать строки на предложения и для каждого из файлов найти 5 самых длинных предложений. Ну там ещё надо учитывать что бы время обработки было не менее 0.2с и пр. Но сейчас суть не в этом. Вот исходники : main.cpp :
functions_interface.h :
function_realization.cpp :
Суть проблемы : Почему-то в файла результатов записывается информация только о последнем файле. Почему - я так и не понял. Попробовал делать промежуточные выводы - вектор PS шалит, полностью не заполняется предложениями. Почему - тоже не понял. Наверное тупой или устал.. Если кто-то будет запускать приложение, вот параметры запуска : имяфайла.exe путькфайлу(например C:\1) кол-во файлов к обработке (например 3). Я пока не стал делать перехваты ошибок при запуске, не до этого...хочу сначала с этим разобраться. И ещё кое-что, в приложенном файле примеры файлов для обработки, 3 текстовых файла. Сообщение отредактировано: Andrewshkovskii - Прикрепленные файлы 1.zip ( 455 байт ) Кол-во скачиваний: 180 |
volvo |
Сообщение
#12
|
Гость |
Цитата Почему-то в файла результатов записывается информация только о последнем файле. Открывай файл для дозаписи, как положено:ofstream outfile(fname.data(), std::ios::app); вместо ofstream outfile(fname.data());, и ты поймешь, что происходит... |
Andrewshkovskii |
Сообщение
#13
|
Бывалый Группа: Пользователи Сообщений: 222 Пол: Мужской Реальное имя: Andrew Репутация: 0 |
Блин..какой же я не внимательный..в цикле одно и тоже писать.сспасибо.
|
Текстовая версия | 19.05.2024 22:42 |