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

Быстрая инициализация многомерных массивов - C++

Восстановить пароль Регистрация
 
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
14.11.2013, 20:20     Быстрая инициализация многомерных массивов #1
Доброго времени суток.
Работаю на QT Creator в связке с MinGW 32
Проблемы в общем то и нет, вопрос скорее по оптимизации. Какой самый быстрый способ инициализировать многомерный массив работающий на указателях?
Мои реализации с помощью циклов работают, но меня не покидает ощущение что есть более быстрые способы.
Вот код:
C++
1
2
3
4
    char** text;
    text = new char*[512]();
    for(int x = 0; x < 512; x++)
        text[x] = new char[512]();
Так же интересует способы копирование таких массивов, вообще эта тема мною совсем не изведанна, и поэтому даже на циклах реализовать не могу. Функция memcpy() почему то выкидывает с ошибкой "Segmentation Fault".
Вот код копирование предыдущего массива:
C++
1
2
3
4
    char** txt;
    txt = new char*[512]();
    for(int x = 0; x < 512; x++)
        memcpy(txt [x], text[x], sizeof(char) * 512);
Подскажите, что именно я делаю не так, и как всё это можно оптимизировать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11815 / 6794 / 769
Регистрация: 27.09.2012
Сообщений: 16,865
Записей в блоге: 2
Завершенные тесты: 1
14.11.2013, 20:23     Быстрая инициализация многомерных массивов #2
Как вариант выделить память один раз для всех элементов, а потом юзать адресную арифметику.
Можно выделить память два раза, при первом выделении выделить память для всех элементов, а при втором выделении выделить память для указателей на "измерения" массива и далее в цикле присвоить им необходимые значения, тогда сохранится привычная возможность обращения к элементам массива через [ ]
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 20:46     Быстрая инициализация многомерных массивов #3
Цитата Сообщение от Shaman163 Посмотреть сообщение
Функция memcpy() почему то выкидывает с ошибкой "Segmentation Fault".
она обращается к несуществующим данным. Попробуйте вот так:

Добавлено через 7 минут
C++
#include <stdio.h>
#include <string.h>
 
int main(int argc, char*argv[])
{
    char text[6] = "Hello";
 
    char** txt;
    txt = new char*[512];
 
    for(int x = 0; x < 512; x++)
        txt[x] = new char[6];
 
    for(int x = 0; x < 512; x++)
        memcpy(txt[x], text, sizeof(char) * 6);
 
    printf("%s\n", txt[256]);
}
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
14.11.2013, 21:06  [ТС]     Быстрая инициализация многомерных массивов #4
Попробовал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    char** text;
 
    text = new char*[512];// Инициализируем
    for(int x = 0; x < 512; x++)
        text[x] = new char[512];
 
    for(int x=0;x<512;x++)// Заполняем
    {
        for(int y=0;y<512;y++)
        {
            text[x][y] = 24;
        }
    }
    cout << (int)text[50][50] << endl;// Выводим чтобы подтвердить существование
 
    char** txt;
 
    txt = new char*[512]();
    for(int x = 0; x < 512; x++)
        memcpy(txt[x], text[x], sizeof(char) * 512);// Ошибка Segmentation Fault
Ошибка не пропала, да и не должна была вроде бы..
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 21:11     Быстрая инициализация многомерных массивов #5
600 Мегабайт за 7.5 секунд - это быстро?
C++
#include <stdio.h>
#include <string.h>
#include <time.h>
 
int main(int argc, char*argv[])
{
    clock_t t;
    int N = 100000000;
    char text[6] = "Hello";
 
    char** txt;
    txt = new char*[N];
    for(int x = 0; x < N; x++) txt[x] = new char[6];
 
    t = clock(); // старт
 
    for(int x = 0; x < N; x++) memcpy(txt[x], text, sizeof(char) * 6); // 6 x 100 Мегабайт
 
    t = clock() - t; // финиш
 
    printf("%.2f\n", t/100000.0);
    printf("%s\n", txt[N-1]);
}
Добавлено через 2 минуты
Цитата Сообщение от Shaman163 Посмотреть сообщение
Попробовал вот так
вот
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
14.11.2013, 21:12     Быстрая инициализация многомерных массивов #6
Цитата Сообщение от Shaman163 Посмотреть сообщение
Попробовал вот так:
C++
1
2
3
    txt = new char*[512]();
    for(int x = 0; x < 512; x++)
        memcpy(txt[x], text[x], sizeof(char) * 512);// Ошибка Segmentation Fault
Ошибка не пропала, да и не должна была вроде бы..
В данном коде вы затираете указатель на уже выделеную память, и естественно что в новом указателе элементы не инициализированы
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
14.11.2013, 21:30  [ТС]     Быстрая инициализация многомерных массивов #7
Всем спасибо, не сразу догнал просто
Вот рабочий код который возможно кому нибудь пригодится..
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
    char** text;
 
    text = new char*[512];// Инициализируем 1ый массив
    for(int x = 0; x < 512; x++)
        text[x] = new char[512];
 
    text[24][24] = 16;// Записываем в него конкретное значение на будущее
 
    char** txt;
 
    txt = new char*[512]();// Инициализируем 2ой массив
    for(int x = 0; x < 512; x++)
        txt[x] = new char[512];
 
    for(int x = 0; x < 512; x++)// Копируем значения из первого массива во второй
        memcpy(txt[x], text[x], sizeof(char) * 512);
 
    cout << (int)txt[24][24];// Выводим наше значение, для проверки
 
 
    for(int x = 0; x < 512; x++)// Уничтожаем 1ый массив
        delete[](text[512]);
 
    for(int x = 0; x < 512; x++)// Уничтожаем 2ой массив
        delete[](txt[512]);
 
    // Деструкция обоих массивов происходит без ошибок, следовательно копирование завершилось правильно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2013, 08:17     Быстрая инициализация многомерных массивов
Еще ссылки по теме:

указатели многомерных массивов C++
Stack overflow. Быстрая сортировка больших массивов C++
Программирование обработки многомерных массивов C++

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

Или воспользуйтесь поиском по форуму:
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 08:17     Быстрая инициализация многомерных массивов #8
Удаление двумерного динамического массива:
C++
for(int x = 0; x < 512; x++)
    delete [] text[x];
 
delete [] text;
 
// тоже самое надо сделать для txt
Yandex
Объявления
15.11.2013, 08:17     Быстрая инициализация многомерных массивов
Ответ Создать тему
Опции темы

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