Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 17.03.2017
Сообщений: 20
1

Ошибка в коде вывода двухмерного массива через функию

20.08.2018, 12:52. Показов 758. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот код
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
28
29
30
31
32
#include <iostream>
#include <ctime>
 
void Print_Arr(int *ptr_arr, const int size = 5, const int n = 4);
 
void main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
 
    const int size = 5;
    const int n = 4;
    int arr[size][n] =
    {
        { 1, 2, 3, 4 },
        { 6, 7, 8, 9 },
        { 11, 12, 13, 14 }
    };
    int *ptr_arr = arr[size];
}
 
void Print_Arr(int *ptr_arr, const int size = 5, const int n = 4)
{
    for (int i = 0; i < size; i++)
    {
        for (int q = 0; q < n; q++)
        {
            std::cout << *ptr_arr[i][q] << "\t";
        }
        std::cout << std::endl;
    }
}
На этапе
C++
1
 std::cout << *ptr_arr[i][q] << "\t";
Выдаёт ошибку Expression must have pointer to object type подсвечивая [q]
Где я ошибся?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2018, 12:52
Ответы с готовыми решениями:

Реализация двухмерного массива для вывода из него слов в обратном порядке
С клавиатуры вводится последовательность, содержащая от 1 до 50 слов, в каждом из которых от 1 до...

Ошибка в коде с признаками (свойствами) вывода данных
Добрый всем вечер, пытаюсь написать программу которая открывает уже существующий файл с занесенной...

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

Компонент для вывода двухмерного массива
В каком компоненте лучше всего выводить двухмерный массив?

12
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
20.08.2018, 13:04 2
Igoryoka, вот сравни со своим кодом
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
28
29
30
31
32
33
34
#include <iostream>
#include <ctime>
 
void Print_Arr(int **ptr_arr, const int, const int);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
 
    const int size = 5;
    const int n = 4;
    int arr[size][n] =
    {
        { 1, 2, 3, 4 },
        { 6, 7, 8, 9 },
        { 11, 12, 13, 14 }
    };
    int *ptr_arr = arr[size];
 
    return 0;
}
 
void Print_Arr(int **ptr_arr, const int size = 5, const int n = 4)
{
    for (int i = 0; i < size; i++)
    {
        for (int q = 0; q < n; q++)
        {
            std::cout << ptr_arr[i][q] << "\t";
        }
        std::cout << std::endl;
    }
}
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
20.08.2018, 13:05 3
Цитата Сообщение от Igoryoka Посмотреть сообщение
int *ptr_arr = arr[size];
указатель ведёт вообще не туда, куда вам бы хотелось. Перечитайте раздел "массивы" и разберитесь почему.


Цитата Сообщение от Igoryoka Посмотреть сообщение
Print_Arr(int *ptr_arr
ptr_arr в данном случае работает как одномерный массив.

Добавлено через 30 секунд
_stanislav, код всё равно работать не будет.
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
20.08.2018, 13:05 4
синтаксические ошибки поправил, подразумеваю что есть еще и логические, их искать не так тривиально как синтаксические.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
20.08.2018, 13:11 5
Если правильно записать ту логику, которую видимо хотел реализовать автор, то она должна быть примерно такой:
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
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <ctime>
 
void Print_Arr(void *ptr_arr, const int size = 5, const int n = 4);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
 
    const int size = 5;
    const int n = 4;
    int arr[size][n] =
    {
        { 1, 2, 3, 4 },
        { 6, 7, 8, 9 },
        { 11, 12, 13, 14 }
    };
    void *ptr_arr = arr; 
    Print_Arr(ptr_arr);
    return 0;
}
 
void Print_Arr(void *ptr_arr, const int size, const int n)
{
    int (*converted_arr)[n] = reinterpret_cast< int (*)[n] >(ptr_arr);
    
    for (int i = 0; i < size; i++)
    {
        for (int q = 0; q < n; q++)
        {
            std::cout << converted_arr[i][q] << "\t";
        }
        std::cout << std::endl;
    }
}
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
20.08.2018, 13:12 6
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
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <ctime>
 
void Print_Arr(int **ptr_arr, const int size = 5, const int n = 4);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
 
    const int size = 5;
    const int n = 4;
    int** arr = new int*[size]
    {
        new int[n] { 1, 2, 3, 4 },
        new int[n] { 6, 7, 8, 9 },
        new int[n] { 11, 12, 13, 14 },
        new int[n] { 6, 7, 8, 9 },
        new int[n] { 11, 12, 13, 14 }
    };
    Print_Arr(arr);
 
    return 0;
}
 
void Print_Arr(int **ptr_arr, const int size, const int n)
{
    for (int i = 0; i < size; i++)
    {
        for (int q = 0; q < n; q++)
        {
            std::cout << ptr_arr[i][q] << "\t";
        }
        std::cout << std::endl;
    }
}
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
20.08.2018, 13:13 7
Хотя такая логика сама по себе не особо корректная.
0
0 / 0 / 0
Регистрация: 17.03.2017
Сообщений: 20
20.08.2018, 13:14  [ТС] 8
Цитата Сообщение от TRam_ Посмотреть сообщение
указатель ведёт вообще не туда, куда вам бы хотелось. Перечитайте раздел "массивы" и разберитесь почему.
TRam_, а почему массивы? Я так понял ошибка в указателях
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
20.08.2018, 13:21 9
Igoryoka, в двумерном массиве нету указателей (кроме разве что указателя на начало массива), там непрерывно идут числа элементов массива. Указатели будут только в коде как у _stanislav.

Добавлено через 4 минуты
Если очень нужно с указателем, то можно вот так
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
28
29
30
31
32
33
#include <iostream>
#include <ctime>
 
void Print_Arr(int *ptr_arr, const int size = 5, const int n = 4);
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(NULL));
 
    const int size = 5;
    const int n = 4;
    int arr[size][n] =
    {
        { 1, 2, 3, 4 },
        { 6, 7, 8, 9 },
        { 11, 12, 13, 14 }
    };
    int *ptr_arr = reinterpret_cast<int *>(arr);
    Print_Arr(ptr_arr);
}
 
void Print_Arr(int *ptr_arr, const int size, const int n)
{
    for (int i = 0; i < size; i++)
    {
        for (int q = 0; q < n; q++)
        {
            std::cout << ptr_arr[n*i + q] << "\t";    // вот именно так в двумерном массиве находится нужный элемент
        }
        std::cout << std::endl;
    }
}
но это опять же криво, зато объясняет что в двумерном массиве находится
0
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
20.08.2018, 14:06 10
Если ты хотел вывести через функцию двумерный массив, то вот мое решение. В ней же и заполнение массива.
using namespace std;
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
28
29
30
31
32
33
void Print_Arr(int *ptr_arr[], const int size, const int n)
{
    for (int i = 0; i < size; i++)
    {
        for (int q = 0; q < n; q++)
        {
            ptr_arr[i][q] = 1 + rand() % 20;
            cout << ptr_arr[i][q] << "\t";
        }
            cout << endl;
    }
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    
    const int size = 3;
    const int n = 4;
    
    int **arr = new int *[size];
    for (int i = 0; i < size; i++)
    {
        arr[i] = new int[n];
    }
 
    Print_Arr(arr, size, n);
 
    delete[] arr;
 
    system("pause");
    return 0;
}
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
20.08.2018, 14:32 11
IP_TCP, решение у тебя с ошибкой - есть утечка памяти
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
20.08.2018, 15:19 12
Цитата Сообщение от TRam_ Посмотреть сообщение
Если очень нужно с указателем, то можно вот так
Нельзя, это UB.
0
7 / 6 / 2
Регистрация: 19.08.2018
Сообщений: 108
20.08.2018, 15:27 13
Цитата Сообщение от TRam_ Посмотреть сообщение
IP_TCP, решение у тебя с ошибкой - есть утечка памяти
Еще какая) Исправил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    const int size = 3;
    const int n = 3;
 
    int **arr = new int *[size];
    for (int i = 0; i < size; i++)
    {
        arr[i] = new int[n];
    }
 
    Print_Arr(arr, size, n);
 
    for (int i = 0; i < n; i++)
    {
        delete[] arr[i];
    }
 
    delete[] arr;
0
20.08.2018, 15:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2018, 15:27
Помогаю со студенческими работами здесь

Форматирование вывода двухмерного массива в textbox
Уважаемые форумчане, выручайте. В цикле выводятся значения из массивов time и fsy, в textbox10....

Ошибка в коде вывода символа на экран!
Здраствуйте, есть код программы на ассемблере. Работаю в тасм. Когда запускаю программу выдает...

Обработка двухмерного массива...где ошибка??
Тема: обработка двумерных массивов Цель: Приобретение навыков составления алгоритмов и...

Перенос повторяющихся значений из двухмерного двухмерного массива в другой массив и запуск функции
Здравствуйте, форумчане! У меня есть двухмерный массив (string,string) В первом столбце хранятся...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru