Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1729 • Страница 2 из 87<  1  2  3  4  5 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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") и займись его плотным изучением. Очень полезно.

_________________
Цель жизни - d20 по жизни...


 

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 тоже не доступны).

_________________
Цель жизни - d20 по жизни...


 

Кто-нибудь подскажите, что делают функции realloc,malloc,new,delete?
Чем отличаются и как с ними работать.Есть ли ещё какие-н. функции? Помогите кто может, а то на экзамен завтра неохото неподготовленным идти.:weep:


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
new - метод класса, после выделения памяти вызывает конструктор
delete - вызов деструктора, освобождение памяти(освабождать выделенную тобой память ты должен сам)
malloc - выделение памяти заданого обьема
realloc - тоже выделение, но точне не знаю
calloc например есть(забить номлями по моему)
free - освободить память, выделенную *allocим

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 03.09.2004
Откуда: Москва
new и malloc - это один хрен. Единственное насчет чего я сомневаюсь - может ли malloc выделять память под объект твоего собственного класса. Я этой функцией не пользоволся, и вообще она устарела. Сейчас использую только new и delete. Эти операторы очень хороши для того, чтобы создавать динамические массивы (это такие массивы, о размере которых ты ничего не "знаешь" во время компиляции проги).

nickyoz new и delete- это не метод класса - это оператор, такой же как == или ++ . Ботай C++ :haha:


Последний раз редактировалось Babrick 29.12.2004 17:20, всего редактировалось 1 раз.

 

char **p =(char**)new char*;
А что будет значить эта строчка?


 

Member
Статус: Не в сети
Регистрация: 13.04.2004
Откуда: Москва
#tim$ будет выделена память для указателя на char*, на эту память будет указывать p


 

А сколько будет выделено памяти для p - размер chаr'a или др.?


 

Заблокирован
Заблокирован
Статус: Не в сети
Регистрация: 03.09.2004
Откуда: Москва
Будет выделено столько памяти, чтобы туда поместился указатель на char. Какая у нас винда? Правильно - 32 битная, т.е. указатели на память (а в указателях хранится адрес памяти) занимают 4 байта.


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Babrick Сорри. Ошибся. Да. Это операторы(хотя какая разница, все равное это одно и то же)
malloc - я им пользуюсь постояно. Потому что под С++ не пишу

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

Member
Статус: Не в сети
Регистрация: 30.04.2004
Откуда: [Omsk Team]
nickyoz
Цитата:
realloc - тоже выделение, но точне не знаю

это перераспределение уже выделенной памяти, т.е.
можно отвести дополнительную память в добавление к выделенной
Цитата:
Это операторы(хотя какая разница, все равное это одно и то же)

это далеко не одно и то же
Babrick
Цитата:
Единственное насчет чего я сомневаюсь - может ли malloc выделять память под объект твоего собственного класса.

это можно сделать, однако сопряжено с большими трудностями, придется писать:
Код:
CClass *p = (CClass*)malloc(sizeof(CClass));
p->init();
...
p->release();
free(p);

new же вызовет конструктор и инициализация пройдет успешно, в случае
malloc необходимо вручную инициализировать объект класса + вы не можете явно
вызвать конструктор, а так же помнить про пары инит\release
вообщем у B. Eckel это неплохо описано :)

_________________
forum.omskteam.ru- Все о керамограните


 

Спасиба всем огромное. Надеюсь завтра ничего не забуду.


 

Member
Статус: Не в сети
Регистрация: 27.05.2003
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 байт

Через malloc/free определяется:

void *realloc( void *p1, size_t size );
{
void *p2 = malloc( size );
memcpy( p2, p1, min(size, GET_SIZE(p1) );
free( p1 );
return p2;
}

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

Пример
Код:
#include <stdlib.h>
#include <stdio.h>
#include <new>

class A {
public:
            A   ( void )
    {   printf("Constr1.\n" );    }
            A   ( int i )
    {   printf("Constr2.\n" );    }
            ~A  ( void )
    {   printf("Destr.\n" );    }
   
};

int main ( void )
    {
        A* a = (A*)malloc ( sizeof(A) );
        new(a) A(10);   // a->A( 10 );

        a->~A();
        free ( a );
   
    }


 

Member
Статус: Не в сети
Регистрация: 06.11.2003
MR. DX9
Цитата:
new и delete - это не операторы.
ты не прав
Цитата:
это оператор, такой же как == или ++ . Ботай C++


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
MR. DX9 Все очень правильно. Вот только new и delete - не обязательно обясляетьюся defineом и могут переопределяться в классе

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


 

MR. DX9

Полность НЕ согласен!!!!!! Очень большая привязка к винде. C++ с такими не знаком :)!!

Код:
#include <stdio.h>

class A {
public:
  void* operator new ( size_t );
};

int main ( void )
{
  return 0;
}


И можна вызывать new без единого #define. И #define - не оператор C++ это деректива препроцессора!! И ещё много чего неправильного :gun:!!


 

Member
Статус: Не в сети
Регистрация: 14.03.2004
Откуда: Москва
Ой. Пристали. человек умеет писать, но не знает языка. Я так же

_________________
ФИЗТЕХ- рулез, ФАКИ - сила, Кванты тоже хорошо


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1729 • Страница 2 из 87<  1  2  3  4  5 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  

Лаборатория














Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan