如果调用者不知道大小,如何在不分配数组的情况下返回数组?

时间:2010-08-05 10:45:21

标签: c

考虑以下功能:

int get_something (int* array, int size);

它的目的是用来自外部资源的数据填充传递的数组[size](查询到资源是昂贵的)。问题是该做什么,如果资源有更多的元素,比提供的数组可以处理?什么是最好的方法?

编辑:添加当前解决方案:

目前我们的方法如下:

当用户第一次调用get_something()时,使用null参数我们执行完整的Query,在缓存中分配数据(这只是一个键值存储)并返回许多项。

当用户下次调用get_something()时,使用正确初始化的缓冲区,我们从缓存返回数据并清除缓存条目。

如果用户没有调用get_something(),则会发生超时,并释放该项的缓存。

如果用户调用get_something()太晚,并且数据已被清除,我们会生成错误状态,因此用户知道他必须重复请求。

7 个答案:

答案 0 :(得分:5)

一种选择是根本不修改数组,而是返回所需的大小作为返回结果。然后,调用者必须使用至少为此大小的数组再次调用您的函数。

答案 1 :(得分:2)

使用reallocReference link

答案 2 :(得分:2)

我的选择是使用与fread()相同的模型,并将界面转换为各种类型的流。

即。

  • 填充缓冲区或将所有项目放入其中并返回实际读取的项目数
  • 维持某种状态,以便后续调用只能获取未读项目
  • 读完所有项目后返回0
  • 如果发生错误,
  • 返回负数。

答案 3 :(得分:2)

好的,您的基本要求是查询资源,并将返回的数据缓存在内存中,以避免多次访问。

这意味着你必须在程序中分配内存来存储所有数据。

问题#1是填充该缓存。我会假设你有这个想法,并且有一些函数get_resource();

问题#2是如何设计api以允许客户端/用户代码与该数据交互。

在您的示例中,您使用客户端分配的数组作为缓存,希望解决1缓冲区的问题,但这并不能解决所有情况下的问题(因此您的发布)。所以你真的需要分开这两个问题。

型号#1是提供迭代器/光标功能

iterator = get_something();  // Triggers caching of data from Resource
data = get_next_single_something( iterator );
status = release_something( iterator );

// The logic to release the data could be done automagically in get_next, 
// after returning the last single_something, if that is always the use case.

模型#2是在malloced缓冲区中返回Whole对象,让客户端管理整个事物

data_type *pData=NULL;
unsigned size = get_something( &pData ); // Triggers caching of data from Resource
process( size, pData );
free( pData );
pData=NULL;

模型#3。如果您已与客户端阵列结合,则可以使用Model#1一次返回多个值, 如果有更多值,则get_something()必须构建一个缓存,客户端仍然需要迭代。

答案 4 :(得分:1)

动态分配数组,即使用malloc(),然后在函数中使用realloc()或释放前一个列表并分配另一个,填充它并返回新的大小。对于第二种方法,您可以使用返回值来返回新大小,但是要更新数组的调用者地址,您需要将函数更改为接受int **而不是int *

答案 5 :(得分:0)

您可以检查一下资源有多少元素?如果是这样,我会这样做,然后将数组复制到与资源一样大的数组。

或者当你到达终点时,可能会将数组复制到数组的两倍?

http://www.devx.com/tips/Tip/13291

答案 6 :(得分:0)

这取决于你的程序应该如何处理这种情况,我想。

一种方法可以是将数组填充到最大值,并返回个可用元素的数量。这样调用者可以检查他是否需要再次调用该函数(参见Mark Byers的回答)。

背后的逻辑:

- Creates array with 100 items
- Calls your function and gets 150 returned
- Increases the array size or creates a second one
  and calls your function again with that array
- Repeats that unless the returned item count is
  equal or less the array size