Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка расшир. дин. массива

4.0K
03 января 2005 года
[ss]3L33T@
17 / / 15.11.2003
Код:
class cls1
{
    float f[20];
};
class cls2
{
    cls1* _cls1;
    double ff[5];
};
class cls3
{
    cls2* _cls2;
    long l[50];
};
void main()
{
    unsigned int s1 = 5, s2 = 10, s3 = 15, i, j;
    cls3* cls = new cls3[s1];
    for (i = 0; i < s1; i++)
        cls._cls2 = new cls2[s2];
    for (i = 0; i < s1; i++)
        for (j = 0; j < s2; j++)
            cls._cls2[j]._cls1 = new cls1[s3];
}

Теперь мне надо добавить ещё один элемент в основной массив - cls. Я считаю занимаемую память всем массивом(sizeof(тип)*кол-во эл-ов), затем считаю память, которая будет заниматься новым элементом и складываю их, указывая во втором параметре функции realloc(). Мне сообщается:
Цитата:

Unhandled exception at 0x77f767cd in loadup.exe: User breakpoint


И выбрасывает меня в dbgheap.cpp. Там _ASSERT срабатывает. Пробовал компилить и в релизе...пишет: "В приложении была обнаружена ошибка и оно будет закрыто. Отправить отчёт об ошибке?"

301
03 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by [ss]3L33T@
Код:
class cls1
{
    float f[20];
};
class cls2
{
    cls1* _cls1;
    double ff[5];
};
class cls3
{
    cls2* _cls2;
    long l[50];
};
void main()
{
    unsigned int s1 = 5, s2 = 10, s3 = 15, i, j;
    cls3* cls = new cls3[s1];
    for (i = 0; i < s1; i++)
        cls._cls2 = new cls2[s2];
    for (i = 0; i < s1; i++)
        for (j = 0; j < s2; j++)
            cls._cls2[j]._cls1 = new cls1[s3];
}

Теперь мне надо добавить ещё один элемент в основной массив - cls. Я считаю занимаемую память всем массивом(sizeof(тип)*кол-во эл-ов), затем считаю память, которая будет заниматься новым элементом и складываю их, указывая во втором параметре функции realloc(). Мне сообщается:

И выбрасывает меня в dbgheap.cpp. Там _ASSERT срабатывает. Пробовал компилить и в релизе...пишет: "В приложении была обнаружена ошибка и оно будет закрыто. Отправить отчёт об ошибке?"


Создай с помощью new новый массив туда скопируй то, что тебе надо. А Старый массив удали delete'ом.

4.0K
03 января 2005 года
[ss]3L33T@
17 / / 15.11.2003
Цитата:
Originally posted by lord Kelvin

Создай с помощью new новый массив туда скопируй то, что тебе надо. А Старый массив удали delete'ом.


А еси черезе realloc()? А то как-то не хочется лишнее место забивать

301
03 января 2005 года
lord Kelvin
897 / / 08.11.2004
Цитата:
Originally posted by [ss]3L33T@

А еси черезе realloc()? А то как-то не хочется лишнее место забивать


Код:
#include<stdio.h>
#include<alloc.h>
#include<string.h>

int main(void)
{
 char *str;
 str = (char *) malloc(10);
 strcpy(str, "Hello");
 printf("String is %s\n  Address is %p\n", str, str);
 str = (char *) realloc(str, 20);
 printf("String is %s\n  New address is %p\n", str, str);
 free(str);
 return 0;
}

Этот код из хелпа к BC3.1. Запускаем...
 
Код:
String is Hello
  Address is 1B68
String is Hello
  New address is 1B76

Вуаля! Адрес строки поменялся! Значит... Значит новая строка была целиком выделена в памяти, а старая удалена. То есть "лишнее место" все равно забивается. Хотя и в том и в другом случае не на долго.
3
03 января 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by [ss]3L33T@
Теперь мне надо добавить ещё один элемент в основной массив - cls. Я считаю занимаемую память всем массивом(sizeof(тип)*кол-во эл-ов), затем считаю память, которая будет заниматься новым элементом и складываю их, указывая во втором параметре функции realloc(). Мне сообщается:


Собственно, на вопрос тебе уже ответили.
Обычно в подобных случаях память выделяют с запасом, чтоб при добавлении одного элемента не нужно было ворошить всё.

P.S. А чем тебе вектор не подошел?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог