kone
코딩해요
코딩해요

c list -> array function

06/01/2025, 05:38:33
C/C++
2643 views · 1 like


배경:

cpp의 for( auto it = arr.begin(); it != arr.end(); it++)

구문을 실현시키는 메크로를 만들었다. 근데 생각해보니 이거 list에 적용이 안되는 것 같고, 그렇다고 list 전용 메크로를 만들기에는 수고가 필요하니 list->arr를 만들기로 했다.


list의 각 요소를 저장하면서 동시에 list의 길이를 알아내서 arr의 공간을 계산하고 할당하는 것은 어려운 것 같다. 그리고 힙 공간을 사용한다면 에러 처리를 해야하고 이것은 복잡해지는 것 같다, 그러기에 좀 더 간소화하기 위해서 스텍을 이용하기로 했다. ( 근데 이게 맞나? )


//header

#define NULL ((void*)0)

typedef struct Node {
	void* d;
	struct Node* n;
} Node;

int list_to_array_function(void* list, void*** array, char** error_message);


간단하게 헤더를 만들었다.


일단 쓸 list의 구조를 만들었다. array는 즉석 제조 방식이고 그냥 const void* 형식의 array도 고려해본 결과 그냥 count 리턴, array는 참조 리턴을 하도록 정의했다.



// file
#include <malloc.h>

struct {
	Node* list;
	void** array;
	char* message;
	int size;
	int count;
} list_to_array_function_struct = {
		.message = "none",
};

#define self list_to_array_function_struct
#define call list_to_array_function_function

void list_to_array_function_function() {
	if (!self.list) {
		if (self.count != 0) {
			self.array = calloc(self.count, sizeof(void*));
			if (!self.array) self.message = "error_malloc", self.count = -1;
			self.size = self.count;
		}
		return;
	}
	const void* d = self.list->d;
	self.list = self.list->n;
	self.count++;
	call();
	if (self.count <= 0) return;
	self.array[--self.count] = d;
}

int list_to_array_function(void* list, void*** array, char** error_message) {
	self.list = (Node*)list;
	call();
	if(error_message) *error_message = self.message;
	self.message = "none";
	*array = self.array;
	return self.size;
}

#undef call
#undef self



void function() 형태로 주 함수를 구성하고 전역 변수를 이용하는 방식으로 만들었다. 이유는 C언어에서 함수는 인수까지 스텍을 쌓는 비효율적인 구조이기에, 본인은 스텍을 쌓을때 data만 쌓게 하고 싶었기 때문이다.

전역은 struct로, 따로 힙을 참조하는 포인터 형식이라면 한두번 쓸 함수의 목적에는 맞겠지만, 힙 영역의 에러처리가 귀찮아서 스텍 영역을 쓴다는 것을 고려해서 그냥 전역에 박았다.


꽤 간단한 구조다. 특히 cpp의 class 구조에서 더 적합한 구조인 것 같다.

// tast main

#include <stdio.h>
#define array_for(T, it, arr) for(T* it = arr.d; it != arr.d + arr.s; it++ )

int main(int argc, char** argv) {
	Node head_data = { "_", NULL };
	Node* head = &head_data;
	Node* focus = head;
	char* string = "hello world\n";
	while (*string) {
		focus->n = malloc(sizeof(Node));
		focus = focus->n;
		if (!focus) {
			perror("error");
			return -1;
		}
		focus->d = string;
		focus->n = NULL;
		string++;
	}
	struct {
		void** d;
		size_t s;
	} array = {0};

	array.s = list_to_array_function(head, &array.d, NULL);
	array_for(void*, it, array) {
		printf("%c", *(char*)*it);
	}
	free(array.d);

	return 0;
}


만들었으니 테스트 해봤다.


그리고 느꼈다. list 어떻게 만들더라?

대가리가 깨진채 만들어서 그런가


1


대충 작동하니 좋았스

이전 것들은 전부 폰이라서 여기에 올린 것 중에 기념비적이고 유일무이하며 아마도 처음이자 마지막인 컴퓨터로 작업한 코드일듯

1
0 comments
바이브 코딩이 개발능력 형성에 끼치는 영향
일반
kimtaychon98
06/30 1576 2
백준 대체싸이트 추천좀
일반
hyeon111
05/23 1737 0
바이브코딩
일반
라면올킬
05/02 1628 0
개발중인 사이트 있는데
일반
hassan94
04/24 1553 1
7JWM652865SYIOuzte2YuO2ZlA==
PY
wef4r2
04/21 1714 2
너무나도 조용한 서브...
일반
이오치 마리
03/27 1560 0
여기 좀 살려보면 안되나?
일반
frzdk
02/15 1571 0
코딩 초보인데 이거 정상이지?
일반
qqbbs
02/15 1700 1
아카 크롤링하려면 얼마나 배워야해?
일반
kang33
12/29/25 1767 0
타입 스크립트는 적응이 안되네
JS
ㅇㅇ
12/17/25 1386 0
이사올랬는디 정전이네
일반
gunsight
12/06/25 5625 0
LLM이 정말로 위험한건 이거임
일반
Rohthis_
12/05/25 2441 1
동적 변수 import 질문
PY
보성녹차드링커
11/29/25 1475 1
AI만능론의 진짜 위험성
일반
nananatsume2
11/27/25 1976 1
야매 C강의 2. 변수와 연산자
C/C++
side-effect
11/03/25 1886 9
야매 C강의 1. 입출력
C/C++
side-effect
11/02/25 1858 10
lua 배워보려는데 괜찮으려나
일반
r1-ze
10/10/25 2533 0
오랫만에 왔는데 섭 죽었네...
일반
Ghost
09/17/25 2511 3
공항 예고 사건 진실
일반
Ghost
08/21/25 10061 2
뮬바드 브라우저 코네 이미지 깨짐 해결 방법
일반
Ghost
08/18/25 2182 0
zig 쓰는 사람?
일반
Ghost #0196f1ee
08/06/25 1824 0
파이썬이랑 GDScript 문법 어느정도로 비슷함?
기타언어
asdasdvwefcd
07/28/25 1684 1
내년을 위해서 국비를 듣는데
일반
sjaifo87498
07/27/25 2528 2
코딩 처음 시작하려는데
일반
yaisibal1234
07/26/25 2324 0
유니티 Singleton 1편
C#
신군
07/08/25 3220 2
파이썬 배우다가 삼천포로 빠지는 느낌
일반
shashasha
07/02/25 2430 0
서버의 디스크 공간을 사용하지 않는 신개?념 이미지 공유 api
PY
fastapi
06/17/25 3226 -1
사칙연산이 없는 세계, 간단한 수식 연산기 ( 주의 )
C/C++
comi-soft
06/14/25 3562 2
c#은 배우기 쉬운편임?
C#
asdasdvwefcd
06/14/25 3178 0
2000년대를 기점으로 나뉘는것
📰
comi-soft
06/13/25 2977 1