Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
6 / 6 / 1
Регистрация: 22.12.2011
Сообщений: 134
1

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

14.11.2013, 20:20. Показов 1408. Ответов 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);
Подскажите, что именно я делаю не так, и как всё это можно оптимизировать?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2013, 20:20
Ответы с готовыми решениями:

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

Индексация многомерных массивов
Почему в C/C++ массивы объявляются так: int array; Это связано как-то с процессом компиляции...

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

Заполнение многомерных массивов вручную
Я могу заполнить одномерный массив с клавиатуры таким образом: int g{...

7
Don't worry, be happy
16989 / 9868 / 1900
Регистрация: 27.09.2012
Сообщений: 24,473
Записей в блоге: 1
14.11.2013, 20:23 2
Как вариант выделить память один раз для всех элементов, а потом юзать адресную арифметику.
Можно выделить память два раза, при первом выделении выделить память для всех элементов, а при втором выделении выделить память для указателей на "измерения" массива и далее в цикле присвоить им необходимые значения, тогда сохранится привычная возможность обращения к элементам массива через [ ]
0
2061 / 617 / 41
Регистрация: 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]);
}
1
6 / 6 / 1
Регистрация: 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
Ошибка не пропала, да и не должна была вроде бы..
0
2061 / 617 / 41
Регистрация: 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 Посмотреть сообщение
Попробовал вот так
вот
1
шКодер самоучка
2132 / 1846 / 904
Регистрация: 09.10.2013
Сообщений: 4,037
Записей в блоге: 7
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
Ошибка не пропала, да и не должна была вроде бы..
В данном коде вы затираете указатель на уже выделеную память, и естественно что в новом указателе элементы не инициализированы
1
6 / 6 / 1
Регистрация: 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]);
 
    // Деструкция обоих массивов происходит без ошибок, следовательно копирование завершилось правильно.
0
2061 / 617 / 41
Регистрация: 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
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2013, 08:17

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Передача многомерных массивов в функцию
Привет. Почему при передаче многомерного массива в функцию необходимо обязательно указывать...

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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