Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
1

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

24.10.2016, 12:58. Просмотров 959. Ответов 13
Метки нет (Все метки)

Добрый. Расскажите в чем разница между:
C++
1
2
3
double **MatrixA[n][m];
double *MatrixA[n][m];
double MatrixA[n][m];
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2016, 12:58
Ответы с готовыми решениями:

Объяснить разницу между int64_t, int_fast64_t и int_least64_t
Есть вот такое: я чего то не пойму, чем отличаются обычные с _t, от fast и least ? Судя по...

Объяснить разницу между префиксным и постфиксным инкрементом на простых примерах
Можете объяснить разницу между i++ и ++i на просто примере с цифрами?

Объяснить разницу между массивом типа char и строкой в стиле Си (нюансы использования нуль-терминатора)
Господа, появился такой вопрос: какое место занимает \0 в массиве charов? В данном коде пытался...

Разница между объявлениями указателя
Часто вижу, при создании объекта класса, создают указатель на объект #include <iostream>...

Разница между объявлениями указателей
Есть такое: int *p; и такое: int *p = new int; Поясните, пожалуйста, в чём разница между...

13
Даценд
Модератор
Эксперт .NET
5118 / 4354 / 2818
Регистрация: 20.04.2015
Сообщений: 7,852
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
0
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
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] , а как обратиться к её столбцу?
0
DemolitionMan
130 / 156 / 87
Регистрация: 06.04.2016
Сообщений: 992
24.10.2016, 14:07 4
Matrix[stroka][stolbec] - обращение к элементу. К столбцу, я так понял, нельзя обратиться.
0
24.10.2016, 14:07
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
24.10.2016, 14:09  [ТС] 5
Нет, я не об этом.
Я могу обращаться к целой строке матрицы, а не лишь определенному элементу.
Вот мне нужно взять всю строку.
0
GbaLog-
Любитель чаепитий
3203 / 1504 / 472
Регистрация: 24.08.2014
Сообщений: 5,273
Записей в блоге: 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];
}
1
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
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*
0
Даценд
Модератор
Эксперт .NET
5118 / 4354 / 2818
Регистрация: 20.04.2015
Сообщений: 7,852
24.10.2016, 14:37 8
Цитата Сообщение от jameses Посмотреть сообщение
А весь столбец как взять?
А никак.
Лучше объясните, зачем нужен столбец, может что-нибудь придумаем.
1
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
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;
}
0
Даценд
Модератор
Эксперт .NET
5118 / 4354 / 2818
Регистрация: 20.04.2015
Сообщений: 7,852
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];
1
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
24.10.2016, 14:53  [ТС] 11
Оптимальная передача будет отправляя сразу кортеж данных в процесс, чем использование по символьной отправки.
Поэтому для умножения матриц, я отправляю матрицу Б по строкам, но мне нужно её собрать в единую, чтобы обработать её.
Из этого следует, что необходимо:
Либо отправлять сразу построчно
Либо отправлять и после получения создавать матрицу из строк..

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

Добавлено через 9 минут
А как после того что получил в типе double перевести его в double* ?
0
Даценд
Модератор
Эксперт .NET
5118 / 4354 / 2818
Регистрация: 20.04.2015
Сообщений: 7,852
24.10.2016, 18:54 12
Лучший ответ Сообщение было отмечено jameses как решение

Решение

Цитата Сообщение от 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);
1
jameses
0 / 0 / 3
Регистрация: 21.10.2014
Сообщений: 215
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].
0
Миниатюры
Объяснить разницу между объявлениями массивов  
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
5772 / 2773 / 758
Регистрация: 18.10.2014
Сообщений: 4,986
28.10.2016, 17:52 14
Цитата Сообщение от jameses Посмотреть сообщение
for(j=0;j>n;j++)
И что это за цикл?
0
28.10.2016, 17:52
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2016, 17:52

Какая разница между разными объявлениями объектов?
чет 4 месяца не писал на С++ а писал на сшарпе немного. Но вот вернувшись к С++ чет вылетело с...

Указатели на массивы: В чем принципиальное различие между объявлениями указателей?
Вопрос по теории В чем принципиальное различие между данными обьявлениями? (+ правильно ли я...

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.