3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
||||||
1 | ||||||
Запись значения в динамический массив18.08.2011, 00:37. Показов 5056. Ответов 18
Метки нет (Все метки)
Добрый вечер,
Сел я на ночь глядя писать программу, но вот проблема
Заранее спасибо!
0
|
18.08.2011, 00:37 | |
Ответы с готовыми решениями:
18
Динамический массив, запись и удаление Запись слова в динамический массив Запись данных в динамический массив Запись в одномерный динамический массив |
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
18.08.2011, 00:49 | 2 |
*(tempnum3+s+1) -- это Вы уже не в массив пишете.
tempnum3 изначально содержит адрес элемента tempnum3[0]. tempnum3[s+1] -- это уже за границами массива. Последний элемент -- это tempnum3[s]: учитывайте, что вы выделили память под s+1 элементов, включая нулевой. Соответственно, указатель на последний элемент --- это tempnum3 + s. P.S. И не забывайте смещать указатель, а то у вас в цикле s не меняется и получается, что пишете в один и тот же элемент.
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
||||||
18.08.2011, 01:01 [ТС] | 3 | |||||
P.S. s у меня меняет значения мне просто нужно написать одно z и все
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
||||||
18.08.2011, 01:08 | 4 | |||||
Если Вы хотите на каждом шаге цикла писать z в последний элемент массива tempnum3, то, да
Остальная логика программы мне не совсем понятна. Например, я раньше нигде не видел подобного синтаксического описания конструкции switch - case
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 01:10 [ТС] | 5 |
Я просто пишу калькулятор который обрабатывает данные в момент ввода
Это просто кусок Огросного кода с праработанным арифметическим синтаксисом и т.д. _______________________________________________________________________________ Почему-то проблема осталась и все равно не пишется значение z.
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
18.08.2011, 01:23 | 6 |
В общем, чисто новичковское имхо:
char *tempnum3 = new char[s+1]; при s = 0 выделяет место под один int. Соответственно, указатель tempnum3+s при s, отличных от нуля, указывает уже не на массив. Валидным будет лишь указатель tempnum3.
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 01:31 [ТС] | 7 |
То есть как правильно написать?
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|||||||||||||||||||||
18.08.2011, 01:43 | 8 | ||||||||||||||||||||
Ну по сути что происходит: Вы устанавливаете s = 0 и выделяете память под s+1 == 1 элемент:
Поправьте
Добавлено через 2 минуты Хочу добавить, что при s == 0 запись tempnum3+s равносильна просто tempnum3. Если Вы изменяете s после строчки
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 01:44 [ТС] | 9 |
Поправил, точнее я и так это сделал, но все равно не идет запись
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|
18.08.2011, 01:49 | 10 |
Вы уверены, что код доходит до этой строчки, а не обрубается на ложности проверок case'ов?
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
||||||
18.08.2011, 01:51 [ТС] | 11 | |||||
вроде доходит, вот полный код
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
||||||
18.08.2011, 02:01 | 12 | |||||
Короче, вся проблема в том, что Вы выделяете некорректное количество памяти.
P.S. Я сам новичок, поэтому могу ошибаться.
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 02:04 [ТС] | 13 |
Возможно, ладно буду думать дальше, а так, если есть еще предложения пишите.
Вообще, если Вы протестируйте, то увидите что с *tempnum = new char[k]; все нормально, так что я думаю, что проблема в другом
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|||||||||||
18.08.2011, 02:16 | 14 | ||||||||||
Я, к сожалению, не могу подебажить Ваш проект --- у меня стоит VS 2010 и при компиляции выкидывает ошибку про отсутствие VS 2008.
Мой совет --- разберитесь, сколько именно элементов должно быть у Вас в массивах и в соответствии с этим сделайте их корректное объявление. При обходе циклов следите, не пишите ли Вы за границы этих массивов. Добавлено через 6 минут Ну, пока k мало, может и нормально. А при бОльших значениях k записывая
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 02:18 [ТС] | 15 |
Вообще *tempnum = new char[k];
ведет себя нормально даже при больших значениях
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|||||||||||
18.08.2011, 02:23 | 16 | ||||||||||
Вот выдержка про минимальный блок:
Ну если сделаете
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 02:28 [ТС] | 17 |
Не это я проверил и по замыслу программы оно не должно выйти за рамки, как и все остальное
0
|
22 / 22 / 2
Регистрация: 11.04.2011
Сообщений: 67
|
|||||||||||
18.08.2011, 02:57 | 18 | ||||||||||
Ну как же не выходит за рамки массива, когда Вы пишете
Это не решит сразу Вашу проблему с записью z, но решит проблемы, связанные с тем, что Вы некорректно выделяете память. Добавлено через 11 минут А запись в корректно объявленные массивы дебажить куда проще.
0
|
3 / 3 / 3
Регистрация: 24.03.2011
Сообщений: 99
|
|
18.08.2011, 13:10 [ТС] | 19 |
Мда, посидел немного, а решения все равно не нашел...
0
|
18.08.2011, 13:10 | |
18.08.2011, 13:10 | |
Помогаю со студенческими работами здесь
19
Запись в динамический массив с файла Двумерный динамический массив и запись в него Посимвольная запись из консоли в динамический массив Считывание ячеек из StringGrid и запись их в динамический массив C++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |