【问题标题】:Double dimension tab count二维标签计数
【发布时间】:2011-05-28 11:50:35
【问题描述】:

我忘记了如何计算一个双维 C 数组,因为我不明白为什么这段代码返回的计数是 12 而不是 6。

// My tab
static NSString *kStringTag[][2] = {
    {@"string1", @"1"},
    {@"string2", @"1"},
    {@"string3", @"0"},
    {@"string4", @"0"},
    {@"string5", @"1"},
    {@"string6", @"1"},
    {nil, nil}
};

// My C func
unsigned int tablen(void **tab)
{
    unsigned int i = 0;

    while (tab[i] != nil)
        i++;

    return i;
}

 - (void)viewDidLoad
{
    NSLog(@"%d", tablen((void **)kStringTab));
}

【问题讨论】:

  • 请注意,静态对象名称是kStringTag(带有g)和tablen的参数kStringTab(带有b)。
  • 有什么理由不使用 NSArray?
  • 不,但我只是想了解为什么它不能像我想要的那样工作

标签: ios objective-c iphone


【解决方案1】:

您的代码不是 C。

如果是 C,tab 将是一个指向 NSStrings 的指针数组(不管是什么)。

在 C 中,指向 NSStrings 的指针数组不一定与指向 void 的指针兼容...因此删除强制转换并获得正确的类型

在 C 中,这是可行的 ...

#include <stdio.h>

static char *kStringTab[][2] = {
    {"string1", "1"},
    {"string2", "1"},
    {"string3", "0"},
    {"string4", "0"},
    {"string5", "1"},
    {"string6", "1"},
    {NULL, NULL},
};

unsigned int tablen(char *tab[][2]) {
  unsigned int i = 0;
  while (tab[i][0] != NULL) i++;
  return i;
}

int main(void) {
  printf("%d\n", tablen(kStringTab));
  return 0;
}

建议:提高编译器的警告级别并注意警告


编辑:新的通用版本

#include <math.h>
#include <stdio.h>

static double anothertest[][3] = {
    {42, 54, -122},
    {33, -0.001, 0.001},
    {6, 0, 7},             /* 0 in middle: stop condition in nullp2 :) */
    {2, 2, 2},
};

static char *kStringTab[][2] = {
    {"string1", "1"},
    {"string2", "1"},
    {"string3", "0"},
    {"string4", "0"},
    {"string5", "1"},
    {"string6", "1"},
    {NULL, NULL},
};

int nullp2(const void *elem) {
  const double *tmp = elem;
  return (fabs(tmp[1]) < 0.000000001);
}

int nullp(const void *elem) {
  char (*const *tmp)[2] = elem; /* tmp is a pointer to each element of kStringTab */
  return ((*tmp)[0] == NULL);
}

unsigned int tablen(void *x, size_t size,
                    int (*check)(const void *)) {
  char *y = x;
  unsigned int i = 0;

  while (!check(y)) {

    i++;
    y += size;
  }
  return i;
}

int main(void) {
  printf("tablen returns %d\n",
        tablen(kStringTab, sizeof *kStringTab, nullp));
  printf("tablen returns %d\n",
        tablen(anothertest, sizeof *anothertest, nullp2));
  return 0;
}

你可以看到running at ideone

【讨论】:

  • 它可以工作,但我正在寻找一个通用函数,但你说得对,我认为 NSString 不兼容
【解决方案2】:
  tab[i]

只是一个内存地址的偏移量,您在该地址存储了 12 个项目。

【讨论】:

  • 返回 i/2;这并不令人满意,但是您的 tablen 函数不知道它正在读取的内容的底层结构,它只是在咀嚼原始内存。如果您为其中一个数组维度创建了 typedef,那么您的表格可以使用 sizeof 进行测量。
  • 一些不错的阅读:herehere
猜你喜欢
  • 2019-03-21
  • 2013-08-25
  • 1970-01-01
  • 2018-05-20
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2017-07-16
相关资源
最近更新 更多