考虑以下功能:
int get_something (int* array, int size);
它的目的是用来自外部资源的数据填充传递的数组[size](查询到资源是昂贵的)。问题是该做什么,如果资源有更多的元素,比提供的数组可以处理?什么是最好的方法?
编辑:添加当前解决方案:
目前我们的方法如下:
当用户第一次调用get_something()时,使用null参数我们执行完整的Query,在缓存中分配数据(这只是一个键值存储)并返回许多项。
当用户下次调用get_something()时,使用正确初始化的缓冲区,我们从缓存返回数据并清除缓存条目。
如果用户没有调用get_something(),则会发生超时,并释放该项的缓存。
如果用户调用get_something()太晚,并且数据已被清除,我们会生成错误状态,因此用户知道他必须重复请求。
答案 0 :(得分:5)
一种选择是根本不修改数组,而是返回所需的大小作为返回结果。然后,调用者必须使用至少为此大小的数组再次调用您的函数。
答案 1 :(得分:2)
使用realloc
。
Reference link。
答案 2 :(得分:2)
我的选择是使用与fread()相同的模型,并将界面转换为各种类型的流。
即。
答案 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)
您可以检查一下资源有多少元素?如果是这样,我会这样做,然后将数组复制到与资源一样大的数组。
或者当你到达终点时,可能会将数组复制到数组的两倍?
答案 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