在自定义结构中管理可动态分配的数组
Managing dynamically allocatable arrays inside a custom structure
我想定义一个自定义结构,其中包含两个可动态分配的整数数组 a
和 b
。为了为数组分配内存并用值初始化数组,我编写了一个 "constructor" 函数 initp
。我的方法如下所示。
名为 pair
的自定义结构:
typedef struct {
...
int l; // length of compositions
int k; // no. of elements in compositions
int *a; // composition 1
int *b; // composition 2
} pair;
初始化自定义结构的函数:
int initp(..., int l, int k, int a[], int b[], pair *f) {
...
f->l = l;
f->k = k;
// allocate composition arrays
f->a = (int *) calloc(l, sizeof(int));
f->b = (int *) calloc(l, sizeof(int));
// initialise composition arrays
for (int i = 0; i < k; i++) {
f->a[i] = a[i];
f->b[i] = b[i];
}
}
主程序中的一个函数调用:
// initialise pairs
pair f1, f2;
initp(..., 10, 2, (int[]){3, 4}, (int[]){7, 6}, &f1);
initp(..., 10, 1, (int[]){4}, (int[]){9}, &f2);
我的任务是编写 "elegant" 代码。因此,我的问题是:
- 是否可以避免指定编号。数组
a
和 b
中的元素传递给 initp
?这是参数k
。在上面的示例中,它是 2 和 1。
- 是否可以避免在函数调用中使用
(int[])
进行 "explicit" 转换?
- 如果您对提高代码质量有一般性的意见和批评,请告诉我。
Is it possible to avoid specifying the no. of elements in arrays a
and b
passed to the initp
?
没有
备选方案:创建宏 INITP(l, a, b, f)
并使用宏魔法确定 a
、b
是真正的数组,它们的数组元素计数,确保它们的计数相等,然后调用 initp()
.
我不喜欢这种方法,但它是可行的 - 但有局限性。
注意:对于 大小 信息,请考虑 size_t
与 int
。
Is it possible to avoid "explicit" casting with (int[]) in the function call?
对于 (int[]){3, 4}
,(int[])
不是强制转换。它只是复合文字的形式,需要形成一个。
if you have general comments and criticism on improving the quality of the code.
对于工作代码,请考虑 Code review 进行更深入的审查。
我会依次分配每个数组 - 通常与隔行扫描一样快或更快。
memcpy(f->a, a, sizeof f->a[0] * k);
memcpy(f->b, b, sizeof f->b[0] * k);
处理分配失败。
创建 initp()
随播广告 void uninitp(pair *f)
。
改进分配以实现清晰、审查和维护。
// f->a = (int *) calloc(l, sizeof(int));
f->a = calloc(l, sizeof f->a[0]);
const
,restrict
注意事项。
嗯,这里的评论太满了,现在就结束吧。
我想定义一个自定义结构,其中包含两个可动态分配的整数数组 a
和 b
。为了为数组分配内存并用值初始化数组,我编写了一个 "constructor" 函数 initp
。我的方法如下所示。
名为 pair
的自定义结构:
typedef struct {
...
int l; // length of compositions
int k; // no. of elements in compositions
int *a; // composition 1
int *b; // composition 2
} pair;
初始化自定义结构的函数:
int initp(..., int l, int k, int a[], int b[], pair *f) {
...
f->l = l;
f->k = k;
// allocate composition arrays
f->a = (int *) calloc(l, sizeof(int));
f->b = (int *) calloc(l, sizeof(int));
// initialise composition arrays
for (int i = 0; i < k; i++) {
f->a[i] = a[i];
f->b[i] = b[i];
}
}
主程序中的一个函数调用:
// initialise pairs
pair f1, f2;
initp(..., 10, 2, (int[]){3, 4}, (int[]){7, 6}, &f1);
initp(..., 10, 1, (int[]){4}, (int[]){9}, &f2);
我的任务是编写 "elegant" 代码。因此,我的问题是:
- 是否可以避免指定编号。数组
a
和b
中的元素传递给initp
?这是参数k
。在上面的示例中,它是 2 和 1。 - 是否可以避免在函数调用中使用
(int[])
进行 "explicit" 转换? - 如果您对提高代码质量有一般性的意见和批评,请告诉我。
Is it possible to avoid specifying the no. of elements in arrays
a
andb
passed to theinitp
?
没有
备选方案:创建宏 INITP(l, a, b, f)
并使用宏魔法确定 a
、b
是真正的数组,它们的数组元素计数,确保它们的计数相等,然后调用 initp()
.
我不喜欢这种方法,但它是可行的 - 但有局限性。
注意:对于 大小 信息,请考虑 size_t
与 int
。
Is it possible to avoid "explicit" casting with (int[]) in the function call?
对于 (int[]){3, 4}
,(int[])
不是强制转换。它只是复合文字的形式,需要形成一个。
if you have general comments and criticism on improving the quality of the code.
对于工作代码,请考虑 Code review 进行更深入的审查。
我会依次分配每个数组 - 通常与隔行扫描一样快或更快。
memcpy(f->a, a, sizeof f->a[0] * k); memcpy(f->b, b, sizeof f->b[0] * k);
处理分配失败。
创建
initp()
随播广告void uninitp(pair *f)
。改进分配以实现清晰、审查和维护。
// f->a = (int *) calloc(l, sizeof(int)); f->a = calloc(l, sizeof f->a[0]);
const
,restrict
注意事项。
嗯,这里的评论太满了,现在就结束吧。