1차원 배열을 2차원 배열로 변환하는 코드 작성 중 질문입니다.
      글쓴이: fopenfclose / 작성시간: 목, 2015/12/17 - 12:30오전    
  
  1 2 3 4 5 6 7 8 9 를
1 2 3
4 5 6
7 8 9
이렇게 만들어서 반환하는 함수입니다.
int ** make2Dmatrix(const Matrix * A, int a_numRows, int a_numCols)
{
	// MAKE 2D
	int ** afArr = (int **)malloc(sizeof(int) * a_numRows);
	if (afArr == NULL)
	{
		cout << "mem alloc fail(transpose)" << endl;
		return NULL;
	}
 
	for (int i = 0; i < a_numRows; i++)
	{
		afArr[i] = (int *)malloc(sizeof(int) * a_numCols);
		if (afArr[i] == NULL)
		{
			cout << "transpose mem alloc fail" << endl;
			return NULL;
		}
		memcpy(afArr[i], A->mat + (i * sizeof(int) * A->numCols), sizeof(int) * A->numCols); <- 테스트해보니 이 부분에서 문제가 일어납니다. 
                                                                                                        // 1 2 3 까지는 복사가 되는데 그 다음부분이 전혀 
                                                                                                        // 복사가 되지 않습니다. 주소 연산이 잘 못된 것 같지
                                                                                                        // 않은데 왜 안되는지 모르겠습니다.
                                                                                                        // 간절히 도움 부탁드립니다.
	}
 
	cout << endl;
	cout << "make2Dmatrix text" << endl;
 
	for (int i = 0; i < A->numRows; i++)
	{
		for (int j = 0; j < A->numCols; j++)
		{
			cout << afArr[i][j] << " ";
		}
		cout << endl;
	}
	return afArr;
}Forums: 


포인터에 대한 산술 연산 오류 같네요..
예를 들어보겠습니다.
위 코드에서 (1) 과 (2) 중 잘못된 것이 어느것일까요?
(2)번이죠.
포인터에 대한 산술 연산은 주소값의 단순 증감가 아니라, **포인터가 가리키는 데이터의 크기만큼의 증감**이 이루어 집니다.
아마도 Matrix::mat는 포인터일테니,
이렇게 하는 것이 맞지 않을까요?
/* How to Love Others */
while(GetDepth(Love) < Enough) DoLove();
아 덕분에 실행 잘 됩니다.
가르쳐 주셔서 감사합니다. 좋은 배움 얻습니다.
64bit 기계에선 오동작할 것 같은데요. int
64bit 기계에선 오동작할 것 같은데요.
int **x = malloc(sizeof(int*) * num_rows)
혹은
int **x = malloc(sizeof(*x) * num_rows)
처럼.
답변 감사드립니다. 근데 (int *) 와
답변 감사드립니다.
근데 (int *) 와 (*x)의 차이는 무엇인가요??
(*x) 는 x 의 type 이 float** 으로
(*x) 는 x 의 type 이 float** 으로 바뀌더라도 수정할 필요가 없는 표현입니다.
실수 방지, 귀차니즘... 겸사겸사.
같은 방식으로,
보단
처럼 쓰는 걸 선호하는 편입니다.
기분내키면...
포인터는 단순히 주소 값만을 의미하는 것이 아니라.
그 타입으로써 가리키는 대상의 크기 정보도 가지고 있으므로,
가리키는 대상은 메모리 주소만이 아니라 그 크기 만큼의 메모리 공간 전부가 됩니다.
고로 +1을 하면 범위의 끝 바로 다음 주소로 이동이 되는 것입니다.
http://cafe.daum.net/codeinside
댓글 달기