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

  • Автор темы Автор темы mioxive
  • Дата начала Дата начала
  • Теги Теги
    c++
Dancin' in September
Пользователь
Пользователь
Статус
Оффлайн
Регистрация
26 Янв 2021
Сообщения
437
Реакции
44
Привет, начал изучать c++, когда хочу вывести многомерный массив, все его значения выводятся, но цикл не останавливается и продолжает выводить какие то отрицательные числа
C++:
Expand Collapse Copy
#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;
}
 
потому что сайзоф получает размер в байтах
 
Вроде так надо не?
C++:
Expand Collapse Copy
#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;
}
 
  • Мне нравится
Реакции: sove
Привет, начал изучать c++, когда хочу вывести многомерный массив, все его значения выводятся, но цикл не останавливается и продолжает выводить какие то отрицательные числа
C++:
Expand Collapse Copy
#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;
}
погоди, так ты сам задал размеры массивам...
 
Вроде так надо не?
C++:
Expand Collapse Copy
#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;
}
спасибо, а как это работает?
погоди, так ты сам задал размеры массивам...
ну я задал конечно, но я хочу, чтоб можно было их потом типо менять и тд, мне все равно надо будет знать, как узнавать длину и тд
 
спасибо, а как это работает?

ну я задал конечно, но я хочу, чтоб можно было их потом типо менять и тд, мне все равно надо будет знать, как узнавать длину и тд
Для того чтобы узнать размер массива нужно просто разделить размер массива в байтах разделить на размер элемента этого массива
 
Для того чтобы узнать размер массива нужно просто разделить размер массива в байтах разделить на размер элемента этого массива
спасибо
Для того чтобы узнать размер массива нужно просто разделить размер массива в байтах разделить на размер элемента этого массива
а есть способ без этого обойтись?
 
а есть способ без этого обойтись?
Есть, но там ты получаешь неправильный вывод, тебе человек нормальный способ предложил

C++:
Expand Collapse Copy
#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
 
  • Попкорн
Реакции: mxrz
Есть, но там ты получаешь неправильный вывод, тебе человек нормальный способ предложил

C++:
Expand Collapse Copy
#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
ну ладно
 
чето сложно скинь где почитать про это
Я могу немного про это рассказать, думаю будет полезно.
1. В первом случае у нас может быть переполнение массива, объясню для самых маленьких, ты можешь выйти за предел массива и это вызовет проблемы при компиляции. Во втором же случаи более надежно, std::array дает нам безопасный доступ ко всему в массиве, ты никогда не выйдешь за пределы массива.
2. Начнем так же с первого - ты изначально должен задать размер, ты не сможешь изменять его размер во время работы. А вот с помощью std::array ты тоже задаешь значение, но у тебя есть безопасные функции для взаимодействия с размером.
3. Самое главное, что ты используешь true способ взаимодействия, т.к. std::array является библиотекой c++.

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


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