Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
2 / 1 / 1
Регистрация: 14.10.2014
Сообщений: 13

Ссылка на массив и внутренний массив

14.10.2014, 09:17. Показов 3047. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите что делать.
Вхожу в функцию с указателем на матрицу

C
1
2
void invMatr ( float *a[3][3], float e) 
{
в функции внутренняя матрица
C
1
float  matr[3][7];
и некоторое действие
C
1
matr[i][j] = a[i][j];
компилятор ругается

../MatrixAngle.c:28: error: incompatible types in assignment
../MatrixAngle.c:78: error: invalid operands to binary * (have 'float *' and 'float *')

как в такой ситуации лучше поступить?
Почитал немного интернет,
как понял можно передать в функцию ссылку
C
1
2
void invMatr ( float& a[3][3], float e) 
{
либо привести матрицу внутри функции к виду указателя
C
1
2
float  matr[3][7];
        float   *pmatr = &matr;
А что более правильно и будет работать?

Добавлено через 11 минут
Вот код одной из функций, там присутствуют обе ошибки,
в строке перемножения - суммирования и в строке присвоения.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// -----------------------------------------------
// Перемножение матриц
// -----------------------------------------------
void MatrixMul ( float *m1[3][3], float *m2[3][3] )
{
  float m3[3][3];
  
  // multiplex matrix
  for ( int i=0; i<4; i++)      
  for ( int j=0; j<4; j++) {  
    m3[i][j] = 0;
    for ( int k=0; k<4; k++ ) {
      m3[i][j] += m1[i][k] * m2[k][j];
    }
  }
 
  // write temp matrix to first matrix
  for ( int i = 0; i < 4; i++) { 
  for ( int j = 0; j < 4; j++) {
    m1[i][j] = m3[i][j]; 
  }
  }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.10.2014, 09:17
Ответы с готовыми решениями:

Вывести на печать массив X, массив Z, массив Y, произведение элементов массива X, упорядоченный массив Y
Вывести на печать массив X, массив Z, массив Y, произведение элементов массива X, упорядоченный массив Y. ...

Ссылка на массив
Приветствую. Делаю библиотеку dll. Есть функция Public Function SetListText(Word As Object, ByRef TextList() As String) As Integer ...

Ссылка на Массив
Ребят, уже задавал вопрос, но ответа так и не получил. Вопрос кажется простым, но на деле ничего не выходит. Ковыряюсь уже не первый день. ...

7
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
14.10.2014, 09:35
Цитата Сообщение от taraserker Посмотреть сообщение
Вхожу в функцию с указателем на матрицу
Сразу же неправильно. В прототипе и определении функции надо передавать в функцию указатель на первый элемент массива и отдельным параметром размеры массива.
При вызове функции в качестве параметра подсовываете адрес1 первого элемента массива и так же отдельными параметрами размеры матрицы.

Добавлено через 4 минуты
Вот посмотрите, как здесь я сделал передачу матрицы в функцию.

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// -----------------------------------------------
// Перемножение матриц
// -----------------------------------------------
void MatrixMul ( float *m1, float *m2, const int MATRIX_SIZE )
{
    float m3[MATRIX_SIZE][MATRIX_SIZE];
  
    // multiplex matrix
    for (int i=0; i<MATRIX_SIZE; i++)      
        for (int j=0; j<MATRIX_SIZE; j++)
        {  
            m3[i][j] = 0;
            for (int k=0; k<MATRIX_SIZE; k++ )
                m3[i][j] += m1[i][k] * m2[k][j];
        }
 
    // write temp matrix to first matrix
    for (int i = 0; i<MATRIX_SIZE; i++)
        for (int j = 0; j<MATRIX_SIZE; j++)
            m1[i][j] = m3[i][j];
}
_____________________
1 Имя массива является адресом первого элемента массива.
0
2 / 1 / 1
Регистрация: 14.10.2014
Сообщений: 13
14.10.2014, 09:55  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
m1[i][j] = m3[i][j];
../MatrixAngle.c:85: error: subscripted value is neither array nor pointer

Вряд ли ... я попробовал и компилятор пишет то что я пытаюсь сделать после изменений не является ни массивом ни указателем.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
14.10.2014, 10:12
Цитата Сообщение от taraserker Посмотреть сообщение
я попробовал
Память-то в мэйне выделяли под массивы m1 и m2? Типа вот так:
C++
1
2
3
4
5
6
7
8
9
    // выделяем память для матрицы m1:
    float ** m1 = new float * [MATRIX_SIZE];
    for (int i=0; i<MATRIX_SIZE; ++i)
        m1[i] = new float[MATRIX_SIZE];
 
    // выделяем память для матрицы m2:
    float ** m2 = new float * [MATRIX_SIZE];
    for (int i=0; i<MATRIX_SIZE; ++i)
        m2[i] = new float[MATRIX_SIZE];
Цитата Сообщение от taraserker Посмотреть сообщение
компилятор пишет то что я пытаюсь сделать после изменений не является ни массивом ни указателем
Полностью код покажите свой.
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2224 / 1426 / 420
Регистрация: 16.05.2013
Сообщений: 3,647
Записей в блоге: 6
14.10.2014, 10:16
Лучший ответ Сообщение было отмечено taraserker как решение

Решение

Начнем стого, что это
C++
1
void invMatr ( float *a[3][3], float e)
передача в функцию массива указателей на float. Пишите просто:
C++
1
void invMatr ( float a[][3], floatint SIZE)
Передача по ссылке производится следующим образом:
C++
1
void invMatr ( float (&a)[3][3], float e)
а то что вы написали это передача массива ссылок.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
14.10.2014, 10:58
Всё работает:
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
#include <iostream>
 
const int MATRIX_SIZE = 3;
 
void MatrixMul(float ** m1, float ** m2, const int MATRIX_SIZE);
void show_matrix(float ** matrix);
 
int main()
{
    // выделяем память для матрицы m1:
    float ** m1 = new float * [MATRIX_SIZE];
    for (int i=0; i<MATRIX_SIZE; ++i)
        m1[i] = new float[MATRIX_SIZE];
 
    // выделяем память для матрицы m2:
    float ** m2 = new float * [MATRIX_SIZE];
    for (int i=0; i<MATRIX_SIZE; ++i)
        m2[i] = new float[MATRIX_SIZE];
 
    for (int i=0; i<MATRIX_SIZE; i++)
        for (int j=0; j<MATRIX_SIZE; j++)
        {
            std::cout << "We start to fill the array m1.\n"
            "Enter the value of m1[" << i << "][" << j << "] element: ";
            std::cin >> m1[i][j];
        }
 
    std::cout << std::endl << std::endl;
 
    for (int i=0; i<MATRIX_SIZE; i++)
        for (int j=0; j<MATRIX_SIZE; j++)
        {
            std::cout << "We start to fill the array m2.\n"
            "Enter the value of m2[" << i << "][" << j << "] element: ";
            std::cin >> m2[i][j];
        }
 
    std::cout << std::endl << std::endl;
 
    MatrixMul(m1, m2, MATRIX_SIZE); // вызов функции
 
    show_matrix(m1);
 
    // освобождаем память:
    for (int i = 0; i<MATRIX_SIZE; ++i)
        delete [] m1[i];
    delete [] m1;
 
    for (int i = 0; i<MATRIX_SIZE; ++i)
        delete [] m2[i];
    delete [] m2;
 
    return 0;
}
 
 
// Функция перемножения матриц:
void MatrixMul(float ** m1, float ** m2, const int MATRIX_SIZE)
{
    // выделяем память для матрицы m3:
    float ** m3 = new float * [MATRIX_SIZE];
    for (int i=0; i<MATRIX_SIZE; ++i)
        m3[i] = new float[MATRIX_SIZE];
 
    // multiplex matrix
    for (int i=0; i<MATRIX_SIZE; i++)
        for (int j=0; j<MATRIX_SIZE; j++)
        {
            m3[i][j] = 0;
            for (int k=0; k<MATRIX_SIZE; k++ )
                m3[i][j] += m1[i][k] * m2[k][j];
        }
 
    // write temp matrix to first matrix
    for (int i = 0; i<MATRIX_SIZE; i++)
        for (int j = 0; j<MATRIX_SIZE; j++)
            m1[i][j] = m3[i][j];
 
    // освобождаем память:
    for (int i = 0; i<MATRIX_SIZE; ++i)
        delete [] m3[i];
    delete [] m3;
 
}
 
// Выводим содержимое матрицы на экран:
void show_matrix(float ** matrix)
{
    for (int i=0; i<MATRIX_SIZE; ++i)
    {
        for (int j=0; j<MATRIX_SIZE; ++j)
            std::cout << matrix[i][j] << "\t";
        std::cout << std::endl;
    }
}
0
2 / 1 / 1
Регистрация: 14.10.2014
Сообщений: 13
14.10.2014, 20:51  [ТС]
Цитата Сообщение от gru74ik Посмотреть сообщение
Всё работает:
Возможно. Только у меня код на СИ, а не С++
поэтому эти конструкции к сожалению не применимы.

Спасибо товарищ мне помог.
"по правилам С - передается все равно не сама матрица, а указатель на неё."
http://www.c-cpp.ru/books/pere... -v-funkcii

Поубирал все звездочки, и теперь занимаюсь программой дальше.

В любом случае спасибо за помощь.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
15.10.2014, 07:26
Цитата Сообщение от taraserker Посмотреть сообщение
Возможно. Только у меня код на СИ, а не С++
Только это раздел C++. Раздел Си в соседней ветке: С для начинающих.
В Си для выделения памяти используйте malloc вместо плюсового new, а для освобождения памяти free вместо delete.

Цитата Сообщение от taraserker Посмотреть сообщение
"по правилам С - передается все равно не сама матрица, а указатель на неё."
В C++ ровно то же самое. Передаётся не сам массив (или, в Вашем случае, двумерный массив), а указатель на него:
Зачем использовать Указатель на указатель?
Что оптимальнее: передавать матрицу как аргумент, или же формировать её внутри функции?
Сравнение двумерных матриц - разобрать код
Указатель на матрицу
Передача динамической матрицы в функцию
Динамический массив и указатели!?
Передача небольшой матрицы в функцию
Как правильно передать в функцию указатель на двумерный массив?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.10.2014, 07:26
Помогаю со студенческими работами здесь

Ссылка на массив
Необходимо объявить ссылку на массив из нескольких целых.Что представляет из себя такая ссылка и как правильно её объявить?как может ссылка...

Ссылка на массив
В одном классе есть такой массив: private float array1; в другом классе нужно его обработать. Как обратиться к нему из второго класса? ...

Ссылка на байтовый массив
Уважаемые форумчане , подскажите как правильно будет передать адрес байтовой переменной например на Си это выглядит так char...

Ссылка на двумерный массив
Здравствуйте. Объясните досконально это выражение: int (&amp;ref1);

Ссылка на массив в классе
Здравствуйте. Есть класс, он должен хранить ссылку на массив. Класс представляет собой обертку на массивом. В конструкторе надо...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru