Форум программистов, компьютерный форум CyberForum.ru

Объяснить разницу между объявлениями массивов - C++

Восстановить пароль Регистрация
 
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
24.10.2016, 12:58     Объяснить разницу между объявлениями массивов #1
Добрый. Расскажите в чем разница между:
C++
1
2
3
double **MatrixA[n][m];
double *MatrixA[n][m];
double MatrixA[n][m];
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Даценд
Модератор
 Аватар для Даценд
2512 / 2427 / 1245
Регистрация: 20.04.2015
Сообщений: 4,625
24.10.2016, 13:06     Объяснить разницу между объявлениями массивов #2
jameses,
То, что расположено до идентификатора (MatrixA) говорит о типе элементов, которые в этом массиве будут храниться.
C++
1
2
3
double **MatrixA[n][m]; // тип элементов double** , т.е. такой массив будет хранить указатели на указатели
double *MatrixA[n][m];  // тип элементов double* , т.е. такой массив будет хранить указатели
double MatrixA[n][m];   // тип элементов double , т.е. такой массив будет хранить значения типа double
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
24.10.2016, 13:55  [ТС]     Объяснить разницу между объявлениями массивов #3
К примеру есть:
C++
1
2
3
double **MatrixB = { nullptr };
MatrixB = initMatrix(MatrixB, n, m); //инициализирует матрицу - выделяя память
MatrixB = generateMatrix(MatrixB, n, m); // генерирует матрицу
Я могу обращаться к строке матрицы MatrixB через MatrixB[i] , а как обратиться к её столбцу?
DemolitionMan
 Аватар для DemolitionMan
22 / 54 / 18
Регистрация: 06.04.2016
Сообщений: 325
24.10.2016, 14:07     Объяснить разницу между объявлениями массивов #4
Matrix[stroka][stolbec] - обращение к элементу. К столбцу, я так понял, нельзя обратиться.
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
24.10.2016, 14:09  [ТС]     Объяснить разницу между объявлениями массивов #5
Нет, я не об этом.
Я могу обращаться к целой строке матрицы, а не лишь определенному элементу.
Вот мне нужно взять всю строку.
GbaLog-
Не Эксперт C++
1473 / 618 / 174
Регистрация: 24.08.2014
Сообщений: 2,522
Записей в блоге: 1
Завершенные тесты: 2
24.10.2016, 14:16     Объяснить разницу между объявлениями массивов #6
Цитата Сообщение от jameses Посмотреть сообщение
Вот мне нужно взять всю строку.
Kак-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
int main()
{
    int** matr = new int*[3];
    matr[0] = new int[3];
    matr[1] = new int[3];
    matr[2] = new int[3];
    
    int* arr;
    arr = matr[0];
}
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
24.10.2016, 14:36  [ТС]     Объяснить разницу между объявлениями массивов #7
А весь столбец как взять?

Добавлено через 4 минуты
К примеру имея:
C++
1
2
3
4
    double **MatrixA = { nullptr };
        double **MatrixB = { nullptr };
        double **MatrixC = { nullptr };
        double *colomnB[n];
И проинициализированные матрицы, нужно в colomnB записать весь столбец матрицы.
Как это сделать?
Мои предположения -
C++
1
for(i =0; i<n;i++) for(j=0;j>n;j++) colomnB[i] = MatrixB[j][i];
Но, ошибка приведения из double в double*
Даценд
Модератор
 Аватар для Даценд
2512 / 2427 / 1245
Регистрация: 20.04.2015
Сообщений: 4,625
24.10.2016, 14:37     Объяснить разницу между объявлениями массивов #8
Цитата Сообщение от jameses Посмотреть сообщение
А весь столбец как взять?
А никак.
Лучше объясните, зачем нужен столбец, может что-нибудь придумаем.
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
24.10.2016, 14:40  [ТС]     Объяснить разницу между объявлениями массивов #9
У меня задача:
Работа с параллельными процессами. Нужно передавая из процесса в процесс вычислить умножение матриц.
Я передаю матрицу А построчно, а матрицу Б нужно передавать постолбцам.
Код скидываю:
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
#include "mpi.h"
 
using namespace std;
 
void printMatrix(double **a, int n, int m)
{
    for (auto i = 0; i < n; i++) {
        for (auto j = 0; j < m; j++) {
            cout << " " << a[i][j];
        }
        cout << endl;
    }
}
 
double ** initMatrix(double **matrix, int n, int m)
{
    // Выделяем память
    matrix = new double *[n];
    for (auto i = 0; i < n; i++)
        matrix[i] = new double[m];
    return matrix;
}
 
double ** generateMatrix(double **matrix, int n, int m)
{
    for (auto i = 0; i < n; i++)
        for (auto j = 0; j < m; j++) {
            matrix[i][j] = rand() % 5;
        }
    return matrix;
}
 
int main(int argc, char* argv[])
{
    srand(time(nullptr));
    int i, j;
    const auto n = 4,
        m = 4,
        k = 4;
 
    int rank;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0)
    {
        double **MatrixA = { nullptr };
        double **MatrixB = { nullptr };
        double **MatrixC = { nullptr };
        double *colomnB[n];
 
        MatrixA = initMatrix(MatrixA, n, m);
        MatrixA = generateMatrix(MatrixA, n, m);
        MatrixB = initMatrix(MatrixB, n, m);
        MatrixB = generateMatrix(MatrixB, n, m);
        MatrixC = initMatrix(MatrixC, n, k);
 
        cout << endl << "Matrix A: " << endl;
        printMatrix(MatrixA, n, m);
        cout << endl << "Matrix B: " << endl;
        printMatrix(MatrixB, n, m);
 
        
 
        for (i = 0; i < n; i++)
        {
            MPI_Ssend(MatrixA[i], m + 1, MPI_DOUBLE, i + 1, 99, MPI_COMM_WORLD);
        }
        /*
        for (i = 0; i < n; i++)
        {
            MPI_Ssend(MatrixB[i], m + 1, MPI_DOUBLE, i + 1, 99, MPI_COMM_WORLD);
        } Здесь отправка матрицы
        */ 
        for (i = 0; i < n; i++)
        {
            MPI_Recv(MatrixC[i], k, MPI_DOUBLE, i + 1, 99, MPI_COMM_WORLD, &status);
        }
 
        cout << endl << "[Result] Matrix C: " << endl;
        printMatrix(MatrixC, n, k);
    }
    else
    {
        double rowA[m];
        double rowC[k];
        double MatrixB[n][m];
 
        MPI_Recv(rowA, m + 1, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, &status);
        //MPI_Recv(MatrixB[i], m + 1, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, &status); - здесь получение матрицы Б, нужно сделать принятие по столбцам
 
        for (i = 0; i < k; i++) {
            rowC[i] = 0;
            for (j = 0; j < m; j++) {
                rowC[i] += rowA[j] * MatrixB[j][i];
            }
        }
 
        MPI_Ssend(rowC, m, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD);
    }
    MPI_Finalize();
    cin.get();
    return 0;
}
Даценд
Модератор
 Аватар для Даценд
2512 / 2427 / 1245
Регистрация: 20.04.2015
Сообщений: 4,625
24.10.2016, 14:42     Объяснить разницу между объявлениями массивов #10
Тогда так:
C++
1
2
double colomnB[n];
for(i =0; i<n;i++) for(j=0;j>n;j++) colomnB[i] = MatrixB[j][i];
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
24.10.2016, 14:53  [ТС]     Объяснить разницу между объявлениями массивов #11
Оптимальная передача будет отправляя сразу кортеж данных в процесс, чем использование по символьной отправки.
Поэтому для умножения матриц, я отправляю матрицу Б по строкам, но мне нужно её собрать в единую, чтобы обработать её.
Из этого следует, что необходимо:
Либо отправлять сразу построчно
Либо отправлять и после получения создавать матрицу из строк..

Добавлено через 1 минуту
Спасибо.Но, ошибка приведения из double в double*.
Я выше уже написал, что попробовал..

Добавлено через 9 минут
А как после того что получил в типе double перевести его в double* ?
Даценд
Модератор
 Аватар для Даценд
2512 / 2427 / 1245
Регистрация: 20.04.2015
Сообщений: 4,625
24.10.2016, 18:54     Объяснить разницу между объявлениями массивов #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от jameses Посмотреть сообщение
Но, ошибка приведения из double в double*.
невнимательно почитали, я убрал * из объявления массива colomnB:
Так объявляется массив указателей:
C++
1
double *colomnB[n];
Так массив значений типа double:
C++
1
double colomnB[n];
Еще я бы поменял методы initMatrix и generateMatrix:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double ** initMatrix(int n, int m)
{
    // Выделяем память
    double ** matrix = new double *[n];
    for (auto i = 0; i < n; i++)
        matrix[i] = new double[m];
    return matrix;
}
 
void generateMatrix(double **matrix, int n, int m)
{
    for (auto i = 0; i < n; i++)
        for (auto j = 0; j < m; j++) 
            matrix[i][j] = rand() % 5;
 
}
Вызовы:
C++
1
double **MatrixA = initMatrix(n, m); //без предварительного объявления double **MatrixA
и
C++
1
generateMatrix(MatrixA, n, m);
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 203
28.10.2016, 15:48  [ТС]     Объяснить разницу между объявлениями массивов #13
Даценд, попробовал сделать, но выходит, чтo
C++
1
2
double colomnB[n];
for(i =0; i<n;i++) for(j=0;j>n;j++) colomnB[i] = MatrixB[j][i];
В результате получается такая вещь.
Где -9.2559.. содержимое colomnB[i].
Миниатюры
Объяснить разницу между объявлениями массивов  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2016, 17:52     Объяснить разницу между объявлениями массивов
Еще ссылки по теме:

Как найти разницу двух массивов? C++
C++ Объяснить разницу в именовании заголовочных файлов
C++ Объяснить разницу между массивом типа char и строкой в стиле Си (нюансы использования нуль-терминатора)

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

Или воспользуйтесь поиском по форуму:
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2899 / 1435 / 395
Регистрация: 18.10.2014
Сообщений: 2,643
28.10.2016, 17:52     Объяснить разницу между объявлениями массивов #14
Цитата Сообщение от jameses Посмотреть сообщение
for(j=0;j>n;j++)
И что это за цикл?
Yandex
Объявления
28.10.2016, 17:52     Объяснить разницу между объявлениями массивов
Ответ Создать тему
Опции темы

Текущее время: 12:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru