C++ Вопрос Вывод многомерного массива

Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
228
Реакции[?]
20
Поинты[?]
4K
Привет, начал изучать c++, когда хочу вывести многомерный массив, все его значения выводятся, но цикл не останавливается и продолжает выводить какие то отрицательные числа
C++:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int bigarray[2][3] = {{1, 6, 34}, {7, 93, 134}};
    
    for (auto i = 0; i < sizeof(bigarray); i++) {
        for (auto j = 0; j < sizeof(bigarray[i]); j++) {
            cout << bigarray[i][j] << endl;
        }
    }

    return 0;
}
 
rgb(24, 205, 154)
Пользователь
Статус
Оффлайн
Регистрация
9 Фев 2019
Сообщения
287
Реакции[?]
80
Поинты[?]
75K
Вроде так надо не?
C++:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int bigarray[2][3] = {{1, 6, 34}, {7, 93, 134}};
    
    for (auto i = 0; i < sizeof(bigarray)/sizeof(bigarray[0]); i++) {
        for (auto j = 0; j < sizeof(bigarray[i])/sizeof(bigarray[i][0]); j++) {
            cout << bigarray[i][j] << endl;
        }
    }

    return 0;
}
 
Эксперт
Статус
Оффлайн
Регистрация
30 Дек 2019
Сообщения
1,967
Реакции[?]
958
Поинты[?]
19K
Привет, начал изучать c++, когда хочу вывести многомерный массив, все его значения выводятся, но цикл не останавливается и продолжает выводить какие то отрицательные числа
C++:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int bigarray[2][3] = {{1, 6, 34}, {7, 93, 134}};
   
    for (auto i = 0; i < sizeof(bigarray); i++) {
        for (auto j = 0; j < sizeof(bigarray[i]); j++) {
            cout << bigarray[i][j] << endl;
        }
    }

    return 0;
}
погоди, так ты сам задал размеры массивам...
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
228
Реакции[?]
20
Поинты[?]
4K
Вроде так надо не?
C++:
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int bigarray[2][3] = {{1, 6, 34}, {7, 93, 134}};
  
    for (auto i = 0; i < sizeof(bigarray)/sizeof(bigarray[0]); i++) {
        for (auto j = 0; j < sizeof(bigarray[i])/sizeof(bigarray[i][0]); j++) {
            cout << bigarray[i][j] << endl;
        }
    }

    return 0;
}
спасибо, а как это работает?
погоди, так ты сам задал размеры массивам...
ну я задал конечно, но я хочу, чтоб можно было их потом типо менять и тд, мне все равно надо будет знать, как узнавать длину и тд
 
rgb(24, 205, 154)
Пользователь
Статус
Оффлайн
Регистрация
9 Фев 2019
Сообщения
287
Реакции[?]
80
Поинты[?]
75K
спасибо, а как это работает?

ну я задал конечно, но я хочу, чтоб можно было их потом типо менять и тд, мне все равно надо будет знать, как узнавать длину и тд
Для того чтобы узнать размер массива нужно просто разделить размер массива в байтах разделить на размер элемента этого массива
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
228
Реакции[?]
20
Поинты[?]
4K
Для того чтобы узнать размер массива нужно просто разделить размер массива в байтах разделить на размер элемента этого массива
спасибо
Для того чтобы узнать размер массива нужно просто разделить размер массива в байтах разделить на размер элемента этого массива
а есть способ без этого обойтись?
 
(\ /) _ ($ __ $ ) _ (\ /)
Пользователь
Статус
Оффлайн
Регистрация
22 Окт 2021
Сообщения
362
Реакции[?]
92
Поинты[?]
24K
а есть способ без этого обойтись?
Есть, но там ты получаешь неправильный вывод, тебе человек нормальный способ предложил

C++:
#include <iostream>
#include <array>

int main()
{
    std::array<std::array<int, 3>, 2> bigarray = { { {43141, 1351536, 31364724}, {1364274, 3174316, 13714641} } }; // сюда свое число добавь, мне просто впадлу было я по клаве вьебал
    const int kostyl = bigarray.size(); // credits: milsnel
    const int blyat = bigarray[0].size(); // credits: milsnel

    for (int i = 0; i < kostyl; i++) {
        for (int j = 0; j < blyat; j++) {
            std::cout << bigarray[i][j] << " ";
        }
        std::cout << std::endl; // здесь решил сделать вывод для теста
    }

    std::cin.get();
    return 0;
}
SS:
1697362118599.png
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
228
Реакции[?]
20
Поинты[?]
4K
Есть, но там ты получаешь неправильный вывод, тебе человек нормальный способ предложил

C++:
#include <iostream>
#include <array>

int main()
{
    std::array<std::array<int, 3>, 2> bigarray = { { {43141, 1351536, 31364724}, {1364274, 3174316, 13714641} } }; // сюда свое число добавь, мне просто впадлу было я по клаве вьебал
    const int kostyl = bigarray.size(); // credits: milsnel
    const int blyat = bigarray[0].size(); // credits: milsnel

    for (int i = 0; i < kostyl; i++) {
        for (int j = 0; j < blyat; j++) {
            std::cout << bigarray[i][j] << " ";
        }
        std::cout << std::endl; // здесь решил сделать вывод для теста
    }

    std::cin.get();
    return 0;
}
SS:
Посмотреть вложение 261503
ну ладно
 
(\ /) _ ($ __ $ ) _ (\ /)
Пользователь
Статус
Оффлайн
Регистрация
22 Окт 2021
Сообщения
362
Реакции[?]
92
Поинты[?]
24K
чето сложно скинь где почитать про это
Я могу немного про это рассказать, думаю будет полезно.
1. В первом случае у нас может быть переполнение массива, объясню для самых маленьких, ты можешь выйти за предел массива и это вызовет проблемы при компиляции. Во втором же случаи более надежно, std::array дает нам безопасный доступ ко всему в массиве, ты никогда не выйдешь за пределы массива.
2. Начнем так же с первого - ты изначально должен задать размер, ты не сможешь изменять его размер во время работы. А вот с помощью std::array ты тоже задаешь значение, но у тебя есть безопасные функции для взаимодействия с размером.
3. Самое главное, что ты используешь true способ взаимодействия, т.к. std::array является библиотекой c++.

Я приведу тебе пару примеров:
1697546972785.png Этим я показал, что std::array позволяет нам вывести ошибку в том, что мы сделали не так, т.к. я использовал .at для того, чтобы проверить максимальные границы массива, т.е. при попытке обратиться к массиву, когда индекс выходит за его пределы, будет вызвано исключение std::out_of_range BLYATTT'. Таким способом мы можем получать ошибку)
Хотя при использовании того, что тебе выше предложили, 1 способа, ошибки ты не получишь, как и правильного результата, ты получишь лишь индекс в выделенной памяти:
1697547798751.png
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,596
Реакции[?]
605
Поинты[?]
46K
Я могу немного про это рассказать, думаю будет полезно.
1. В первом случае у нас может быть переполнение массива, объясню для самых маленьких, ты можешь выйти за предел массива и это вызовет проблемы при компиляции. Во втором же случаи более надежно, std::array дает нам безопасный доступ ко всему в массиве, ты никогда не выйдешь за пределы массива.
2. Начнем так же с первого - ты изначально должен задать размер, ты не сможешь изменять его размер во время работы. А вот с помощью std::array ты тоже задаешь значение, но у тебя есть безопасные функции для взаимодействия с размером.
3. Самое главное, что ты используешь true способ взаимодействия, т.к. std::array является библиотекой c++.


Я приведу тебе пару примеров:
Посмотреть вложение 261669 Этим я показал, что std::array позволяет нам вывести ошибку в том, что мы сделали не так, т.к. я использовал .at для того, чтобы проверить максимальные границы массива, т.е. при попытке обратиться к массиву, когда индекс выходит за его пределы, будет вызвано исключение std::out_of_range BLYATTT'. Таким способом мы можем получать ошибку)
Хотя при использовании того, что тебе выше предложили, 1 способа, ошибки ты не получишь, как и правильного результата, ты получишь лишь индекс в выделенной памяти:
Посмотреть вложение 261671
Это ты использовал метод
at(), при обычном статическом индексировании аут оф баундс будет компайл еррор
 
(\ /) _ ($ __ $ ) _ (\ /)
Пользователь
Статус
Оффлайн
Регистрация
22 Окт 2021
Сообщения
362
Реакции[?]
92
Поинты[?]
24K
Это ты использовал метод
at(), при обычном статическом индексировании аут оф баундс будет компайл еррор
std::array дает нам безопасный доступ ко всему в массиве, ты никогда не выйдешь за пределы массива.
А вот с помощью std::array ты тоже задаешь значение, но у тебя есть безопасные функции для взаимодействия с размером.
 
Участник
Статус
Оффлайн
Регистрация
15 Янв 2021
Сообщения
492
Реакции[?]
289
Поинты[?]
79K
int array[10] - плохо
std::array<int, 10> array - хорошо
По посту от ТСа видно, что он только лезет в плюсы и понять что за сакральный смысл скрывают "< ... >" ему будет сложно. А так как в любой дающийся базе ( будь то ВУЗ, шарага или самообучение ) всегда присутствуют дефолтный статичный СИ-шные массивы, нет смысла грузить его сейчас этой инфой.
ну я задал конечно, но я хочу, чтоб можно было их потом типо менять и тд, мне все равно надо будет знать, как узнавать длину и тд
Для того, чтобы их потом менять можно использовать
Пожалуйста, авторизуйтесь для просмотра ссылки.
( выделяй, удаляй сколько душе вздумается, но можешь столкнуться с утечкой памяти и будет как + опыт ). Потом уже когда адекватно полезешь в ООП, перегрузки функций, шаблоны, тебе станет ясно, что за "< ... >" и зачем их использовать. А там уже можно следовать советам от OXXXYMlRON и спокойно воспринимать его критику.
спасибо, а как это работает?
Функция sizeof возвращает количество занимаемой памяти в байтах. Следовательно, если имеем статический массив из 20 элементов типа int. Получим объём в 80 байт ( sizeof(int) - 4 байта * количество элементов 20 ). Если используем матрицу ( двумерный массив ) из элементов 3x4, то значит получим размер в 3 * 4 * sizeof(int) = 24 байта. Чтобы получить размер первого массива достаточно получить его размер и разделить его на размер его каждого элемента.
 
Сверху Снизу