2013-09-09 3 views
0

Я пытаюсь связать/соединить отдельные файлы вместе для компиляции. Я никогда не делал этого раньше, поэтому я потерял эту ошибку. Это кажется, как будто я ссылался на то, что мне нужно.Неопределенная ссылка на файл

У меня есть три файла, main.cpp, parser.cpp и header.h Основные вызовы парсер для разбора текста (хотя я не был в состоянии проверить, если он на самом деле работает еще: л)

main.cpp -

#include "header.h" 

using namespace std; // I know this isn't recommended, I'm changing this later. 

     int main(){ 
    string input, arg1, arg2; 
    vector<string> parsedIn; 
    cout << "<"; 
    while(getline(cin, input)){ 


      parsedIn = parser(input); 
      //more code, this is the only call to parser and compile error 
      //stops here 

parser.cpp -

#include "header.h" 

std::vector<std::string> parser(std::string &input){ 
int i=0; 
//int begin=1; 
int count=0; 
std::vector<std::string> parsedIn; 

     while(i<input.length()){ 

       char temp = input.at(i); 
       if(temp != ' '){ 
       parsedIn[count] += temp; 
       count++; 
       } 
     i++; 
     } 

     if(count < 3) 
     parsedIn[0] = "Error"; // Set first value to "Error" to report an input issue 

return parsedIn; 
} 

header.h

#include <algorithm> 
#include <iostream> 
#include <vector> 
#include <string> 
#include <fstream> 

std::vector<std::string> parser(std::string &input); 

Я знаю, что я должен использовать охранников, а также, но мой TA не совсем ясно, как я поставил эти вверх ... шаги ребенка, хотя. Это мой первый раз с C++, поэтому я хотел бы выяснить, почему это не ссылается.

Ошибка в неопределенном обращении к парсеру, конечно.

Редактировать: Я внесла изменения в код, чтобы отразить то, что я сделал по вашему предложению.

В частности синтаксического анализа (станд :: строка & вход) стал парсер (станд :: строка & вход)

+0

Вставьте команды, которые вы используете, чтобы попытаться скомпилировать и/или ссылку. – aschepler

+0

Какую команду вы выполняете непосредственно перед получением ошибки? Хит кнопку compike/gcc/whatever ... – atk

+0

Этот код тот же, что вы компилируете? У вас есть функция, называемая parser в header.h, а другая называется parse в parser.cpp. – bruvel

ответ

7

parser.cpp имеет «парсер» метод по буквам «разобрать», но ваш header.h говорит, что это «парсер».

+0

Ничего себе это было действительно очевидно. Я изменил его, но я все равно получаю ту же ошибку компиляции. Так что-то еще? Я также сделал изменения, которые Махеш указал ниже с векторами. –

+0

@clark Мои изменения не имеют ничего общего с проблемой компиляции. Доступ к недопустимым индексам - это проблема времени выполнения. – Mahesh

3

У вас есть еще одна проблема.

std::vector<std::string> parsedIn; 
// ... 
parsedIn[count] += temp; 

Размер вектора parsedIn в 0. Использование [] на пустой вектор вызывает неопределенное поведение. Вам нужно выполнить операции push_back, чтобы добавить элементы к вектору. В отличие от std::map контейнера, вы не можете использовать оператор [], чтобы добавить элементы в вектор.

+0

Вы хотите сказать "В отличие от' std :: map' ... "? –

+0

@MooingDuck Если вы видите мое последнее редактирование, это было «В отличие от« std :: map' ». Я почувствовал, что смысл станет другим, если я использую «В отличие от». Я думаю, вы правы. Все еще борются с английским: P – Mahesh

+0

Можно ли ссылаться на непустые векторы? Скажите, что у меня есть вектор с 3 элементами внутри, могу ли я оценить содержимое с чем-то вроде «if (parsedIn [1] ==« foo »)? –

0

Вы не в состоянии link свои файлы.

Маленькие шаги:

1) Написать helloWorld если вы уже не имеете. Исходный файл можно назвать hello.cpp.

2) Вместо того, чтобы строить в одном шаге от источника к исполняемому, например:

g++ hello.cpp 

пытается строить файл объекта, hello.o, а затем строить исполняемый файл из этого:

g++ -c hello.cpp -o hello.o 
g++ hello.o -o hello 

3) Добавьте немного функции, назовите ее void foo(), которая не принимает никаких аргументов, ничего не возвращает, ничего не выводит и ничего не делает. Поместите его в hello.cpp и , не действуйте до тех пор, пока он не будет отлично работать.

4) Переместить foo() к своему исходному файлу (foo.cpp) и файл заголовка (foo.h). На данный момент не беспокойтесь о защите заголовков. Компиляция и построить так:

g++ -c hello.cpp -o hello.o 
g++ -c foo.cpp -o foo.o 
g++ hello.o foo.o -o hello 

Если вы получите это далеко, вы сделали очень хорошо.

Смежные вопросы