Как использовать принятый двумерный массив из функции?

Суть такая, возвращаю массив, принимаю, но не могу его использовать, пишет: выражение должно содержать тип указателя на объект или дескриптора массива C++/CLI

#include "stdafx.h"
#include <iostream>
#include "math.h"

using namespace std;
const int sizeMatric = 3;

double* transposeMatric(double matric[sizeMatric][sizeMatric])
{
	double T[sizeMatric][sizeMatric] = { 0 };
	double tmp;

	for (int i = 0; i < sizeMatric; ++i)
	{
		for (int j = 0; j < i; ++j)
		{
			tmp = matric[i][j];
			T[i][j] = matric[j][i];
			T[j][i] = tmp;
		}
	}

	return *T;
}

void main()
{
	double *T;

	do
	{
		T = transposeMatric(tmpUnitMatric);

		for (int i = 0; i < sizeMatric; i++)
		{
			for (int j = 0; j < sizeMatric; j++)
			{
				std::cout << T[i][j] << "\t";    // Здесь ругается
			}
			std::cout << endl;
		}

		break;

	} while (1);
}
  • Вопрос задан
  • 413 просмотров
Пригласить эксперта
Ответы на вопрос 2
@res2001
Developer, ex-admin
Массив Т в transposeMatric - это локальная переменная, вы пытаетесь вернуть указатель на локальную переменную. После выхода из функции все локальные переменные уничтожаются.
На что будет указывать возвращенный указатель? - на какое-то место в стеке, где ранее была правильная переменная, а сейчас может находится все что угодно.
В вашем случае Т надо выделять динамически или возвращать массив по значению.
Ну и
return *T;
вернет T[0][0], а не то что вы, видимо, хотите.
Крометого вы не правильно используете Т в main(). Объявив его как указатель:
double *T;
вы не сообщаете компилятору о размерности массива Т, поэтому индексация массива T[i][j] не может быть выполнена.
Раз уж вы все равно пишете на С++, то используйте std::vector для передачи и возвращения массива.
Ответ написан
Комментировать
WinPooh32
@WinPooh32
Stack Overflow answer searching expert
Не советую использовать i,j во вложенных циклах, т.к. когда-нибудь перепутаете j с i
Используйте осмысленные названия переменных.

Еще можно double[SIZE_Y][SIZE_X] вынести в отдельный тип, чтобы не запутаться в коде:
typedef double matrix[SIZE_Y][SIZE_X];

matrix myAwesomeMatrix = {{1,2,3}{4,5,6}{7,8,9}};


код
#include <iostream>
#include <cmath>

const int SIZE_X = 3;
const int SIZE_Y = 3;
typedef double matrix[SIZE_Y][SIZE_X];


void transposeMatric(matrix& in, matrix& out, int size)
{
   // col == column
  
  for (int row = 0; row < size; ++row)
  {
    for (int col = 0; col < size; ++col)
    {
        out[row][col] = in[col][row];
    }
  }
  
}

int main()
{
    matrix tmpUnitMatric = {{1,2,3},{4,5,6},{7,8,9}};
    matrix T;
    
    transposeMatric(tmpUnitMatric, T, SIZE_Y);
    
    for (int row = 0; row < SIZE_Y; row++)
    {
      for (int col = 0; col < SIZE_X; col++)
      {
        std::cout << std::fixed << T[row][col] << "\t"; 
      }
      std::cout << std::endl;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы