복습: 제네릭 배열
Coddy C 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 61개 중 53번째.
챌린지
쉬움void* 포인터를 사용하여 동일한 컬렉션 내에 정수와 문자열을 혼합하여 저장할 수 있는 유연한 데이터 구조인 GenericArray 컨테이너를 만들어 보겠습니다.
코드는 다음 세 개의 파일로 구성됩니다:
generic_array.h: 세 개의 멤버를 가진GenericArray구조체를 정의합니다: 포인터를 저장할void**배열, 현재 개수를 나타내는int, 그리고 용량을 나타내는int. 배열 생성, 요소 추가, 인덱스로 요소 가져오기, 그리고 배열 해제를 위한 함수 프로토타입을 선언합니다.generic_array.c: 컨테이너의 기능을 구현합니다:create_array— 주어진 초기 용량으로 GenericArray를 할당하고 count를 0으로 초기화합니다.add_element— 다음 사용 가능한 슬롯에void*포인터를 저장하고 count를 증가시킵니다 (용량이 충분하다고 가정합니다).get_element— 지정된 인덱스의void*를 반환합니다.free_array— items 배열과 GenericArray 구조체 자체를 해제합니다.
main.c: 정수와 문자열을 모두 저장하여 제네릭 배열을 시연합니다. 추가할 요소의 개수를 읽은 다음, 각 요소에 대해 타입 표시자(정수는i, 문자열은s)와 값을 읽습니다. 모든 요소를 추가한 후, 배열을 순회하며 각 값을 출력합니다. 정수의 경우 숫자를 직접 출력하고, 문자열의 경우 텍스트를 직접 출력합니다.
프로그램은 다음을 입력받습니다:
- 추가할 요소의 개수
- 각 요소에 대해: 타입 표시자(
i또는s)와 그 뒤에 오는 값
정수를 추가할 때는 int를 위한 메모리를 할당하고 포인터를 저장하세요. 문자열을 추가할 때는 메모리를 할당하고 문자열을 복사하세요. 값을 가져올 때는 출력을 위해 적절한 타입으로 다시 캐스팅하세요.
중요: 출력을 위해 타입을 추적하려면, main에서 타입 표시자를 저장하는 간단한 병렬 배열을 사용하거나 각 요소와 함께 타입 표시자 문자를 저장할 수 있습니다.
입력이 3이고, 이어서 i 42, s Hello, i 100인 경우의 출력 예시:
42
Hello
100입력이 4이고, 이어서 s World, s Generic, i -5, s Arrays인 경우의 출력 예시:
World
Generic
-5
Arrays헤더 파일에 include guard를 사용하는 것을 잊지 마세요. 컨테이너 자체는 어떤 타입을 저장하는지 알 필요가 없으며, 단지 void* 포인터들을 보유할 뿐입니다. 타입을 아는 책임은 요소를 추가하고 가져오는 코드에 있습니다.
직접 해보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: 용량 n을 가진 GenericArray 생성
// TODO: 타입을 추적하기 위한 병렬 배열 생성 (크기 n의 char 배열)
// TODO: 각 요소에 대하여:
// - 타입 표시자(i 또는 s)를 읽음
// - 값을 읽음
// - 정수인 경우: int를 위한 메모리를 할당하고, 값을 저장한 뒤 배열에 추가
// - 문자열인 경우: 문자열을 위한 메모리를 할당하고, 값을 복사한 뒤 배열에 추가
// - 병렬 배열에 타입 표시자를 저장
// TODO: 배열을 순회하며 각 요소를 출력
// - 병렬 배열에서 타입을 확인
// - void*를 적절한 타입으로 다시 캐스팅하여 출력
// TODO: 할당된 모든 메모리 해제 (정수, 문자열, 그리고 배열)
return 0;
}