Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大数组在多个C模块之间的传递_C_Arrays - Fatal编程技术网

大数组在多个C模块之间的传递

大数组在多个C模块之间的传递,c,arrays,C,Arrays,我在表c中定义了几个相当大的数组,每个数组大约有1500个成员。我需要将它们传递到不同的模块和/或提供一种方法来更新它们 我的问题是如何使它最有效,而不是浪费内存。我的想法是做标准的接受者/接受者。因此,如果为了get,我将有一个公共功能: void getTable(tableID, *table) struct blah { ... T humongous[50000]; ... } bletch; foo( bletch ); void foo( struct blah

我在表c中定义了几个相当大的数组,每个数组大约有1500个成员。我需要将它们传递到不同的模块和/或提供一种方法来更新它们

我的问题是如何使它最有效,而不是浪费内存。我的想法是做标准的接受者/接受者。因此,如果为了get,我将有一个公共功能:

void getTable(tableID, *table)
struct blah {
  ...
  T humongous[50000];
  ...
} bletch;

foo( bletch );

void foo( struct blah b ) { ... } // b is a full copy of bletch
tableID将是枚举定义我想要的开关表,*表将是指向表的指针。我猜只传递了一个引用,所以表不会在内存中重复

然后在otherModule.c中,我将调用jsut

table *myPointer;
getTable(TableA, myPointerTable).
对吗

我在表c中定义了几个相当大的数组,每个数组大约有1500个成员

在目前拥有千兆字节RAM的笔记本电脑上,一个由十几个数千个数字组成的阵列不是一个大阵列,而是一个很小的阵列。今天,一个大型阵列至少有数百万个机器编号,您最好使用它

当然,如果数组中的每个元素都是一些复杂而繁重的数据结构(比如一些),那么情况就不同了

您可以只传递一个指向数组的指针,或者传递一个以

顺便说一句,当作为参数传递时,数组通常会被分解成指针,从而使该地址在某些情况下快速传递。大概是

extern double bigarray[123456];
foo(bigarray);
T humongous[50000]; // for some arbitrary type T
不要复制数组,而只传递其地址

我的想法是做标准的接受者/接受者

这可能很好,而且可能更具可读性


顺便说一句,您可以将这些getter和setter函数定义为公共头文件中的一些静态内联函数,以便适当地包括在内。这将使您的代码可读性强且速度快。

在大多数情况下,数组表达式会衰减为指针,因此如果您定义如下内容

extern double bigarray[123456];
foo(bigarray);
T humongous[50000]; // for some arbitrary type T
并将其传递给如下函数

foo( humongous );
foo接收的只是指向第一个元素的指针,而不是整个数组:

void foo( T *arr ) { ... }
注意,在函数参数声明的上下文中,T a[N]和T a[]被视为与T*a相同-它们都将a声明为指向T的指针。基本上,不能通过值将数组传递给C中的函数

现在,如果数组是结构或联合类型的成员,并且将该类型的表达式传递给函数,则将在函数中创建整个数组的副本:

void getTable(tableID, *table)
struct blah {
  ...
  T humongous[50000];
  ...
} bletch;

foo( bletch );

void foo( struct blah b ) { ... } // b is a full copy of bletch
因此,在这种情况下,您可能希望传递一个指向bletch的指针:


setter/getter对于较小的程序可能是一个不错的主意,尽管您可能希望格式如下

table_t* getTable (tableID)
然而,这不是OO意义上的纯getter函数,因为您通过指针公开私有数据。此外,这种方法可能会造成重新进入的问题。对于需要长期维护的大型专业项目,这是不行的

最好的解决方案是将分配留给调用者。您可以通过使用不透明指针间接执行此操作:

表h

typedef struct table_t table_t; // forward declaration

table_t* table_init (size_t size, /* stuff */);

void table_free (table_t* table);
表c:

#include "table.h"

struct table_t // this will be unknown to the caller
{ 
  // private, encapsulated data:
  size_t size;
  int data[]; // flexible array member
};

table_t* table_init (size_t size, /* stuff */)
{
  table_t* result = malloc(sizeof(*result) + int[size]);
  if(result == NULL) { /* handle errors */ }

  result->size = size;
  do_something(result->data);

  return result;
}

void table_free (table_t* table)
{
  free(table);
  /* optionally, make the parameter table_t** and set the pointer 
     to NULL after calling free() */
}
c:

#include "table.h"

table_t* table = table_init(n, /* stuff */);

table_do_stuff(table); // either setter/getter or actual algorithm

table_free(table);

这提供了一个适当的设计并允许多个实例,这也解决了重入问题。

访问器函数是一个选项,但它们不是必需的。您可以直接引用全局对象。例如,int x[10]={…};在一个单位和外部int x[10];在另一个引用x的单元中,由于数组在函数调用中衰减为指针,所以您不必担心任何意外的拷贝,因为只有指针会在函数调用中被复制。请您提供一个示例,说明您是如何定义这些数组的,以及您打算如何使用它们?@PSkocik,这导致了意大利式编程和紧密耦合。非常糟糕的主意。如果对我来说是这样的话:将C数组保存在一个文件中,作为二进制数据,每个函数都希望这些数组从文件中打开拷贝到C数组。但是,谁说OP正在进行PC编程呢?我想如果不是这样的话,OP会明确告诉我们嵌入式编程,或者关于超级计算机上的HPC小调:table.h需要一个包含大小的元素。也许吧?@chux是的,这是一种伪代码。收割台还需要收割台防护装置等。