Моя программа хорошо работает на gnu-gcc, но не на gnu gcc for avr

Я изучаю C. Поэтому я написал эту программу таймера расстояния. Он хорошо работает с компилятором gnu-gcc. Но с gnu-gcc для avr он компилируется, но когда я запускаю его, я получаю только сеанс cmd, который ничего не делает, кроме как исчезает, когда я нажимаю любую кнопку. Я хочу знать, почему.

Я использую блоки кода, и вот мой код

#include<stdio.h>
#include<stdlib.h>
#define speedpersecond 5

int main()

{

char time  [5];

double distance;

printf("Please enter time in seconds");

gets(time);

distance = atoi(time) * speedpersecond;

printf("Distance is %g ", distance);

return 8585;

}

person Allan Mayers    schedule 22.08.2016    source источник
comment
Не используйте gets. А почему ты возвращаешь 8585? Попробуйте вернуть 0   -  person Edward Karak    schedule 22.08.2016
comment
Никогда не думал, что это будет иметь какое-то значение, просто верните любое число.   -  person Allan Mayers    schedule 22.08.2016
comment
Ммм... где вы запускаете программу, которую вы скомпилировали с помощью gcc-avr? На вашем ПК или на микроконтроллере?   -  person deamentiaemundi    schedule 22.08.2016
comment
@AllanMayers Что вы вводите в качестве ввода? Длина больше 4 символов?   -  person iRove    schedule 22.08.2016
comment
Я учусь использовать его с микроконтроллерами, поэтому я хотел с самого начала познакомиться с avr gcc. Я думал, что он без проблем скомпилирует консольное приложение на моем ноутбуке.   -  person Allan Mayers    schedule 22.08.2016


Ответы (1)


Вы, вероятно, сталкиваетесь с причиной, по которой gets устарела со времен стандарта C99 и полностью удалена в стандарте C11: переполнение буфера очень просто.

Если вы дадите в качестве входных данных более четырех символов, gets запишет за пределы массива, и вы получите неопределенное поведение.

Вместо этого используйте fgets для безопасного чтения строк.


И что касается return из функции main. Многие системы (включая все системы POSIX, такие как macOS и Linux) используют восемь бит для возвращаемого значения. Кроме того, все, кроме нуля, считается ошибкой для оболочек и вызывающих сред.

Вы также должны знать, что функция atoi не имеет проверки основных ошибок. Невозможно узнать, содержит ли строка, которую вы передаете, например. "0" или вообще не имеют цифр. В обоих случаях он вернет 0. Более безопасной функцией, которая поможет вам обнаруживать ошибки, является функция strtol.

person Some programmer dude    schedule 22.08.2016
comment
Хорошо, а функция strtol используется так же, как atoi? - person Allan Mayers; 22.08.2016
comment
Можете ли вы привести пример? - person Allan Mayers; 22.08.2016
comment
@AllanMayers Перейдите по ссылке, она ведет к ссылке, в которой есть пример. - person Some programmer dude; 22.08.2016