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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
#1

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

14.11.2013, 20:20. Просмотров 870. Ответов 7
Метки нет (Все метки)

Доброго времени суток.
Работаю на 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);
Подскажите, что именно я делаю не так, и как всё это можно оптимизировать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2013, 20:20     Быстрая инициализация многомерных массивов
Посмотрите здесь:

указатели многомерных массивов - C++
как в программе воспользоваться указателями? пишу по конспекту, но что то вообще ничего не получается #include &lt;iostream&gt; #include...

Обработка многомерных массивов - C++
Создать многомерный массив 3x3 элементов.Сделать Разность по горизонтали. Три полученых результата вывести на экран.

Обработка многомерных массивов - C++
Создать многомерный массив 4x4.Вывести на экран минимальное значение многомерного массива.

Программирование обработки многомерных массивов - C++
Дана целочисленная прямоугольная матрица. Определить: количество строк, содержащих хотя бы один нулевой элемент; номер столбца в котором...

Редактор многомерных динамических массивов - C++
!!! Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. !!! Помогите мне пожалуйста...

Передача многомерных массивов в функцию - C++
Привет. Почему при передаче многомерного массива в функцию необходимо обязательно указывать измерения, кроме первого? Зачем это нужно? ...

Не понимаю структуру многомерных массивов - C++
Итак, по психологии я чистый визуал и мне, чтобы что-то сделать, нужно четко представлять это в уме. Проблема заключается в следующем,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,084
Записей в блоге: 3
Завершенные тесты: 1
14.11.2013, 20:23     Быстрая инициализация многомерных массивов #2
Как вариант выделить память один раз для всех элементов, а потом юзать адресную арифметику.
Можно выделить память два раза, при первом выделении выделить память для всех элементов, а при втором выделении выделить память для указателей на "измерения" массива и далее в цикле присвоить им необходимые значения, тогда сохранится привычная возможность обращения к элементам массива через [ ]
programina
1914 / 599 / 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
1914 / 599 / 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
шКодер самоучка
1813 / 1614 / 588
Регистрация: 09.10.2013
Сообщений: 3,618
Записей в блоге: 6
Завершенные тесты: 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++
Доброго всем времени суток. У меня возникло непонимание того, как можно передать двумерный (многомерный) массив в поток. Пока это...

Инициализация двухмерных массивов - C++
Доброго времени суток. Объясните, пожалуйста, почему так все работает нормально: int x = {1,1}; А так: int a = 1; int b =...

Stack overflow. Быстрая сортировка больших массивов - C++
Здравствуйте, форумчане! Недавно начал заниматься С++. В текущей работе нужно создать и отсортировать массивы - макс. длина 50млн. При...

Конструктор и Деструктор (инициализация массивов) - C++
Стал вопрос по инициализации массивов (внутри класса) в конструкторе, но ни методичка, ни гугль явного ответа не дали, возможно массив...

Инициализация строковых массивов в конструкторе - C++
Здравствуйте уважаемые гуру. Задачка: Нужно инициализировать массив char'ов (и пару int'ов) в конструкторе для объекта Х,а потом...


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

Или воспользуйтесь поиском по форуму:
programina
1914 / 599 / 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     Быстрая инициализация многомерных массивов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru