我在C中摸索指针,并创建了一个Pac-Man Inky指针示例。
int
********
****************
****************
********************
********************
******* * ** * *******
******* ** *******
******* ** *******
************************
****************************
****************************
****************************
****************************
****************************
****************************
**** ****** ****** ****
**** ****** ****** ****
** **** **** **
** **** **** **
inky;问题
是否有一种以编程方式确定Inky指针链长度(当前为386)的方法?
发布于 2022-04-09 19:36:22
我认为没有办法对一个完全任意的*数这样做,但是如果您有一个固定的最大值,您可以编写一个长的选择来完成它。
#define COUNT_STARS(p) \
_Generic(p, \
int : 0, \
int * : 1, \
int ** : 2, \
/* etc.... */ \
)您只需使用O(log2(n))行源代码,就可以使用预处理技巧生成这样的宏:
#include <stdio.h>
#define PTR0 *
#define PTR1 PTR0 PTR0
#define PTR2 PTR1 PTR1
#define PTR3 PTR2 PTR2
#define PTR4 PTR3 PTR3
#define PTR5 PTR4 PTR4
#define PTR6 PTR5 PTR5
#define PTR7 PTR6 PTR6
#define PTR8 PTR7 PTR7
#define GEN0(T, stars, n) T stars : (n)
#define GEN1(T, stars, n) GEN0(T, stars, (n)) , GEN0(T, stars PTR0 , (n)+(1 << 0))
#define GEN2(T, stars, n) GEN1(T, stars, (n)) , GEN1(T, stars PTR1 , (n)+(1 << 1))
#define GEN3(T, stars, n) GEN2(T, stars, (n)) , GEN2(T, stars PTR2 , (n)+(1 << 2))
#define GEN4(T, stars, n) GEN3(T, stars, (n)) , GEN3(T, stars PTR3 , (n)+(1 << 3))
#define GEN5(T, stars, n) GEN4(T, stars, (n)) , GEN4(T, stars PTR4 , (n)+(1 << 4))
#define GEN6(T, stars, n) GEN5(T, stars, (n)) , GEN5(T, stars PTR5 , (n)+(1 << 5))
#define GEN7(T, stars, n) GEN6(T, stars, (n)) , GEN6(T, stars PTR6 , (n)+(1 << 6))
#define GEN8(T, stars, n) GEN7(T, stars, (n)) , GEN7(T, stars PTR7 , (n)+(1 << 7))
#define GEN9(T, stars, n) GEN8(T, stars, (n)) , GEN8(T, stars PTR8 , (n)+(1 << 8))
#define COUNT_STARS(T, expr) _Generic(expr, GEN9(T, , 0))
int
********
****************
****************
********************
********************
******* * ** * *******
******* ** *******
******* ** *******
************************
****************************
****************************
****************************
****************************
****************************
****************************
**** ****** ****** ****
**** ****** ****** ****
** **** **** **
** **** **** **
inky;
int main(void) {
printf("%d\n", COUNT_STARS(int, inky));
return 0;
}这个版本可以处理多达511个*,您可以很容易地将它扩展到更多,但是编译时间开始变得过长。
https://stackoverflow.com/questions/71809216
复制相似问题