2011-05-28 56 views
0

我忘了怎麼算的雙重維度Ç陣列,因爲我不明白爲什麼這個代碼返回我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)); 
} 
+1

請注意,靜態對象名稱是'kStringTag'(帶有g)和tablen'kStringTab'(帶有b)的參數。 – pmg 2011-05-28 12:18:59

+0

任何不使用NSArray的原因? – Till 2011-05-28 12:43:52

+0

不,但我只是想了解爲什麼它不像我想要的那樣工作 – klefevre 2011-05-28 13:52:10

回答

4

您的代碼不是C.

如果它是C,tab將指針數組的數組NSString的(無論是)。

在C中,指向NSString的指針數組不一定與指向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

+0

它的工作原理,但我尋找一個通用的功能,但你的權利,我認爲NSString是不兼容的 – klefevre 2011-05-28 13:51:28

+0

@ kl94:看我的編輯:) – pmg 2011-05-28 16:54:53

0
tab[i] 

是隻是從內存地址的偏移量,並且您有12個項目存儲在該地址。

+0

爲了獲得最佳數量,我該怎麼做? – klefevre 2011-05-28 12:01:51

+0

return i/2;這是不令人滿意的,但是你的tablen函數並不知道它正在閱讀的內容結構,它只是咀嚼原始內存。如果您爲某個數組維度創建了typedef,那麼您的tablen可以使用sizeof進行度量。 – Rayfleck 2011-05-28 12:25:59

+0

一些很好的閱讀:[這裏](http://stackoverflow.com/questions/423554/passing-multi-dimensional-arrays-in-c)和[這裏](http://stackoverflow.com/questions/1527806/多維char-array) – Rayfleck 2011-05-28 12:28:23