Форум программистов, компьютерный форум CyberForum.ru

Массив из массивов различных типов (malloc) - C++

Восстановить пароль Регистрация
 
pew-pew
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 8
24.11.2014, 23:44     Массив из массивов различных типов (malloc) #1
На сколько я знаю, объявление двумерного массива (интов) выглядит так:

C++
1
2
3
4
int** myArr = (int**)malloc(n * sizeof(int*));
for (int i = 0;i < n; i++){
    myArr[i] = (int*)malloc(m * sizeof(int));
}
И myArr ссылается на массив из n указателей, каждый из которых ссылается на подмассив. Так как указатели занимают равное количество памяти, то по идее можно создать массив из указателей, каждый из которых будет ссылаться на какой-то подмассив, при этом эти подмассивы могут быть разных типов. Каким образом это сделать?
(например если написать
C++
1
myArr[i] = (float*)malloc(m * sizeof(float))
то компилятор будет ругаться на невозможность конвертации float* в int*)
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
24.11.2014, 23:51     Массив из массивов различных типов (malloc) #2
Цитата Сообщение от pew-pew Посмотреть сообщение
выглядит так
Вам соврали! Это СИ выделение памяти в С++ разделе форума.

Добавлено через 2 минуты
Цитата Сообщение от pew-pew Посмотреть сообщение
указатели занимают равное количество памяти
всегда 4 байта на 32-ух битах
pew-pew
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 8
24.11.2014, 23:52  [ТС]     Массив из массивов различных типов (malloc) #3
Простите, знаю, что это из c, но разве это не относится одновременно и к c++?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
24.11.2014, 23:54     Массив из массивов различных типов (malloc) #4
Цитата Сообщение от pew-pew Посмотреть сообщение
Каким образом это сделать?
есть волшебное слово void*
к нему можно привести, и из него
но опасная это штука
pew-pew
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 8
24.11.2014, 23:56  [ТС]     Массив из массивов различных типов (malloc) #5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
всегда 4 байта на 32-ух битах
Я имею в виду для определённой системы, а не в общем виде.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
24.11.2014, 23:57     Массив из массивов различных типов (malloc) #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
pew-pew, это не очень хорошая идея в общем случае, но можно сделать так:
C++
1
2
3
4
void ** myArr = (void**)malloc(3 * sizeof(void*));
myArr[0] = malloc(m * sizeof(int));
myArr[1] = malloc(m * sizeof(float));
myArr[2] = malloc(m * sizeof(char));
pew-pew
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 8
25.11.2014, 00:04  [ТС]     Массив из массивов различных типов (malloc) #7
Цитата Сообщение от DrOffset Посмотреть сообщение
pew-pew, это не очень хорошая идея в общем случае, но можно сделать так:

C++
1
2
3
4
void ** myArr = (void**)malloc(3 * sizeof(void*));
myArr[0] = malloc(m * sizeof(int));
myArr[1] = malloc(m * sizeof(float));
myArr[2] = malloc(m * sizeof(char));
Когда пытаюсь обратиться к myArr[0][0] компилятор говорит, что тип void* не указатель на объект (not a pointer-to-object type).
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.11.2014, 00:07     Массив из массивов различных типов (malloc) #8
Настоятельно не рекомендую вам злоупотреблять таким.
Во всяком случае на языке с++ существуют более простые, и надежные альтернативы.

http://rextester.com/GRLM71042

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iterator>
#include <iostream>
using namespace std;
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const size_t n = 3;
    void** myArr = (void**)malloc(n * sizeof(void*));
 
    
    myArr[0] = (void*)malloc(n * sizeof(int)   );
    myArr[1] = (void*)malloc(n * sizeof(float) );
    myArr[2] = (void*)malloc(n * sizeof(char)  );
    
    for(size_t i=0; i<n; ++i)
        ((int*) myArr[0])[i] = i;
    
    for(size_t i=0; i<n; ++i)
        ((float*) myArr[1])[i] = ((float)i) + 0.5f;
    
    for(size_t i=0; i<n; ++i)
        ((char*) myArr[2])[i] = i*10+10;
    
    
    {int* intArray = (int*)myArr[0];
     std::ostream_iterator<int> out(std::cout,", ");
     std::copy(intArray, intArray + n, out );}
    
    cout<<"\n-----------------\n";
    
    {float* floatArray = (float*)myArr[1];
     std::ostream_iterator<float> out(std::cout,", ");
     std::copy(floatArray, floatArray + n, out );}
    
    cout<<"\n-----------------\n";
    
    {char* charArray = (char*)myArr[2];
     std::ostream_iterator<int> out(std::cout,", ");
     std::copy(charArray, charArray + n, out );}
    
    cout<<"\n-----------------\n";
}
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
25.11.2014, 00:07     Массив из массивов различных типов (malloc) #9
Цитата Сообщение от pew-pew Посмотреть сообщение
Когда пытаюсь обратиться к Myarr[0][0] компилятор говорит, что тип void* не указатель.
Естественно, ведь информация о типе потеряна. Поэтому я и говорю, это не очень хорошая идея.
Будет работать так:
C++
1
2
3
static_cast<int*>(myarr[0])[0] = ...
static_cast<float*>(myarr[1])[0] = ...
static_cast<char*>(myarr[2])[0] = ...
Тебе оно точно надо?
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.11.2014, 00:11     Массив из массивов различных типов (malloc) #10
--------------------------------
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
25.11.2014, 00:14     Массив из массивов различных типов (malloc) #11
Цитата Сообщение от hoggy Посмотреть сообщение
В преведенной в цитате уже была допущена ошибка.
В чем ошибка не затруднит указать?
pew-pew
0 / 0 / 0
Регистрация: 24.11.2014
Сообщений: 8
25.11.2014, 00:14  [ТС]     Массив из массивов различных типов (malloc) #12
Цитата Сообщение от DrOffset Посмотреть сообщение
Естественно, ведь информация о типе потеряна. Поэтому я и говорю, это не очень хорошая идея.
Будет работать так:
C++
1
2
3
static_cast<int*>(myarr[0])[0] = ...
static_cast<float*>(myarr[1])[0] = ...
static_cast<char*>(myarr[2])[0] = ...
Тебе оно точно надо?
Точно, спасибо. Это мне не особо надо, просто было интересно как это реализовать (раз уж такая возможность есть).
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.11.2014, 00:15     Массив из массивов различных типов (malloc) #13
Цитата Сообщение от DrOffset Посмотреть сообщение
В чем ошибка не затруднит указать?
Не было ошибки. Я затупил.
DrOffset
6456 / 3830 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
25.11.2014, 00:24     Массив из массивов различных типов (malloc) #14
Цитата Сообщение от pew-pew Посмотреть сообщение
Это мне не особо надо, просто было интересно как это реализовать (раз уж такая возможность есть).
Я спрашивал потому, что в С++ не принято особо далеко уходить от типизации. Неоднократно встречал попытки прикрутить к С++ динамическую типизацию, у людей после опыта с языками вроде php и т.п. Просто не нужно этого делать, на С++ нужно писать на С++, а не на php.
Да, на С++ есть средства дающие некоторую свободу от типа, но они в любом случае подчиняются тем же правилам и контролируются системой типов языка. А вот void * (или такие штуки как эллипсис) - это тот ящик Пандоры, который лишает нас типоконтроля и практически ничего не дает взамен. Пользоваться этим нужно очень осторожно. И ни коем случае не применять направо и налево.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2014, 01:00     Массив из массивов различных типов (malloc)
Еще ссылки по теме:

C++ Хранение и вызов различных типов функций в одной переменной
Возвращение различных типов данных C++
C++ Контейнеры, способные хранить данные произвольных (различных) типов

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
KOPOJI
Модератор
 Аватар для KOPOJI
16242 / 6453 / 390
Регистрация: 12.06.2012
Сообщений: 19,352
25.11.2014, 01:00     Массив из массивов различных типов (malloc) #15
Есть же буст, в нем есть boost::any, если сильно надо.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <vector>
#include <boost/any.hpp>
 
struct Foo {};
 
int main(int argc, char *argv[])
{
    std::vector<boost::any> objects;
    
    objects.push_back(boost::any(1));
    objects.push_back(boost::any(std::string("foo")));
    objects.push_back(boost::any(std::string("bar")));
    objects.push_back(boost::any(std::string("lol")));
    objects.push_back(boost::any(10.23));
    
    objects.push_back(boost::any(Foo()));
    //....
    
    try
    {
        for(auto it = objects.begin(), end = objects.end(); it != end; ++it)
        {
            std::cout << it->type().name() << " => ";
            if(it->type() == typeid(int))
                std::cout << boost::any_cast<int>(*it) << std::endl;
            else if(it->type() == typeid(std::string))
                std::cout << boost::any_cast<std::string>(*it) << std::endl;
            else if(it->type() == typeid(double))
                std::cout << boost::any_cast<double>(*it) << std::endl;
            //....
            else
                std::cout << "Unknowed type" << std::endl;
        }
    }
    catch(boost::bad_any_cast e) {
        std::cout << e.what() << std::endl;
    }
    
}
Не очень понятно, зачем жестко упираться в сишные функции при необходимости подобных изощрений
Yandex
Объявления
25.11.2014, 01:00     Массив из массивов различных типов (malloc)
Ответ Создать тему
Опции темы

Текущее время: 20:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru