скомпилировать c ++ проект на Ubuntu - PullRequest
1 голос
/ 27 сентября 2010

Я пишу свой проект на C ++, и в Visual Studio все идет хорошо, но когда я компилирую его в Ubuntu, многие вещи ошибаются. Пример:

int main (int argsNum, char* args[]){
    Country* country = new Country("USA");
    Military* military = new Military("Army",country);
    Shalishut* shalishut = new Shalishut(military);
    Manager* manager = Manager::GetInstance();

    FileReader* fileReader = FileReader::GetInstance();
    fileReader->ReadCityConfig(args,country);
    fileReader->ReadRoadConfig(args,country);
    fileReader->ReadMilitrayCampConfig(args,military);

    military->ShowBases();

    return 0;
}

void FileReader::ReadMilitrayCampConfig(char* args[], Military* military){
    string line;
    char inputFileName [MAX_FILE_NAME_LEN];
    strcpy (inputFileName,args[3]);
    ifstream myfile (inputFileName); //inputFileName
    char* campName;
    string cityName;

    if (myfile.is_open()){
        while (!myfile.eof()){ //until the end of file
            getline (myfile,line); //separate each line.
            if ((line.size() != 0) && (line[0] != '#')) {
                campName = strtok(&line[0],",");
                cityName = (string)strtok(NULL,",");
                Shalishut::FixName(campName);  Shalishut::FixName(&cityName[0]);
                if (!(military->IsBaseExist(campName))){
                    if (military->GetCountry()->IsCityExist(cityName)){
                        Base* baseToAdd = new Base(campName,cityName);
                        if (baseToAdd != NULL){ 
                            military->AddBaseToMilitary(baseToAdd);
                            military->GetCountry()->FindCity(cityName)->AddBaseToCity(baseToAdd);
                        }
                    }
                    else cout << "ERROR: City named \"" << cityName << "\" does not exist, can't add base \"" << campName << "\" !" << endl<<endl;
                }
                else cout << "ERROR: Base Named \"" << campName << "\" is already exist in Military, can't create base!" << endl<<endl;
            }       
        }
        myfile.close();
    }
    else throw ExceptionMilitaryCampConfigFileFault(); /*cout << "ERROR: Unable to open MilitaryConfig file!"<< endl;*/
}

bool Country::IsCityExist(const string cityName){
    map<string ,City*>::iterator itCities;
    itCities = m_cities.find((string)cityName);
    if (itCities != m_cities.end()) return true;
    else return false;
}

void Shalishut::FixName(char* name){
    int i;
    name[0] = toupper(name[0]);
    for (i=1 ; name[i] ; i++){
            name[i] = tolower (name[i]);
        }
    }
}

Проблема в том, что программа читает города и дороги, но когда она читает военный лагерь, я получаю:

" does not exist, can't add base "Hazerim" !

, хотя в файле конфигурации у меня есть база с тем же именем. напомню: в visual studio это работает отлично!

Ответы [ 3 ]

1 голос
/ 28 сентября 2010

Как и другие говорили:

  • двойная проверка окончаний строк (возможно, запустите dos2unix для входных файлов вместо более надежного / подверженного ошибкам решения)

  • убедитесь, что все правильно, имена файлов чувствительны к регистру

  • знать, где он ищет файлы, убедиться, что все в CWD

1 голос
/ 28 сентября 2010

Я бы посоветовал не возиться с std::string внутренностями. Я не знаю, что это законно, и это, безусловно, может вызвать проблемы. Используйте .c_str(), чтобы получить строку в стиле C и скопировать ее в char [], или используйте строковые функции для анализа ввода.

Для отладки поместите внушительные выходные операторы, чтобы вы могли увидеть, каковы строковые значения, или узнайте немного о gdb и пошагово выполните короткий запуск инициализации.

Это cityname = (string)... просто безобразно. Поскольку вы не используете cityname вне этой области, вы можете объявить string cityname(...);, и cityname всегда будет инициализироваться и определяться близко к месту его использования.

1 голос
/ 27 сентября 2010

Если предположить, что сообщение об ошибке на самом деле ERROR: City named _____ does not exist, can't add base "Hazerim" Я бы внимательно посмотрел на прописные / прописные буквы городов и городов для базы в ваших входных данных. Они, вероятно, не совпадают.

Также использование strtok на std::string просто вызывает проблемы, так как это разрушительно, и строки не ожидают, что их внутреннее состояние будет снесено случайным образом. Есть такой метод, как find_first_of, который поможет вам разобрать строки C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...