Member
Статус: Не в сети Регистрация: 19.10.2004 Откуда: Киев
Root писал(а):
Цитата:
Вопрос по C++.как calloc вернуть указат. на двумерн. массив?
собственно по этому. Привожу схему как писать:
Код:
char **a; a=calloc(..); // выделяем память под массив указателей for (int i=0, i<N; i++) a[i] = calloc(...) // выделяем память под двумерный массив тут
надеюсь, это немного поможет... придется расставить параметры у функций и может сделать явное приведение типов.
Root спасибо за помощ, идея замечательная, мне уже тоже говорили о этой возможности на другом форуме, тоже такая же мысль вот подробнее
Код:
TestStruct** mat1 = (TestStruct**)calloc(5, sizeof(TestStruct*)); for (int i = 0; i < 5; ++i) mat1[i] = (TestStruct*)calloc(10, sizeof(TestStruct)); for (int i = 0; i < 5; ++i) { // инициализируем элементы массива vec1[i].a = 10; vec1[i].b = 20.2;
Тоесть все же, так чтоб сразу ф-ция calloc не может вернуть указатель на многомерный массив. Я просто хотел узнать, думал может это возможно.
Ну и тут еще тоже есть мысль исспользовать вектор ( с шаблонов STL) но я еще пока разбираюсь с этим.
Всем спасибо.
_________________ Многие вещи нам непонятны не потому, что понятия наши слабы; но потому, что сии вещи не входят в круг наших понятий.
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
Root О.к. В C++ есть такая чудная штука - STL.
Аналог массива - вектор (vector<тип>). Двумерного массива - вектор векторов. (vector<vector<тип>>)
Добавление осуществляется методом push_back.
Единственное но. У твоего типа, вектор которого ты создаешь должены быть определены
1. Конструктор по умолчанию
2. Копирующий конструктор или оператор присваивания.
А лучше всего, возьми книгу по STL (например, Москвин "Азбука STL") и займись его плотным изучением. Очень полезно.
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
Avaddon а если STL недоступен? Насколько я понимаю, он есть не везде в С++ И к тому же не всегда его применение возможно или оправдано... Хотя в данном случае можно выбрать как удобнее решить проблему.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 15.04.2004 Откуда: Москва
Root STL - часть стандарта C++. Если его нет, то твой компилятор не соответствует стандарту
Возможно - всегда, оправдано в 99% случаев.
Единственный случай, кода STL не оправдан - если ты пишешь прогу без CRT (тогда и malloc, calloc тоже не доступны).
Кто-нибудь подскажите, что делают функции realloc,malloc,new,delete?
Чем отличаются и как с ними работать.Есть ли ещё какие-н. функции? Помогите кто может, а то на экзамен завтра неохото неподготовленным идти.
Member
Статус: Не в сети Регистрация: 14.03.2004 Откуда: Москва
new - метод класса, после выделения памяти вызывает конструктор
delete - вызов деструктора, освобождение памяти(освабождать выделенную тобой память ты должен сам)
malloc - выделение памяти заданого обьема
realloc - тоже выделение, но точне не знаю
calloc например есть(забить номлями по моему)
free - освободить память, выделенную *allocим
_________________ ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо
Статус: Не в сети Регистрация: 03.09.2004 Откуда: Москва
new и malloc - это один хрен. Единственное насчет чего я сомневаюсь - может ли malloc выделять память под объект твоего собственного класса. Я этой функцией не пользоволся, и вообще она устарела. Сейчас использую только new и delete. Эти операторы очень хороши для того, чтобы создавать динамические массивы (это такие массивы, о размере которых ты ничего не "знаешь" во время компиляции проги).
nickyoz new и delete- это не метод класса - это оператор, такой же как == или ++ . Ботай C++
Последний раз редактировалось Babrick 29.12.2004 17:20, всего редактировалось 1 раз.
Статус: Не в сети Регистрация: 03.09.2004 Откуда: Москва
Будет выделено столько памяти, чтобы туда поместился указатель на char. Какая у нас винда? Правильно - 32 битная, т.е. указатели на память (а в указателях хранится адрес памяти) занимают 4 байта.
new же вызовет конструктор и инициализация пройдет успешно, в случае
malloc необходимо вручную инициализировать объект класса + вы не можете явно
вызвать конструктор, а так же помнить про пары инит\release
вообщем у B. Eckel это неплохо описано
_________________ forum.omskteam.ru- Все о керамограните
new и delete - это не операторы. Я не люблю цепляться к словам, но такое определение вообще неверно и на экзамене я бы за него бесспорно снизил оценку... Впрочем, это и не методы класса (К человеку, их так обозвавшему: если вы считаете, что это методы класса, вопрос - какого?). Это ключевые слова. Короче они определены обычным #define в стандартных заголовках С++(вот #define - уже оператор!). А синтаксическое выделение можно установить на любое сочетание букв, так что не все, что выделяется "синеньким" есть оператор.
По теме.
realloc: реалокация памяти, используется для создания динамических буферов (т.е. расширяющихся и сужающихся в процессе выполнения приложения). Если буфер растет, разница заполняется нулями или значением по флажку.
new:
Объява malloc для простоты работы...
delete:
Объява free для простоты работы.
malloc: аллокация динамической области памяти в "куче" приложения. Примечание: относится к локальной "куче". Не может применяться для аллокации промежуточных буферов, например, DirectSound. Здесь требуется глобальная "куча" Windows и, соответственно, функция GlobalAlloc. Вообще, чтобы понять тонкость использования этой функции, нужно понимать тонкости работы менеджера памяти.
_________________ Я с удивлением понял, что ни слова не понимаю из той информации, которой обмениваются утки и коровы. Кодировка? Или врет телевидение??
Dilon На самом деле не init/release, а через констр/дестр.
#tim$
С malloc/free разобрались ( замечание: malloc при нехватке памяти возвращает 0, а new генерит исключения, и там ещё куча всяких гарантий, описывать долго. ).
Есть три оператора new ( + их можно переопределять и перегружать как глобально, так и в классе ):
1. void* operator new ( size_t )throw( bad_alloc ); - генерирует bad_alloc
2. void* operator new ( size_t, const nothrow_t& )throw(); - не генерирует bad_alloc
3. void* operator new ( size_t, void *p )throw(); - оператор размещения. Память просто не выделяется, а вызывается только конструктор, так как бы объект находится в p.
т.е.
T* cl = new T(arg1); - возвращает *T
эквивалентно
T* cl = malloc( sizeof(T) );
cl->T(arg1);
но ->T не разрешено, надо вызывать new-размещения. т.е
T* cl = malloc( sizeof(T) );
new(cl) T(arg1);
Есть ещё new[] и ВСЁ что здесь сказано там выполняется ( + ещё дополнительно ).
calloc(num,size) эквивалентно malloc(num*size). // память для num объектов по size байт
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения