Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 215
#1

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

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

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

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

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

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

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

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

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

13
Даценд
Модератор
Эксперт .NET
3519 / 3440 / 1770
Регистрация: 20.04.2015
Сообщений: 6,343
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 / 2
Регистрация: 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
98 / 154 / 47
Регистрация: 06.04.2016
Сообщений: 992
24.10.2016, 14:07 #4
Matrix[stroka][stolbec] - обращение к элементу. К столбцу, я так понял, нельзя обратиться.
0
jameses
0 / 0 / 2
Регистрация: 21.10.2014
Сообщений: 215
24.10.2016, 14:09  [ТС] #5
Нет, я не об этом.
Я могу обращаться к целой строке матрицы, а не лишь определенному элементу.
Вот мне нужно взять всю строку.
0
GbaLog-
Любитель чаепитий
3030 / 1398 / 337
Регистрация: 24.08.2014
Сообщений: 4,963
Записей в блоге: 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 / 2
Регистрация: 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
3519 / 3440 / 1770
Регистрация: 20.04.2015
Сообщений: 6,343
24.10.2016, 14:37 #8
Цитата Сообщение от jameses Посмотреть сообщение
А весь столбец как взять?
А никак.
Лучше объясните, зачем нужен столбец, может что-нибудь придумаем.
1
jameses
0 / 0 / 2
Регистрация: 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
3519 / 3440 / 1770
Регистрация: 20.04.2015
Сообщений: 6,343
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 / 2
Регистрация: 21.10.2014
Сообщений: 215
24.10.2016, 14:53  [ТС] #11
Оптимальная передача будет отправляя сразу кортеж данных в процесс, чем использование по символьной отправки.
Поэтому для умножения матриц, я отправляю матрицу Б по строкам, но мне нужно её собрать в единую, чтобы обработать её.
Из этого следует, что необходимо:
Либо отправлять сразу построчно
Либо отправлять и после получения создавать матрицу из строк..

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

Добавлено через 9 минут
А как после того что получил в типе double перевести его в double* ?
0
Даценд
Модератор
Эксперт .NET
3519 / 3440 / 1770
Регистрация: 20.04.2015
Сообщений: 6,343
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);
1
jameses
0 / 0 / 2
Регистрация: 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Эксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
28.10.2016, 17:52 #14
Цитата Сообщение от jameses Посмотреть сообщение
for(j=0;j>n;j++)
И что это за цикл?
0
28.10.2016, 17:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2016, 17:52
Привет! Вот еще темы с ответами:

Объяснить разницу в объявлениях указателя - C++
Добрый вечер. Объясните, пожалуйста, в чем разница записи, если я ставлю звездочку двумя способами: int *arrWithDigits = new int; ...

Указатели на массивы: В чем принципиальное различие между объявлениями указателей? - C++
Вопрос по теории В чем принципиальное различие между данными обьявлениями? (+ правильно ли я понимаю, что 1и2, 3и4 это синонимы?) ...

Объяснить разницу в именовании заголовочных файлов - C++
Здравствуйте! Подскажите, пожалуйста, в чем разница между #include&lt;iostream&gt;(в книге по программированию) и #include&lt;iostream.h&gt;(с...

Передача параметров в sprintf - объяснить разницу в двух примерах - C++
Заметил, что результат sprintf(line, &quot;%.2f&quot; format, 1.0f);отличается от sprintf(line, &quot;%.2f&quot; format, 0x3f800000);Во втором случае...


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

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

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