首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中找到指针链的长度?

在C中找到指针链的长度?
EN

Stack Overflow用户
提问于 2022-04-09 15:03:50
回答 1查看 72关注 0票数 0

我在C中摸索指针,并创建了一个Pac-Man Inky指针示例

代码语言:javascript
复制
int

          ********
      ****************
      ****************
    ********************
    ********************
  *******  * **  * *******
  *******    **    *******
  *******    **    *******
  ************************
****************************
****************************
****************************
****************************
****************************
****************************
****  ******    ******  ****
****  ******    ******  ****
**      ****    ****      **
**      ****    ****      **

inky;

问题

是否有一种以编程方式确定Inky指针链长度(当前为386)的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-09 19:36:22

我认为没有办法对一个完全任意的*数这样做,但是如果您有一个固定的最大值,您可以编写一个长的选择来完成它。

代码语言:javascript
复制
#define COUNT_STARS(p) \
    _Generic(p,        \
        int : 0,       \
        int * : 1,     \
        int ** : 2,    \
        /* etc.... */  \
    )

您只需使用O(log2(n))行源代码,就可以使用预处理技巧生成这样的宏:

代码语言:javascript
复制
#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个*,您可以很容易地将它扩展到更多,但是编译时间开始变得过长。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71809216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档