Здравствуйте Експерты! Мне понадобилось создать "универсальный масив". То есть масив тип которого заранее неизвестен. Далее пользователь задает размер одного елемента. Я пробовал это сделать примерно так. void * data; Потом data=(void*)malloc(n*elsize). Но y void * не определен размер. То как бить. Помогите плз. Очень надо.
Приветствую Вас, x3m! А потом, там где тебе надо получить какой-либо i-тый элемент, делаешь так. result=*(data+i*elsize);
Ответ отправлен: 27.08.2003, 10:43 Отправитель: Gibbel Отвечает vitya
Приветствую Вас, x3m! если вы не против использование c++, то я бы вам посоветовал template класс создать. если же вам обязательно надо работать с C, тогда в функциях инициализации, просто передавайте размер элемента. BTW, размер void * вполне определен и равен размеру указателя - 4 байта в защищенном режиме ix86 Ответ отправлен: 27.08.2003, 08:44 Отправитель: vitya Отвечает Avl2k
Здравствуйте, x3m! Вообщ-то все это уже написано в STL (см. класс std::vector), но если очень хочется самому, то надо использовать template'ы - ои именно для этого и предназначены. Пример: // STL #include <vector> using namespace std; int main() { vector<int> v( 2 ); v[0] = 10; v[1] = 20; vector<double> v2; v2.push_back( 7.62 ); return 0; } // ручками #include <crtdbg.h> template<class T> class MyVec { public: MyVec( int size ) { Alloc( size ); } MyVec( const MyVec& v ) { Alloc( v.m_size ); memcpy( m_data, v.m_data, sizeof( T ) * m_size ); } ~MyVec() { delete[] m_data; } MyVec& operator = ( const MyVec& v ) { if( &v != this ) { this->~MyVec(); new(this)MyVec( v ); } return *this; } T& operator[]( int i ) const { _ASSERT( i >=
0 && i < m_size ); return m_data[i]; } private: void Alloc( int size ) { _ASSERT( size > 0 ); m_size = size; m_data = new T[size]; } private: T* m_data; int m_size; }; int main() { MyVec<int> v( 2 ); v[0] = 10; v[1] = 20; return 0; } С уважением, Avl2k. Ответ отправлен: 27.08.2003, 12:12 Отправитель: Avl2k Отвечает Yuri Gordienko
Здравствуйте, x3m! Криводи к (char*). Или работай через шаблоны Успехов
Ответ отправлен: 27.08.2003, 10:16 Отправитель: Yuri Gordienko Отвечает BOLT
Добрый день, x3m! Для этого применяются классы. При создании объекта инициализируется массив в конструкторе по запросу пользователя через определенный интерфейс или поумолчанию. Посмотри исходники класса String и ты поймешь как это можно реализовать кодированием.
Да прибудет с тобой Великая Сила! This message was created by EMan 1.5
Ответ отправлен: 27.08.2003, 14:44 Отправитель: BOLT Отвечает Morgion
Доброе время суток, x3m! Пользуйся cpp и шаблонами, либо определи функции доступа, которые будут контролировать соответственно размер и прочую лажу. Ответ отправлен: 27.08.2003, 15:55 Отправитель: Morgion
Вопрос № 1032
Здравствуйте! Мне нужно создать окно с двух частей. Идея была такая. Создаеть главное окно, потом на него сверху наложаться другие окна-части. Далее возникли вопросы. Нужно ли для каждого окна регистрировать свой класс? Если класс используеться один, то как знать от какого окна пришло сообщение,ведь они используют одну и туже фн. обработки сообщений?
Доброе время суток, x3m! 1) Для каждого окна свой класс - не нужно. Возможно имеет смысл сделать разными классы главного окна и его сhild'ов, если у них будет совершенно разная функциональность. 2) Различать очень просто - у каждого окна есть свой HWND и он приходит в WindowProc первым параметром. С уважением, Avl2k. Ответ отправлен: 27.08.2003, 11:50 Отправитель: Avl2k Отвечает Marouder
Доброе время суток, x3m! Функцию обработки сообщений можно заменить на другую с помощью SetWindowLong.
Ответ отправлен: 27.08.2003, 10:05 Отправитель: Marouder Отвечает BOLT
Доброе время суток, x3m! Каждое окно должно иметь свой класс.
Да прибудет с тобой Великая Сила! This message was created by EMan 1.5
Ответ отправлен: 27.08.2003, 14:44 Отправитель: BOLT
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.