2015-05-16 3 views
3

У меня проблема в моей программе на C++ для извлечения аудио из пакетов VoIP.Возврат true - это возврат false? Magic

Он хорошо работает на Linux и OpenBSD на amd64 и x86, но когда я запускаю программу на OpenBSD на ARM, она действительно делает магические вещи.

Я вызываю return true в LoadConfigFile, а в ProcessConfiguration - результат false.

Может ли кто-нибудь мне помочь? Может быть, я всего лишь слепой. Я сделал много тестовых отпечатков в коде.

Это основная функция программы, которая вызывает функцию ProcessConfiguration.

int main (int argc, char **argv) { 

    if (! config.ProcessConfiguration(argc, argv)) { 
     std::cout << "process configuration failed" << std::endl; 
     std::cout << "exiting whole program with EXIT_FAILURE" << std::endl; 
     return EXIT_FAILURE; 
    } 

    std::cout << "process configuration is true" << std::endl; 

    // User want to only print configuration 
    if (config.m_printconfig == true) { 
     config.PrintConfig(); 
     return EXIT_SUCCESS; 
    } 
    . 
    . // Long uninteresting code 
    . 
    return EXIT_SUCCESS; 
} 

Это функция ProcessConfoguration, которая вызывает LoadConfigFile.

bool TConfig::ProcessConfiguration (int & argc, char ** & argv) { 

    // Scan options from command line 
    int c; 
    while ((c = getopt (argc, argv, "c:dhn")) != EOF) { 
     switch (c) { 
     case 'c': 
      m_configfile = optarg; 
      break; 
     case 'd': 
      m_daemon = false; 
      break; 
     case 'h': 
      m_printusage = true; 
      return true; 
     case 'n': 
      m_printconfig = true; 
      break; 
     default: 
      return false; 
     } 
    } 
    argc -= optind; 
    argv += optind; 

    if (LoadConfigFile() == false) { 
     std::cout << "LoadConfigFile was false" << std::endl; 
     return false; 
    } 
    std::cout << "LoadConfigFile was true" << std::endl; 
    return true; 
} 

И эта функция загружает файл конфигурации, анализирует все директивы.

bool TConfig::LoadConfigFile (void) { 

    std::string line; 
    std::string directive; 
    std::ifstream data; 

    if (m_configfile.empty()) { 
     m_configfile = DEFAULT_CONFIGFILE; 
    } 

    std::cout << "opening file " << m_configfile << std::endl; 

    data.open(m_configfile.c_str()); 

    if (! data.is_open()) { 
     std::cerr << "Couldn't open config " << m_configfile << std::endl; 
     return false; 
    } 
    std::cout << "configfile is open" << std::endl; 
    std::cout << "before getline" << std::endl; 
    while (getline(data, line)) { 
     std::cout << "after getline" << std::endl; 
     trim_whitespaces(line); 
     . 
     . // Long uninteresting code 
     . 
    } 
    std::cout << "before data.close" << std::endl; 
    data.close(); 
    std::cout << "before return true in LoadConfigFile" << std::endl; 
    return true; 
} 

И это выводится на терминал.

$ ./call-extract -c call-extract.conf -d -n 
opening file call-extract.conf 
configfile is open 
before getline 
before data.close 
before return true in LoadConfigFile 
LoadConfigFile was false 
process configuration failed 
exiting whole program with EXIT_FAILURE 
$ echo $? 
1 
$ 

Я вызываю return true в LoadConfigFile, а в ProcessConfiguration - результат false.

+0

Вы спрашиваете о '' эхо $ возвращения 1? Процесс, который успешно завершится, будет иметь статус выхода 0. – jxh

+0

Даже не говоря, что вы ожидаете и минимальный код для воспроизведения того, что происходит с вашим вопросом, не очень полезно. Сначала прочитайте https://stackoverflow.com/help/how-to-ask. –

+0

Я это знаю. Моя программа завершает работу 1 при возврате EXIT_FAILURE в основной функции. –

ответ

0

Возвращенное истинное.

Вывод для меня:

before return true in LoadConfigFile 
LoadConfigFile was true 

Код без неинтересные частей:

struct TConfig 
{ 
    bool ProcessConfiguration() 
    { 
     bool rv = true; 
     if(!LoadConfigFile()) { rv = false; } 
     printf("LoadConfigFile was %s\n", rv?"true":"false"); 
     return rv; 
    } 

    bool LoadConfigFile (void) 
    { 
     printf("before return true in LoadConfigFile\n"); 
     return true; 
    } 
}; 
void fv() 
{ 
    TConfig config; config.ProcessConfiguration(); 
}