복습: 제네릭 배열
Coddy C 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 61개 중 53번째.
챌린지
쉬움GenericArray 컨테이너를 만들어 봅시다. 이 컨테이너는 void* 포인터를 사용하여 동일한 컬렉션에 integers와 strings를 혼합해서 저장할 수 있는 유연한 데이터 구조입니다.
코드를 세 개의 파일로 구성합니다.
generic_array.h: 세 개의 멤버를 가진GenericArray구조체를 Define합니다. 포인터를 hold할void**array, 현재 count를 나타내는int, capacity를 나타내는int입니다. array를 생성하고, elements를 add하고, index로 elements를 검색하고, array를 해제하는 function prototypes를 Declare합니다.generic_array.c: 컨테이너의 기능을 Implement합니다.create_array: 주어진 초기 capacity로 GenericArray를 할당하고 count를 0으로 초기화합니다.add_element: 다음 사용 가능한 위치에void*포인터를 저장하고 count를 증가시킵니다(capacity는 충분하다고 가정합니다).get_element: 지정된 index의void*를 반환합니다.free_array: items array와 GenericArray 구조체 자체를 해제합니다.
main.c: integers와 strings를 모두 저장하여 generic array를 보여 줍니다. add할 elements의 수를 읽은 다음, 각 element에 대해 type indicator(i는 integer,s는 string)와 value를 읽습니다. 모든 elements를 add한 후 array를 Iterate하며 각 value를 출력합니다. integers의 경우 number를 직접 출력합니다. strings의 경우 text를 직접 출력합니다.
프로그램은 다음을 입력으로 받습니다.
- add할 elements의 수
- 각 element에 대해: type indicator(
i또는s)와 value
integers를 add할 때는 int를 위한 메모리를 Allocate하고 포인터를 저장합니다. strings를 add할 때는 메모리를 Allocate하고 string을 copy합니다. 검색할 때는 출력할 appropriate type으로 다시 Cast합니다.
중요: 출력할 type을 추적하려면 main에서 type indicators의 간단한 병렬 array를 사용하거나, 각 element와 함께 type indicator character를 저장할 수 있습니다.
입력이 3이고 이어서 i 42, s Hello, i 100일 때의 예시 출력입니다.
42
Hello
100입력이 4이고 이어서 s World, s Generic, i -5, s Arrays일 때의 예시 출력입니다.
World
Generic
-5
Arraysheader file에서 include guards를 사용하는 것을 잊지 마세요. 컨테이너 자체는 어떤 type을 저장하는지 알 필요가 없습니다. 컨테이너는 단지 void* 포인터를 hold합니다. type을 아는 책임은 elements를 add하고 검색하는 코드에 있습니다.
직접 해보기
#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;
}
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C 컴파일러