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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как добавить памяти 
V
    Опции темы
BSOD
Дата 9.2.2006, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вобщем проблема такая:
я выделил слолько-нибудь памяти
Код

  p=(int *)malloc(x*sizeof(int));

теперь мне надо еще. Как добавить еще памяти?

ЗЫ
C тока начал учить, потому вопрос может быть и ламерский....

Это сообщение отредактировал(а) BSOD - 9.2.2006, 17:15


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Ignat
Дата 9.2.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Код

p=(int *)realloc(p, x*sizeof(int));



--------------------
Теперь при чем :P
PM   Вверх
BSOD
Дата 9.2.2006, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сэнкс


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
BSOD
Дата 9.2.2006, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



малость не работает....

Код

  ....
  kg=(int *)malloc(n+1*sizeof(int));
  for (int i=0;i<=n;i++)
  {
    g[i]=(int *)malloc(sizeof(int));
    p[i]=(int *)malloc(sizeof(int));
  };
  for (int i=1;i<=m;i++)
  {
    fscanf(in,"%d %d %d",&a,&b,&c);
    kg[a]++;
    kg[b]++;
    g[a]=(int *)realloc(g[a],sizeof(int));
    g[b]=(int *)realloc(g[b],sizeof(int));
    g[a][kg[a]]=b; p[a][kg[a]]=c;  // здесь вылетает access violation на первом же круге
    g[b][kg[b]]=a; p[b][kg[b]]=c;
  };
  ...


int *g[10000],*p[10000],*kg;

a=1 b=2 c=3


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Ignat
Дата 9.2.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Я вот в эти две строчки вообще не въехал:
Цитата(BSOD @ 9.2.2006, 18:28 Найти цитируемый пост)

  g[a][kg[a]]=b; p[a][kg[a]]=c;  // здесь вылетает access violation на первом же круге
    g[b][kg[b]]=a; p[b][kg[b]]=c;


Здесь вообще ничего не меняется (под *g[a] и так уже была выделена память объемом в sizeof(int) ):
Цитата(BSOD @ 9.2.2006, 18:28 Найти цитируемый пост)

    g[a]=(int *)realloc(g[a],sizeof(int));
    g[b]=(int *)realloc(g[b],sizeof(int));



--------------------
Теперь при чем :P
PM   Вверх
BSOD
Дата 9.2.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Здесь вообще ничего не меняется (под *g[a] и так уже была выделена память объемом в sizeof(int) ):

Цитата(BSOD @ 9.2.2006, 18:28 )

    g[a]=(int *)realloc(g[a],sizeof(int));
    g[b]=(int *)realloc(g[b],sizeof(int));

дык а как именно добавить(!) еще один int?

Цитата

Я вот в эти две строчки вообще не въехал:

Цитата(BSOD @ 9.2.2006, 18:28 )

  g[a][kg[a]]=b; p[a][kg[a]]=c;  // здесь вылетает access violation на первом же круге
    g[b][kg[b]]=a; p[b][kg[b]]=c;


впринципе их можно заменить на any_action();


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Hroft
Дата 9.2.2006, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нужно накапливать где-то размер компонент g[], чтобы писать в realloc вместо sizeof(int) этот размер.
А вообще - несравнимо удобнее vector, его для того и писали.
PM MAIL ICQ   Вверх
Ignat
Дата 9.2.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(BSOD @ 9.2.2006, 19:08 Найти цитируемый пост)

дык а как именно добавить(!) еще один int?

realloc используется для изменения памяти отведенного под тип данных. Т.е. как увеличения, так и уменьшения. Второй параметр определяет новый размер памяти, отведенный тип, в данном случае int. Это необходимо, если нужно, к примеру, строку char[32] удлиннить до char[64]. Но тип int имеет стандартную длину 32 бита, его можно привести к типам short и long.
А добавить можно инкрементировав индекс указателя.
Код


int * ptr_arr[];

ptr_arr[0]=(int *)malloc(sizeof(int));// выделили память
* ptr_arr[0]=1; //присвоили значение

ptr_arr[1]=(int *)malloc(sizeof(int));// выделили память еще под один int
* ptr_arr[1]=2; //присвоили значение новому int



Цитата(BSOD @ 9.2.2006, 19:08 Найти цитируемый пост)

впринципе их можно заменить на any_action();

А вот если будет any_action, то и ошибка будет другой, либо её не будет вообще. Т.к. ошибка именно в этих строках.



--------------------
Теперь при чем :P
PM   Вверх
BSOD
Дата 9.2.2006, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не, малость не то... g - какое-то подобие двумерного массива, тока с разной длинной строк, причем нужно динамически удлиннять эти строки.

Цитата

А вот если будет any_action, то и ошибка будет другой, либо её не будет вообще. Т.к. ошибка именно в этих строках.

ну any_action_with_p_or_g();



--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Hroft
Дата 9.2.2006, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А для эффективности их еще не по одному элементу желательно удлинять - снова std::vector.
PM MAIL ICQ   Вверх
BSOD
Дата 9.2.2006, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вектор это конечно хорошо, но т.к. я решаю олимпиадную задачу => <vector.h> подключать низя... =(
нуна все-таки думать самому....


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Ignat
Дата 9.2.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



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


--------------------
Теперь при чем :P
PM   Вверх
BSOD
Дата 9.2.2006, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



все... разобрался... c realloc я все делал правильно... я как обычно забыл обнулить kg (не бейте меня сильно, я с паскаля пережжаю... там такое иногда прокатывает =) )


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
BSOD
Дата 9.2.2006, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так... проблемы продолжаются...
с небольшими m,n,a,b,c.. прога работает на ура, а вот если m=9999 и n=10000
вылетает access violation, при чем не сразу..
Код

  for (int i=1;i<=m;i++)
  {
    fscanf(in,"%d %d %d",&a,&b,&c);
    if (a!=b)
    {
    kg[a]++;
    kg[b]++;
    g[a]=(int *)realloc(g[a],kg[a]*sizeof(int)); // вылетает тут, когда а=501 b=344 (на третьей итерации)
    g[b]=(int *)realloc(g[b],kg[b]*sizeof(int));
    g[a][kg[a]]=b; p[a][kg[a]]=c;
    g[b][kg[b]]=a; p[b][kg[b]]=c;
    };
  };


Немного поясню что это:
Вобщем я решаю задачу:
Есть граф с n вершинами и m ребрами, нужно найти кратчайший путь из одной вершины в другую. Оюычнай дейкстра не подходит (по времени) + если просто хранить граф в двумерном массиве (вершины смежные с текущей) - не влазит по памяти. Нужно написать дейкстру с кучей + "извратный" (динамический) массив. Дейкстру с кучей я написал а вот с "извратным" массивом - проблемы....
походу - учу C++ smile

Это сообщение отредактировал(а) BSOD - 9.2.2006, 23:35


--------------------
как корабль назовешь - то на нем и напишешь
PM MAIL WWW ICQ   Вверх
Ignat
Дата 10.2.2006, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



Цитата(BSOD @ 9.2.2006, 23:35 Найти цитируемый пост)

учу C++

Только это C без ++ smile
В стиле C++ выделение памяти делается оператором new.

К вопросу об access violation: рекомендуется проверять выделилась ли память, примерно так:
Код

if( ptr=(int *)malloc(n*sizeof(int))){
    //что-то делаем
}else{
   printf(stderr, "недостаточно памяти для операции для n=%i", n); //не помню точный синтаксис
}



--------------------
Теперь при чем :P
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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