Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2009, 23:13   #1
Артем125
 
Регистрация: 06.04.2009
Сообщений: 4
По умолчанию Динамическое выделение памяти под массивы

Задача выделить столько элементов массива, сколько раз введет данные пользователь.
Первоначально мы не знаем количества записей, и в цикле должно определяется это количество. Этот код работает не верно, а именно в цикле for выводятся одно и тоже значение, которое вводилось последним. Если, например вводить: 1,2,3, то выводится три раза цифра 3, а надо чтобы 1,2,3. Может кто-нибудь сталкивался с такой задачей?

Код:
struct scan_into
{
    char model[25];
};

int entry = 1;
scan_into *sc = (scan_into *)malloc(entry* sizeof(scan_into));
do
{
    sc = (scan_into*)realloc(sc, entry * sizeof(scan_into));
    gets(sc[entry].model);
    entry++;
} while (entry < 4);

for (int i = 0; i < 4; i++)
{
    std::cout << sc[i].model << "\n";
}

free(sc);

Последний раз редактировалось Артем125; 06.04.2009 в 23:15.
Артем125 вне форума Ответить с цитированием
Старый 06.04.2009, 23:44   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Код:
for (int i = 0; i < 4; i++)
У вас же начальное значение entry = 1, значит и в цикле нужно идти от 1.

Собственно, у меня последнее значение 3 раза не выводится. Но зато второе значение (именно второе) теряется. Там почему-то адрес второго элемента становится равен 00000000.
Проблема решилась так:
Код:
sc = (scan_into*)realloc(sc, (entry+1) * sizeof(scan_into));
Полный код:
Код:
struct scan_into
{
    char model[25];
};

int entry = 1;
scan_into *sc=NULL;
do
{
    sc = (scan_into*)realloc(sc, (entry+1) * sizeof(scan_into));
    gets(sc[entry].model);
    entry++;
} while (entry < 4);

cout<<"---------\n";
for (int i = 1; i < 4; i++)
{
    puts(sc[i].model);
}

free(sc);
upd
Правильное решение ниже.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 07.04.2009 в 03:20.
Sazary вне форума Ответить с цитированием
Старый 07.04.2009, 02:18   #3
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

В итоге получим
Код:
sc[0].model == ?
sc[1].model == data
sc[2].model == data 
sc[3].model == ?
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума Ответить с цитированием
Старый 07.04.2009, 03:19   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

ISergeyN, а ведь действительно )
Как-то меня с самого начала сбило это int entry = 1;.
Правильно будет int entry = 0;

Полный код.
Код:
struct scan_into
{
    char model[25];
};

int entry = 0;
scan_into *sc=NULL;
do
{
    sc = (scan_into*)realloc(sc, (entry+1) * sizeof(scan_into));
    gets(sc[entry].model);
    entry++;
} while (entry < 4);

cout<<"---------\n";
for (int i = 0; i < 4; i++)
{
    puts(sc[i].model);
}

free(sc);
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 07.04.2009, 09:52   #5
Артем125
 
Регистрация: 06.04.2009
Сообщений: 4
По умолчанию

Спасибо большое - Работает ))
Артем125 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое выделение памяти FW-TOT Общие вопросы C/C++ 2 19.12.2008 00:42
Выделение памяти antoha.by Паскаль, Turbo Pascal, PascalABC.NET 2 29.04.2008 20:04