26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
||||||
1 | ||||||
Почему переменной присваивается произвольное значение("мусор")?21.04.2014, 02:35. Показов 3930. Ответов 20
Метки нет (Все метки)
Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но переменной х я присваиваю значение 0. Если после приглашения ввести набор чисел, мы введем что вроде 11111111111111111111111111111111111111111111111111111, то после нажатие enter х получает произвольное значение. Вопрос почему? Проблема решается перестановкой объявления х. Но я хочу понять почему так происходит.
0
|
21.04.2014, 02:35 | |
Ответы с готовыми решениями:
20
Почему не присваивается значение переменной status типа ProductState (это я enum прописывал) Не присваивается значение переменной, при только положительных числах массива, при наличии отрицательных, присваивается Задать каждому полю переменной value типа Т произвольное начальное значение в строке инициализации переменной Не присваивается значение переменной Не присваивается значение переменной |
1 / 1 / 1
Регистрация: 20.04.2014
Сообщений: 35
|
|
21.04.2014, 02:47 | 2 |
это происходит из-за того, что объем памяти, который выделяется под переменную (под х = 4 байта (32 бит)) не может вместить настолько большое число.
если в вашей программе требуется вводить абсолютно любое число, тогда посоветую разобраться с getchar(), а число хранить в виде массива (для каждого элемента массива по одной цифре введенного числа)
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 02:53 [ТС] | 3 |
Uzkesh, я не чего не присваиваю х. Смотрите внимательнее)
0
|
1 / 1 / 1
Регистрация: 20.04.2014
Сообщений: 35
|
|
21.04.2014, 02:56 | 4 |
ну к str..под него выделяется и того меньше = 1 байт (8 бит)
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 02:58 [ТС] | 5 |
Uzkesh, и str это массив, понятное дело что такое число он принять не может, но вопрос причем тут бедная переменная х, а не то почему число не сохраняется полностью.
0
|
1 / 1 / 1
Регистрация: 20.04.2014
Сообщений: 35
|
|
21.04.2014, 03:06 | 6 |
так, я вгляделся) смотрите, если вы в str (массив) вводите какую то информацию, то это строку (массив) надо закрыть символом конца строки "\0", что бы в оставшиеся элементы массива не попал этот самый мусор
Добавлено через 5 минут х у вас не изменяется ни на каком этапе программы. да и проверка условия while (z='0') не является проверкой, так как надо использовать while (z=='0'), в вашем случае '0' присваивается в z. вы можете просто убрать проверку условия if (x>=2) и будет выдаваться запрос на продолжение
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 03:10 [ТС] | 7 |
Uzkesh, переменная х не является элементом массива, понятно что собака зарыта в длине числа, но меня не интересует вопрос как сделать так чтобы вся эта конструкция работала, это я и так знаю. Меня интересует развернутый ответ почему так происходит! Это черновая программа, т.е. while (z='0') это я действительно ошибся сказывается делфи, но эту ошибку я быстро бы нашел. На данный момент меня интересует только этот кусок кода связанный с х. А переменная х нигде не изменяется потому что это черновой вариант, она будет изменяться!
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 04:23 [ТС] | 9 |
IrineK, почему на вопрос из-за чего это происходит, ты получаешь ответ как исправить?
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 04:35 [ТС] | 11 |
IrineK, моя цель понять причины и понимать что я делаю. Тогда столкнувшись с подобной проблемой мне не придется спрашивать не у кого совета. Я знаю как эту проблему обойти. Да я потом проанализирую ваш вариант и возможно он очень удачен, но я все таки спрашивал причину).
0
|
Заблокирован
|
|
21.04.2014, 04:43 | 12 |
Сообщение было отмечено ыфырф1992 как решение
Решение
Причину уже назвали
Никогда не считывайте строку голым cin - это небезопасно, т.к. при буфере N и считывании N+1 символов ваша строка не закроется. getline() закрывает строку в любом случае. Если вы ввели m<=N символов, он закроет ее на m+1 позиции, если больше - то обрубит и закроет на N+1.
1
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 04:59 [ТС] | 13 |
Я ее не распознал как причину так как ума у меня не хватило на большее чем после завершения считывания принудительно переписать последний символ на 0. Ладно cin не безопасно подробнее загуглю. Но все таки у меня все равно не укладывается а и б в голове. Я бы понял если бы за не имением места в массиве компилятор записывал в случайную переменную и этой переменной в моем случае была бы х. Так что я все равно причину до конца не осознал. Я понял в чем она закл., но как это работает не понял. Подскажите хотя бы как загуглить что бы найти ответ на свой вопрос
0
|
Заблокирован
|
|
21.04.2014, 05:09 | 14 |
Сообщение было отмечено ыфырф1992 как решение
Решение
Поставьте указатели на каждую переменную и проследите где они сидят по адресам в памяти, если вас заинтересовала ситуация.
У вас переменные создаются в стеке, а вы его рушите и поэтому получаете сюрпризы.
1
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 05:10 [ТС] | 15 |
IrineK, ок сделаю как вы сказали
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
||||||
21.04.2014, 17:55 [ТС] | 17 | |||||
IrineK, я бы хотел для начала уточнить как выглядит стек в c++. Для упрощения я взял integer 2 байтовый.
0
|
26 / 26 / 17
Регистрация: 08.04.2012
Сообщений: 202
|
|
21.04.2014, 18:17 [ТС] | 19 |
IrineK, минуту не получается загрузить изображения. Не я на картинки взял для упрощения взял 2 байтовый это смысл не изменит. Загружу увидете
IrineK, Я себе стек так представляю хотелось бы понять какой из вариантов правильный.
0
|
Заблокирован
|
|
21.04.2014, 19:11 | 20 |
Чтобы увидеть "биг пикчу", погуглите "Организация памяти процесса".
Потом вдавайтесь в детали. Посмотрите в направлении "Дизассемблирование кода". Может, что-то покажется интересным. P.S. int - по всяком случае в VS - 4-байтный.
1
|
21.04.2014, 19:11 | |
21.04.2014, 19:11 | |
Помогаю со студенческими работами здесь
20
Не присваивается значение переменной в конструкции if-else Переменной float значение присваивается с некоторой погрешностью Почему переменной не присваивается значение? Почему переменной не присваивается суммовое значение Подскажите почему не присваивается значение переменной c типом char? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |