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

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

14.11.2013, 20:20. Показов 1924. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2013, 20:20
Ответы с готовыми решениями:

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

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

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

7
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
14.11.2013, 20:23
Как вариант выделить память один раз для всех элементов, а потом юзать адресную арифметику.
Можно выделить память два раза, при первом выделении выделить память для всех элементов, а при втором выделении выделить память для указателей на "измерения" массива и далее в цикле присвоить им необходимые значения, тогда сохранится привычная возможность обращения к элементам массива через [ ]
0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 20:46
Цитата Сообщение от 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  [ТС]
Попробовал вот так:
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
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
14.11.2013, 21:11
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
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
14.11.2013, 21:12
Цитата Сообщение от 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  [ТС]
Всем спасибо, не сразу догнал просто
Вот рабочий код который возможно кому нибудь пригодится..
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
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
15.11.2013, 08:17
Удаление двумерного динамического массива:
C++
for(int x = 0; x < 512; x++)
    delete [] text[x];
 
delete [] text;
 
// тоже самое надо сделать для txt
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.11.2013, 08:17
Помогаю со студенческими работами здесь

Заполнение многомерных массивов вручную
Я могу заполнить одномерный массив с клавиатуры таким образом: int g{ 1,1,2,54,64,56,423,5,23,452,34,23,42,34,234,243 }; Но...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru