我想把一個詞和一個數字連接成一個識別符號,就像使用##前處理器運算子一樣,并使用它來索引一個陣列。然而,這必須在運行時發生。理想的情況是,像這樣:
#include <stdio.h>
#define RUNTIME_CONCAT(a,b) //Insert concatenating operation here
int main(){
int foo1[2][1] = {{2}, {5}。
int foo2[2][1] = {{6}, {9}。
/*
通過某種方式獲得這里的數字a
*/
int* print_val = RUNTIME_CONCAT(foo, a)[1] 。
printf("Value: %d
", *print_val)。)
return 0;
}
這可能嗎?
uj5u.com熱心網友回復:
如果你想使用宏指令:
typedef int (*arr21)【2】【1】。
#define RT(arr, x) (int *)((arr21 []){&arr ## 1, &arr ## 2}) [x])
typedef只是為了簡單起見--否則復合字面的語法將相當難讀。
#define RT(arr, x) (int *)(((arr21 []){& arr #1, & arr #2}) [x])
int main(void){
int foo1[2][1] = {{2}, {5}。
int foo2[2][1] = {{6}, {9};
volatile int a = 1;
int* print_val = RT(foo, a);
printf("Value: %d
", *print_val)。)
return 0;
}
https://godbolt.org/z/rjWMrzda9
uj5u.com熱心網友回復:
我提出了一個有點丑陋的代碼,但我認為它是你要找的。代碼后的評論。
/* so.c
*/
#include <stdio.h>/span>
#include <string.h>
int foo1[2][1] = {{2}, {5}。
int foo2[2][3] = {{6, 3, 1}, {9, 7, 5}。
struct array_t {
char *name。
void *ptr;
/* int foo[m][n] */
size_t m, n;
};
struct array_t array[] = {
#define __set(v) {# v, v,
sizeof(v) / sizeof(v[0])。
sizeof(v[0]) / sizeof(v[0][0])}
__set(foo1),
__set(foo2),
#undef __set
};
void *getarray(char *base, int idx)。
{
char name[100] 。
snprintf(name, 100, "%s%d"/span>, base, idx);
for(int i = 0; i < sizeof(array)/sizeof(struct array_t) ; i )
if(!strcmp(array[i].name,name)
return &array[i] 。
return NULL。
}
int val(struct array_t *array, int m, int n)。
{
int *p = array-> ptr;
return p[m * array->n n] 。
}
void print_array(struct array_t *array)
{
printf("Array: %s[%zu][%zu]
", array->name, array->m, array->n)。)
for(int m = 0; m < array-> m; m )
for(int n = 0; n < array-> n; n )
printf("%s[%d][%d] = %d
"。
array->name, m, n, val(array, m, n))。)
printf("
")。)
}
int main(void)。
{
struct array_t *p1, *p2; /span>
p1 = getarray("foo", 1) 。
p2 = getarray("foo", 2) 。
print_array(p1);
print_array(p2);
printf("foo2[1][2] : %d
", val(p2, 1, 2)。
return 0。
我定義了兩個不同大小的陣列,以嘗試做一些更通用的東西。
我們定義了一個名為
array_t的結構體,它持有關于我們陣列的資訊。我們用陣列初始化我們的結構。這是預處理的第一部分。
我們用陣列初始化我們的結構。
__set(v)依賴于靜態陣列來運行(即它不會與malloc陣列一起作業)。# v將變數的名稱轉換為一個字串。下一個有趣的部分是
sizeof(v) / sizeof(v[0]),它通過將陣列的總大小除以行大小來計算陣列的m尺寸。sizeof(v[0])/sizeof(v[0][0])將總行大小除以型別大小。getarray是查詢發生的地方。你可以得到一個名字和一個索引,然后snprintf將為你創建一個字串并在我們的全域表array中回圈起來。val是一個封裝器,它可以為您提供一個二維陣列中給定索引的元素。print_array...好吧,列印出陣列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/332264.html
標籤:
下一篇:如何將char陣列轉換為int?
