Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 3
Регистрация: 13.10.2014
Сообщений: 251

Создание двумерного массива

21.08.2023, 15:36. Показов 575. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На курсе Stepik предлагаются функции для создания двумерных размеров:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int ** create_array2d(size_t a, size_t b) 
{
  int ** m = new int *[a]; // создание указателя на массив из "а" указателей
  m[0] = new int[a * b]; // в m[0] должен быть записан указатель на начало массива указателей, как в m[0] может быть записан одномерный массив всех элементов int двумерного массива?
  for (size_t i = 1; i != a; ++i)  
    m[i] = m[i - 1] + b; //  в созданный массив указателей записывается указатель на начало строки
return m;
}
 
void free_array2d(int ** m, size_t a, size_t b) {
delete [] m[0];
delete [] m;
}
В комментариях к коду указал мое понимание (непонимание) кода. Прокомментируйте, пожалуйста, код, чтобы я понял ошибки в своем понимании данного кода.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.08.2023, 15:36
Ответы с готовыми решениями:

Создание двумерного массива
Дан массив R(N,М). Сформировать массив R(N) из максимальных по абсолютной величине элементов строк массива R, массив А(М) из минимальных...

Создание двумерного массива
int Mass_create() { for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { mas = rand() % 198 - (99); ...

Создание двумерного массива
Год не кодил...всё напрочь забылось. нужно создать матрицу размером n x m, заполнить ее единичками и вывести результат. хоть убей не помню...

8
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,245
21.08.2023, 15:53
Лучший ответ Сообщение было отмечено tuchin как решение

Решение

Цитата Сообщение от tuchin Посмотреть сообщение
m[i] = m[i - 1] + b;
В m[i] записывается адрес начала i-й строки матрицы. Он отличается от (i-1)-й строки на b элементов.
Цитата Сообщение от tuchin Посмотреть сообщение
m[0] = new int[a * b];
в m[0] записывается адрес начала выделенного массива,
соответственно, 0-я строка матрицы будет начинаться с этого адреса.
1
 Аватар для Storm Screamer
4867 / 1434 / 116
Регистрация: 21.04.2013
Сообщений: 8,677
21.08.2023, 16:03
Цитата Сообщение от tuchin Посмотреть сообщение
Прокомментируйте, пожалуйста, код, чтобы я понял ошибки в своем понимании данного кода.
А на курсе живых преподавателей нет? В чем смысл курса, если вы идете на другой ресурс, чтобы спросить то, что вас интересует?

Тут вопросы к их коду есть.

int ** create_array2d(size_t a, size_t b) - почему такое наименование аргументов a и b? Почему там какие-то не понятные строки кода, если делается все проще?
free_array2d(int ** m, size_t a, size_t b) - здесь зачем нужны аргументы а и b, если они не используются? Почему удаляется только m[0], а как же остальная выделенная память?

Почему бы не сделать так?
C++
1
2
3
4
5
6
7
 
int ** create_array2d(size_t n, size_t m) {
  int** 2dArray = new int*[m];
    for (int i = 0; i < m; i++)
        2dArray [i] = new int[n];
  return 2dArray;
}
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
21.08.2023, 16:07
Какой-то кривой способ создания двумерного массива:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int ** create_array2d(size_t a, size_t b) 
{
  int ** m = new int *[a]; // по указателю m выделяется память для хранения массива указателей на int длиной 'a'
  m[0] = new int[a * b]; // по кузателю m[0] выделяется память для хранения линейного массива размером a * b
  for (size_t i = 1; i != a; ++i)  
    m[i] = m[i - 1] + b; //  первые a элементов массива инициализируются мусором
 
/* возвращается указатель на массив указателей на int длинной a 
в котором первый указатель указывает на массив int-ов длинной a * b 
в котором лежит мусор, а остальные указатели вообще не инициализированы */
return m; 
}
0
4 / 4 / 3
Регистрация: 13.10.2014
Сообщений: 251
21.08.2023, 16:10  [ТС]
Живых преподавателей нет. Вопросы можно указывать в комментариях к каждому уроку. А достоинство этого кода в том, что new используется всего 2 раза, а у Вас в 1 + m

Добавлено через 3 минуты
Наверное, мне не нужно было ссылаться на курсы, только вызвал гневную реакцию. В следующий раз спрошу сначала на курсе, а потом если не пойму - здесь без ссылки на курс
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
21.08.2023, 16:16
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int * createLiner2dArray(size_t a, size_t b)
{
    int *ret = new int[a * b];
    for (size_t i = 0; i < a; ++i) {
        for (size_t j = 0; j < b; ++j) {
            ret[a * i + j] = i + j;
        }
    }
 
    return ret;
}
 
void freeLiner2dArray(int *arr)
{
    delete[] arr;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int ** create2dArray(size_t a, size_t b)
{
    int **ret = new int*[a];
    for (size_t i = 0; i < a; ++i) {
        ret[i] = new int[b];
        for (size_t j = 0; j < b; ++j) {
            ret[i][j] = i + j;
        }
    }
 
    return ret;
}
 
void free2dArray(int **arr, size_t a)
{
    for (size_t i = 0; i < a; ++i) {
        delete[] arr[i];
    }
 
    delete[] arr;
}
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
21.08.2023, 16:16
первые a элементов массива инициализируются мусором
нет там никакого мусора, всё нормально

А достоинство этого кода в том, что new используется всего 2 раза
а что не развили идею? можно и одним new обойтись, а коли там всё равно int без конструкторов можно и вообще без new через malloc
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
21.08.2023, 16:16
Цитата Сообщение от Annemesski Посмотреть сообщение
m[i] = m[i - 1] + b; //  первые a элементов массива инициализируются мусором
Ну почему же мусором ? Указателями со сдвигом на b

Цитата Сообщение от tuchin Посмотреть сообщение
А достоинство этого кода в том, что new используется всего 2 раза, а у Вас в 1 + m
Достоинств не вижу, кроме излишнего гемороя.
C++
1
new int[rows*cols];
Вот и вся сказка.
0
 Аватар для Annemesski
2674 / 1336 / 480
Регистрация: 08.11.2016
Сообщений: 3,692
21.08.2023, 16:35
Цитата Сообщение от abit Посмотреть сообщение
нет там никакого мусора
Цитата Сообщение от SmallEvil Посмотреть сообщение
Ну почему же мусором ?
да, немного невнимательно посмотрел, там не инициализация значениями, а инициализация указателей, указателями на области памяти выделенной в m[0]. Такой подход имеет место быть: линейный массив выделен по указателю m[0], по остальным указателям линейный массив разложен в двумерный.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.08.2023, 16:35
Помогаю со студенческими работами здесь

Создание двумерного массива
По задаче (Прата) требуется создать пользователем вводимое количество строк, каждая из которых будет иметь длину равной количеству строк и...

Создание двумерного массива
int fun_rund (int *mass) { int a,b; srand((unsigned)time(NULL)); for( int a = 0; a &lt; 5; a++) { for(int...

Создание двумерного массива - C++
Здравствуйте! Не могу решить задачу: Напишите программу, которая создает двухмерный массив и заполняет его по следующему принципу:...

создание двумерного массива
Помогите создать двумерный массив такого вида: n n-1 n-2 … 3 2 1 n-1 n-2 n-3 … 2 1 0 n-2 n-3 n-4 … 1...

создание двумерного массива
поскажите плиз почему массив не выводится как положено.. (про библиотеки я знаю) #include &quot;stdafx.h&quot; #include...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru