Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> realock неизвестность 
:(
    Опции темы
Ivankult
Дата 24.5.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



Добрый день. Возникла непонятная проблема с выходом за границы массива или чем-то еще. Есть динамический массив, вызываю функцию, передаю его как параметр. В этой функции добавляю пару элементов, возвращаюсь в main-лабуда какая-то. Скрин : http://img847.imageshack.us/img847/6171/61433370.png

Вот код

main
Код

void main()
{
    setlocale(0,"");
    int count = 0;
    bus *arr=(struct bus*)calloc(0,sizeof(struct bus));

    char ask;
    while(true)
    {        
        cout<<"\n";
        cout<<"1. Добавить автобус в парк\n";
        cout<<"2. Выслать автобус на маршрут\n";
        cout<<"3. Вернуть автобус в парк\n";
        cout<<"4. Показать все автобусы на маршрутах\n";
        cout<<"5. Показать все автобусы в парке\n";
        cout<<"6. Выход\n";
        for(int i=0;i<count;i++)
        {
            cout<<"num: "<<arr[i].num<<"\n";
            cout<<"pos: "<<arr[i].pos<<"\n";
            cout<<"driver: "<<arr[i].driver<<"\n";
            cout<<"marsh: "<<arr[i].marsh<<"\n";
        }
        ask=getch();
        switch(ask)
        {
            case '1':
                read(arr,&count);
                break;
            case '2':
                change(arr,&count,1);
                break;
            case '3':
                change(arr,&count,0);
                break;
            case '4':
                show(arr,&count,1);
                break;
            case '5':
                show(arr,&count,0);
                break;
            case '6':
                return;
            default:
                continue;
        }    
    }
}


read
Код

void read(bus *arr, int *count)
{    
    char ask;
    while(true)
    {
        *count=*count+1;
        arr=(struct bus*)realloc(arr,*count*sizeof(struct bus));
        cout<<"Добавление нового автобуса: \n\n";
        cout<<"Номер автобуса: ";
        cin>>arr[*count-1].num;    
        strcpy(arr[*count-1].driver,".........................");
        arr[*count-1].marsh=-1;
        arr[*count-1].pos=0;

        for(int i=0;i<*count;i++)
        {
            cout<<"num: "<<arr[i].num<<"\n";
            cout<<"pos: "<<arr[i].pos<<"\n";
            cout<<"driver: "<<arr[*count-1].driver<<"\n";
            cout<<"marsh: "<<arr[*count-1].marsh<<"\n";
        }

        cout<<"Продолжить? (y/n): ";
        do ask=getch();
        while(ask!='y' && ask!='n' && ask!='Y' && ask!='N');
        if(ask=='n' || ask=='N')
            break;    
        cout<<"\n";
    }

    cout<<"\nнажмите любую клавишу для возврата в меню\n";
    ask=getch();    
}



в чем проблема может быть? никогда с таким не сталкивался

Заранее благодарю
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
borisbn
Дата 24.5.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



В ф-ции read arr - это "местая" переменная, и запись в неё рез-та realoc'а никак не повлияет на arr, объявленную в main  


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 24.5.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Ivankult, замени параметр read(): read(bus *&arr, int *count)
Но лучше используй std::vector<bus>
PM   Вверх
Ivankult
Дата 24.5.2011, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 181
Регистрация: 8.9.2008

Репутация: нет
Всего: нет



я передаю arr как параметр, а точнее передаю указатель на аrr. Read меняет массив, находящийся по тому же адресу в памяти, что и arr из main, это один и тот же массив!

на скрине видно, что при 1 записи все работает норм, а вот при большем количестве записей начинаются косяки. Может проблема в размере структуры(он неверно вычисляет количество памяти для одного элемента)? 
--------------------
Стив Макконнелл: «Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете».
PM MAIL ICQ   Вверх
bsa
Дата 24.5.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Ivankult @  24.5.2011,  23:16 Найти цитируемый пост)
на скрине видно, что при 1 записи все работает норм, а вот при большем количестве записей начинаются косяки. 
Косяк в том, что кто-то не читал документацию на функцию realloc. А в ней четко написано, что realloc МОЖЕТ вернуть указатель ОТЛИЧНЫЙ от переданного. Чтобы понять почему, представь, что память представляет собой лист в клеточку. Одна клеточка, например, 4096 байт. malloc может тебе выделить только целое количество клеточек. Таким образом, выделив 100 байт, ты займешь область в 4096 байт. Затем ты делаешь realloc и увеличиваешь область до 4000 байт. Так как за выделенную область не вышли, то realloc возвратит исходный указатель. Затем перевыделяем память опять, требуя уже 4100 байт. И тут realloc видит, что клетка, следующая за текущей, уже занята. Поэтому он выделяет новую область памяти в 2 клетки, копирует туда содержимое старой области, освобождает память и возвращает адрес новой области...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.