Смотрел я в стловском заголовке, нет там вектора с тем же названием. В чем проблема?
Проблема не в STL совсем... А в том, что в твоём проекте 2 разных CPP-файла подключают Realiz.H, и в итоге FileA получается определённым дважды. А этого делать нельзя...
, а само определение переменной FileA вынеси в любой из CPP-файлов...
Andrewshkovskii
16.11.2008 19:51
а можно как-нибудь обойтись без extern переменной, но решить проблему с мультивлючаймостью? Я не вижу просто выхода из этой ситуации, кроме как последовать твоему совету.
volvo
16.11.2008 20:22
Цитата
можно как-нибудь обойтись без extern переменной, но решить проблему с мультивлючаймостью?
Нет... Для успешной сборки проекта переменная должна быть описана (declared) в каждой единице компиляции, т.е., в каждом файле, и определена (defined) только в одном месте. Другими средствами (кроме описания внешней переменной: extern) это недостижимо.
Andrewshkovskii
16.11.2008 20:30
Получается так, что мне надо в main.cpp и в realiz.h описать вектор как extern, а в realiz.cpp описать как обычно?
volvo
16.11.2008 20:38
Цитата
мне надо в main.cpp и в realiz.h описать вектор как extern
Зачем описывать его еще и в main.CPP? Ты ж подключаешь там realiz.H... В этом-то и весь смысл, что в одном, заголовочном, файле переменная описывается как внешняя, и этот файл подключается ко всем CPP, в которых нужно описание переменной. А один CPP-файл мало того, что включает тот же header, так еще и содержит определение, то бишь выделение памяти под переменную. А потом уж линкер разруливает все это...
Иначе представляешь, что было бы, если б тебе в десятке-другом CPP-файлов пришлось добавлять extern-описание?
Andrewshkovskii
16.11.2008 20:48
Ну теперь то понятно, но всё равно, не работает.. в хидере как экстерн объявил, в файле реализации описал как подобает. Всё тоже самое. А если объявить и в хидере и в реализации как экстерн, то программа выполняется не корректно.
volvo
16.11.2008 21:58
На самом деле при внимательном рассмотрении твоей программы выясняется, что 1) функция GetFileList написана неправильно: ты вторам параметром передаешь в нее char*, и тут же внутри этой функции обращаешься:
lstrcat(&(argv[1]),"\\*.txt");
, и что, по-твоему, это должно делать? Куда будет записываться результирующая строка? Ты ж весь стек себе испортишь...
2) тебе действительно не нужно extern-переменных... Все проще гораздо. Смотри:
int main(int argc, char *argv[]) { std::vector<std::string> Paths;//массив путей к файлам std::vector<std::string> Strings;//массив ЦЕЛЫХ строк из файлов. GetFileList(argc,argv[1], Paths);//получение списка файлов по заданной маске в заданном каталоге
for(unsigned int i=0;i<Paths.size();i++) Strings[i]=GetStringsFromFile(Paths,i); for(unsigned int i=0;i<Strings.size();i++) std::cout<<Strings[i]; return 0; }
functions_realization.cpp :
std::string GetStringsFromFile (std::vector<std::string>& vect,unsigned int& i ) {
Программа крашиться при попытке обращения к вектор Strings. Почем? вроде бы и тип ф-ции string, и тип вектора такой же..Где-то переполнение идет??..
volvo
17.11.2008 22:23
Цитата
Программа крашиться при попытке обращения к вектор 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
Andrewshkovskii
23.11.2008 23:23
Доброго времени суток всем! Особенно volvo, потому что он он один разбирается во всем бреде, что я пищу) В общем я опять пришёл за помощью. Программа, которую я пытаюсь написать, должна считывать из файлов строки.разбивать строки на предложения и для каждого из файлов найти 5 самых длинных предложений. Ну там ещё надо учитывать что бы время обработки было не менее 0.2с и пр. Но сейчас суть не в этом. Вот исходники : main.cpp :
/*FUNCTIONS PROTOTYPE GOES HERE*/ void GetFileList(char *argv[], std::vector<std::string>& vect);// Получает список файлов по заданной маске
std::string GetStringsFromFile(std::vector<std::string>& Paths, unsigned int &i);//получает ЦЕЛЫЕ строки из файлов
std::string Parser(std::string & s, char& devider);//разделяет большую строку на маленькие ,путем поиска делителя devider
unsigned int GetDividerCount(std::string &s, char& devider);//Возвращает кол-во разделителей в общей строке
bool comp(std::string s1, std::string s2); // предикат для сортировки вектора
void SaveResults(std::string fname, std::vector<std::string> &PS, unsigned int &filecount, std::size_t &parsedst, std::vector<std::string> &Paths);//Сохраняет результаты выполнения программы
unsigned int GetDividerCount(std::string &s, char& devider) { int count = 0; for (unsigned int i = 0; i < s.size(); i++) if (s.at(i) == devider) count++; return count; }
std::string Parser(std::string &s, char& devider) { std::string bufs; int n = s.find('.'); bufs.append(s, 0, n); s.erase(0, n + 1); return bufs; }
ofstream outfile(fname.data()); outfile.seekp(0, std::ios_base::end); // outfile << "\nNumber of files parsed : " << filecount; // outfile << "\nParsed files : \n"; // for (unsigned int i = 0; i < filecount; i++) // outfile << i + 1 << " - " << Paths[i] << "\n"; for (unsigned int i = 0; i < filecount; i++) { outfile << "Five longest strings for file " << Paths[i] << " : \n"; for (unsigned int i = 0; i < 5; i++) outfile << i + 1 << " - " << PS[i] << "\n"; } outfile << "\nTotal count of parsed strings for this file : " << parsedst; outfile.close(); }
Суть проблемы : Почему-то в файла результатов записывается информация только о последнем файле. Почему - я так и не понял. Попробовал делать промежуточные выводы - вектор PS шалит, полностью не заполняется предложениями. Почему - тоже не понял. Наверное тупой или устал.. Если кто-то будет запускать приложение, вот параметры запуска : имяфайла.exe путькфайлу(например C:\1) кол-во файлов к обработке (например 3). Я пока не стал делать перехваты ошибок при запуске, не до этого...хочу сначала с этим разобраться. И ещё кое-что, в приложенном файле примеры файлов для обработки, 3 текстовых файла.
volvo
24.11.2008 1:42
Цитата
Почему-то в файла результатов записывается информация только о последнем файле.