我有一个需要传递大量变量的C函数,所以我想到了#34; packing"它们都在一个数组中(变量矩阵)。关键是,这些变量的类型非常不同,有些是int,有些是数组(字符串和向量),而且很多都是浮点数。有没有办法让未指定存储在矩阵中的数据类型? (我没有成功地探讨了空白"数据类型")
答案 0 :(得分:8)
数组的元素总是单一类型,这就是重点。
收集多种类型的变量是结构的工作,即struct
。
这是解决此特定问题的常用方法。如果结构变大,您可能会发现将指针传递给它的实例很方便,而不是复制调用中的整个内容。
答案 1 :(得分:0)
你可以使用va_list但是struct是最好的方法
答案 2 :(得分:0)
#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
enum type {
INT,
FLOAT,
PCHAR,
};
struct any_type {
enum type type_;
union {
int int_;
float float_;
char* pchar_;
};
};
#define MYSIZE 10
void process(size_t size, struct any_type* array)
{
for(int i = 0; i < size; i++) {
switch(array[i].type_) {
case INT :
printf("INT: %d\n", array[i].int_);
break;
case FLOAT :
printf("FLOAT: %f\n", array[i].float_);
break;
case PCHAR :
printf("PCHAR: %s\n", array[i].pchar_);
break;
default:
printf("UNKNOWN TYPE PROVIDED\n");
break;
}
}
}
int main(int argc, char *argv[])
{
struct any_type *array;
array = malloc(MYSIZE*(sizeof(struct any_type)));
array[0].type_ = INT;
array[0].int_ = 10;
array[1].type_ = FLOAT;
array[1].float_ = 2.5;
array[2].type_ = PCHAR;
array[2].pchar_ = "hello char";
process(3, array);
return 0;
}
您可以根据需要扩展类型和联合。但是,使用无名联合需要-std = c11。
答案 3 :(得分:0)
扩展我的评论:
需要将大量参数 1 传递给函数可以表示您的设计存在问题 - 您的功能可能也在尝试很多事情一下子,你最好把它重构成几个较小的函数,每个函数只占用一部分参数。
假设情况并非如此,您的参数在逻辑上如何相互关联?它们可以被视为单个数据项的属性吗?例如,可以通过以下属性来描述人:姓,姓名,出生日期,性别。这些可以一起收集到单个struct
类型中,例如
#include <time.h>
struct person {
char *surname;
char *name;
struct tm birthdate; // struct tm defined in time.h
char sex;
};
void write_to( struct person *p )
{
p->surname = strdup( "McGillicuddy" );
p->name = strdup( "Aloysius" );
p->sex = 'M';
p->birthdate.tm_year = 32; // tm_year starts at 1900, so this is 1932
p->birthdate.tm_mon = 11; // december
p->birthdate.tm_day = 1;
};
int main( void )
{
struct person p;
...
write_to( &p );
...
}
请注意,struct
类型的成员本身可以是struct
类型 - struct tm
是time.h
中定义的类型,它使用多个属性指定日期时间值。
关于语法的一些注释:
如果要访问struct
实例的成员,请使用.
运算符。如果要通过指针访问struct
的成员,请使用->
运算符。在函数write_to
中,p
是指向struct person
的指针,因此要访问p
的每个成员,我们使用->
。 birthdate
成员是struct tm
的实例,而不是指针,因此我们使用.
运算符来访问birthdate
的每个成员。
p->m
相当于(*p).m
。
就像我在评论中所说,你应不将其他不相关的项目收集到struct
类型 中,以减少传递给a的参数数量功能。它们都应该是更复杂类型的属性。我的意思的其他一些例子:
// A node in a list
struct node {
data_t data; // for some data type data_t;
struct node *next;
struct node *prev;
};
// A street address
struct addr {
char *number; // to handle things like 102A, 102B
char *street;
char *city;
char state[3];
char *zip;
};
您可能真的只将几个不同的数据项传递给您的函数,每个数据项都由许多不同的属性组成。退一步看看你的变量,看看它们是如何相互关联的。
<小时/>