将变量数组传递给C中的函数

时间:2017-09-05 10:18:01

标签: c arrays function

我有一个需要传递大量变量的C函数,所以我想到了#34; packing"它们都在一个数组中(变量矩阵)。关键是,这些变量的类型非常不同,有些是int,有些是数组(字符串和向量),而且很多都是浮点数。有没有办法让未指定存储在矩阵中的数据类型? (我没有成功地探讨了空白"数据类型")

4 个答案:

答案 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 tmtime.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;
};

您可能真的只将几个不同的数据项传递给您的函数,每个数据项都由许多不同的属性组成。退一步看看你的变量,看看它们是如何相互关联的。

<小时/>

  1. &#34;大&#34;取决于上下文,当然任何规则总是有例外,但总的来说,传递超过7个不同的,不相关的参数是一个标志,你可能需要将你的函数重构为几个较小的函数。