Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2012, 17:43   #1
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
Смущение Массив в функцию

Нужно написать фунцию, которая принимает несколько массивов и возвращает массив, скажем:

float Matrix(float A[][], float B[][]){
int i, j;
float C[2][2];

C[0][0] = A[0][0]*B[0][0] + A[0][1]*B[1][0];
C[0][1] = A[0][0]*B[0][1] + A[0][1]*B[1][1];
C[1][0] = A[1][0]*B[0][0] + A[1][1]*B[1][0];
C[1][1] = A[1][0]*B[0][1] + A[1][1]*B[1][1];

return C[][];
}

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



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

Последний раз редактировалось Artem_Kokos; 31.03.2012 в 18:39. Причина: Чуток допер сам.
Artem_Kokos вне форума Ответить с цитированием
Старый 31.03.2012, 18:49   #2
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Попробуй вот так. С++ не может весь массив целиком возвратить а только его адрес в памяти.
rowsA - количество строк в массиве A
rowsB - ... B
Код:
float *Matrix(float A[][2], int rowsA, float B[][2], int rowsB)
{
	float C[2][2];

	C[0][0] = A[0][0]*B[0][0] + A[0][1]*B[1][0];
	C[0][1] = A[0][0]*B[0][1] + A[0][1]*B[1][1];
	C[1][0] = A[1][0]*B[0][0] + A[1][1]*B[1][0];
	C[1][1] = A[1][0]*B[0][1] + A[1][1]*B[1][1];

	return &C[0][0];
}
А когда передаешь в функцию массив то обязательно нужно указывать сколько в нем столбцов (в квадратных скобках)
Крот вне форума Ответить с цитированием
Старый 31.03.2012, 19:00   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Крот
facepalm. ты хотя бы язык изучи прежде чем советовать что-либо
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.03.2012, 19:09   #4
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Хорошо. Тут ошибся.
Может быть вот так?
Код:
void Matrix(float A[2][2], float B[2][2], float C[2][2])
{
	C[0][0] = A[0][0]*B[0][0] + A[0][1]*B[1][0];
	C[0][1] = A[0][0]*B[0][1] + A[0][1]*B[1][1];
	C[1][0] = A[1][0]*B[0][0] + A[1][1]*B[1][0];
	C[1][1] = A[1][0]*B[0][1] + A[1][1]*B[1][1];
}

int main()
{
	float a[2][2] = 
	{
		{1,2},
		{3,4}
	};

	float b[2][2] =
	{
		{5,6},
		{7,8}
	};

	float c[2][2];

        Matrix(a, b, c);	// массив c изменяеться

  return 0;
}
Крот вне форума Ответить с цитированием
Старый 31.03.2012, 19:19   #5
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

Да, идея именно такова, только компилятор тут ругается на операцию умножения (я не понял почему) и Там вроде когда объявляем функцию как-то вроде по другому задавались аргументы. Точно знаю, что небыло необходимости передавать размерности прямо так, их нужно насколько я помню передавать как отдельный аргумент (примерно как вы предложили в первый раз). Но что-то не могу понять, почему не получается ничего
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Старый 31.03.2012, 19:35   #6
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Код:
void Matrix2(float A[][2], int rowsA, float B[][2], int rowsB, float C[][2], int rowsC)
{
	C[0][0] = A[0][0]*B[0][0] + A[0][1]*B[1][0];
	C[0][1] = A[0][0]*B[0][1] + A[0][1]*B[1][1];
	C[1][0] = A[1][0]*B[0][0] + A[1][1]*B[1][0];
	C[1][1] = A[1][0]*B[0][1] + A[1][1]*B[1][1];
}

int main()
{
	float a[2][2] = 
	{
		{1,2},
		{3,4}
	};

	float b[2][2] =
	{
		{5,6},
		{7,8}
	};


         float c[2][2];

         Matrix2(a, 2, b, 2, c, 2);


         return 0;
}
Правда в этом примере эти параметры никак не участвуют.

Последний раз редактировалось Крот; 31.03.2012 в 19:38.
Крот вне форума Ответить с цитированием
Старый 31.03.2012, 19:39   #7
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

В общем нечто такое меня получилось:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float Multiply_Matrix(float* A, float* B, float* C){
     
     C[0][0] = A[0][0] * B[0][0] + A[0][1] * B[1][0];
     C[0][1] = A[0][0] * B[0][1] + A[0][1] * B[1][1];
     C[1][0] = A[1][0] * B[0][0] + A[1][1] * B[1][0];
     C[1][1] = A[1][0] * B[0][1] + A[1][1] * B[1][1];
     
     }



main(){
       float A[2][2], B[2][2], C[2][2];
       int i, j;
       
       A[0][0]=1;
       A[0][1]=3;
       A[1][0]=4;
       A[1][1]=8;
       
       B[0][0]=6;
       B[0][1]=6;
       B[1][0]=4;
       B[1][1]=12;
       
       Multiply_Matrix(&A, &B, &C);
       
       for(i=0; i<2; i++){
          for(j=0; j<2; j++){
          printf("%f ", C[i][j]);
          }
          printf("\n");
       }
}
Но компилер говорит мне: 7 subscripted value is neither array nor pointer
на эти четыре строчки умножения элементов массива. Полазил на форумах, почитал темы - там все говорят что нужно делать так. Значит передал я правильно аргументы. Но вот почему ругается на вычисления без понятия.
Повторенье - мать ученья. И прибежище для лентяев.

Последний раз редактировалось Stilet; 31.03.2012 в 20:00.
Artem_Kokos вне форума Ответить с цитированием
Старый 31.03.2012, 19:55   #8
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Я не знаю можно так или нет, но проверил и все правильно показывает. без ошибок

Код:
void Multiply_Matrix(float *A, float *B, float *C)
{
	*(C+0) = *(A+0) * *(B+0) + *(A+1) * *(B+2);
	*(C+1) = *(A+0) * *(B+1) + *(A+1) * *(B+3);
	*(C+2) = *(A+2) * *(B+0) + *(A+3) * *(B+2);
	*(C+3) = *(A+2) * *(B+1) + *(A+3) * *(B+3);
}

int main()
{
    Multiply_Matrix(&a[0][0], &b[0][0], &c[0][0]);

    return 0;
}
Крот вне форума Ответить с цитированием
Старый 31.03.2012, 20:09   #9
Artem_Kokos
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 122
По умолчанию

Мм, по-моему так нельзя вообще
Повторенье - мать ученья. И прибежище для лентяев.
Artem_Kokos вне форума Ответить с цитированием
Старый 31.03.2012, 20:26   #10
Крот
Пользователь
 
Регистрация: 15.03.2012
Сообщений: 57
По умолчанию

Тут просто передаются адреса первых элементов массивов. А так как все элементы расположены вплотную друг к другу, то можно получить значение любой ячейки массива.
Не знаю, может кто еще что-то другое предложит.
Крот вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявить массив через функцию. (С++) Alendorff Помощь студентам 11 20.02.2012 18:22
Передача указателей на массив в функцию. nibir Общие вопросы C/C++ 14 06.07.2011 13:24
Как передать Динамический массив в функцию? RainCat Помощь студентам 4 13.04.2011 11:25
Массив используя функцию и процедуру. Profan4ik Помощь студентам 1 30.05.2010 14:06
Передача указателя на массив в функцию loser Общие вопросы C/C++ 2 19.02.2010 19:41