G компилируется, исполняемый файл не запускается

#c #linux #ubuntu #g #ubuntu-14.04

#c #linux #ubuntu #g #ubuntu-14.04

Вопрос:

Я некоторое время использовал текстовый редактор и g для компиляции и запуска программ, но по какой-то причине сегодня он перестал работать.

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

 #include <iostream>
#include <fstream>

int main(){
// Initializes variable.
    int coordinatePair;
// Creates an object to use for the file.
    std::ofstream fileReader;
// Initiates a for-loop to get the value of each variable.
    for(int i = 0; i == 5; i  ){
        std::cout << "Please enter the x-coordinate of your coordinate pair. " << std::endl << "You have " << 5 - i << " pairs left to enter." << std::endl;
        std::cin >> coordinatePair;
// Opens the file.
    fileReader.open("points.txt");
// Writes the user's values to the file.
    fileReader << coordinatePair << std::endl;
// Closes the file. 
    fileReader.close();
   }

}
  

В терминале я создал каталог для расположения файла…

 cd ~/file location
  

А затем я его скомпилировал.

 g   points_out.cpp -o points_out
  

И я попытался его запустить.

 ./points_out
  

И ничего не происходит. Нет сообщений об ошибках, нет вывода, ничего. Хотя код не совсем эффективен (мне, вероятно, лучше открывать и закрывать файл вне цикла for.), он все равно должен выполняться. Я попытался ввести неверный код, чтобы посмотреть, что произойдет, и он выдал мне правильные коды ошибок. Я также пытался

 g   -W -Werror points_out.cpp
  

… и это также не дало мне никаких кодов ошибок. Я попытался создать новый каталог для другого .cpp-файла, который я скомпилировал и запустил ранее на этой неделе, и он работал просто отлично. По какой-то причине этот файл просто не запускается. И я уверен, что он компилируется, потому что исполняемый файл создается. Я также уверен, что он не запущен, потому что текстовый файл не создается.

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

 ./points_out
  

часть или возникли проблемы с MinGW или необходимо удалить Avast. Ни одна из этих проблем у меня не возникает, поэтому я в недоумении.

Кроме того, не уверен, поможет ли это, но запуск

 g   --version
  

выдает мне следующий вывод:

 g   (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  

Комментарии:

1. Проверьте условие в вашем цикле for .

2. Еще один совет по отладке: разбросайте printf() вызовы отладки повсюду. Например, a puts("hello world"); в начале main() даст вам знать, что программа запущена.

3. Подсказка: при первом прохождении цикла i == 5?

4. И, пожалуйста, опишите в своем вопросе, что вы подразумеваете под «ничего (не происходит)». Завершается ли программа и возвращает приглашение ИЛИ вам нужно нажать Ctrl-C, чтобы завершить работу программы и вернуться к командной строке ИЛИ??? Хороший Q в противном случае, удачи.

5. Я идиот. Спасибо всем, и я сожалею и очень смущен.

Ответ №1:

Поведение является нормальным для программы, которая ничего не делает и успешно завершается.

C for-loop оценивает условие цикла перед вводом тела цикла. Когда тело цикла завершено, вычисляется необязательное выражение после цикла, и программа возвращается к условной проверке.

Итак, ваш код присваивает значение 0 i , а затем проверяет, i == 5 прежде чем разрешить ввод в цикл.

Не совсем понятно, что вы имели в виду, но вы, вероятно, не имеете в виду

 for (int i = 0; i < 5; i  )
  

Мы можем быстро продемонстрировать это с помощью этого фрагмента кода:

 #include <iostream>

int main() {
    std::cout << "original loop:n";
    for (int i = 0; i == 5; i  )
        std::cout << i << 'n';
    std::cout << "corrected loop:n";
    for (int i = 0; i < 5; i  )
        std::cout << i << 'n';
}
  

Живая демонстрация: http://ideone.com/O0Ul2z

— Добавление —

Большинство программистов подумали бы добавить что-то вроде без излишеств, без условий

 std::cout << "hello worldn";
  

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

Комментарии:

1. Да, я идиот. Спасибо. Я тоже знаю лучше, так что это унизительно. Я буду винить в этом стресс и недостаток сна. Спасибо!

2. В дополнение я сделал это, хотя и добавил его в конец, поэтому, я думаю, именно поэтому это не сработало. Как я уже сказал, недостаток сна.