어제 이어서 2차원 배열 예제 풀다가… 내가 이 문제에서 고민하는 부분은 다음과 같음.

주어진 1차원 배열들은 모두 같은 기능을 통해서 특정한 결과물로 출력되게 됨. 함수를 이용해서 이들의 결과물출력을 일반적이게 만들고 싶지만 이들의 변수명을 함수 내에서 통제할 방법을 모르겠음.. 그래서 같은 기능을 하는 코드를 n번짜고있었음…

ave_year_temp()
{
	printf("[Yearly average temperature of 3 years]\\n");
	float sum, ave, *ptr_arr;
	ptr_arr = year2022;
	for (int i = 0; i < YEARS; i++)
	{
		printf("Year 0 : average temperature = ");
		for (int j = 0; j < MONTHS; j++)
		{
			*ptr_arr += *ptr_arr++;
		}
		printf("%.1f", (*ptr_arr / 12));
		ptr_arr + 12;
		printf("\\n");
	}
}

위의 아이디어를 구현해봤는데.. ㅋㅋ 작동은 안된다. 왜일까?

ave_year_temp()
{
	printf("[Yearly average temperature of 3 years]\\n");

	double sum = year2022[0];
	double* ptr_arr = NULL;
	ptr_arr = year2022;

	for (int i = 1; i <= YEARS; i++)
	{
		printf("Year %d : average temperature = ", i);
		for (int j = 0; j < MONTHS; j++)
		{
			sum += *(++ptr_arr);
		}
		printf("%.1f", (sum / 12));
		sum = *ptr_arr; // sum 다음 배열의 첫 값으로 초기화
		printf("\\n");
	}
}

겨우 해결…

일단 아이디어는 맞는 듯

고생한 부분은 다음과 같다.

  1. 포인터의 자료형은 반드시 dereferencing했을때의 값의 자료형과 동일해야 한다. 그래야 포인터 산술같은게 내 계산대로 됨. 첫번째 코드에서 나는 생각없이 포인터를 float으로 줬다. 어차피 .0단위 계산할꺼니까.. 하면서, dereferencing하는 배열이 초기에 double로 설정되었으므로 따라가줘야 한다. 이거때문에 한 30분 혼자 고민한듯.
  2. for문 안에서 *(++ptr_arr) 해주면 그 값은 계속 ++ 된 상태이다. 위에서처럼 거기에다가 또 +12해주면 말도안되는 주소로 날아가버림. 그래서 +12부분은 없애줘야 한다. 얼추 된 것 같은데 왜 3번째 반복문에서 쓰레기값이 나올까 계속 고민하다가 한줄씩 디버깅 해보니 두번째 반복문때 이미 마지막 배열의 첫 값으로 저장되어있다는 걸 알게됨. 중요한건 증감연산자 해주고 for문 나오면 그 값이 다시 for문 전으로 초기화되는게 아니라는 점임. for문 나와도 그 값은 더해진 상태임
  3. 전위증가연산자와 후위증가연산자의 역할을 드디어 이해함. 후위는 세미콜론까지 한번 갔다오고, 전위는 일단 증가시키고 세미콜론까지 간다는 의미…

강의듣고 바로 할 수 있을줄 알았는데 내 힘으로 구현해보는건 개같이 힘든 일이었다.. 제기랄. 그리고 포인터를 이용하면 반복문을 여러번 안써도 된다는 사실을 알았으니 첫번째 내용도 포인터로 다시 재구성할 수 있을 듯.

그리고 다음 문제도 구현했음. 원리를 생각하니 그 변형인 다음 문제는 좀 더 빨리 해결함..

ave_month_temp()
{
	double sum = 0;
	double* ptr_mnt = year2022;

	printf("[Monthly average temperature of 3 years]\\n");
	printf("Year index :	");

	int MONTHS_index[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	for (int k = 0; k < MONTHS; k++)
	{
		printf("%d	", MONTHS_index[k]);
	}
	printf("\\n");
// MONTHLY AVG
	printf("Avg temps  :	");
	for (int i = 0; i < MONTHS; i++)
	{
		for (int j = 0; j < YEARS; j++)
		{
			sum += *ptr_mnt;
			ptr_mnt += 12;
		}
		printf("%.1f	", (sum / 3.0f));
		sum = 0.0;
		ptr_mnt = &year2022[i + 1];
	}
	printf("\\n");
}

다만 여기서 헤맸던 거는 바깥쪽 for문의 마지막 문장인