代码之家  ›  专栏  ›  技术社区  ›  Illarion Kovalchuk

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

c
  •  2
  • Illarion Kovalchuk  · 技术社区  · 14 年前

    考虑以下功能:

    int get_something (int* array, int size);
    

    它的目的是用来自外部资源的数据填充传递的数组[大小](queryes到resource是昂贵的)。问题是,如果资源的元素比提供的数组所能处理的要多,该怎么办?最好的方法是什么?

    我们目前的做法如下:

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

    如果用户不调用get\u something(),则会发生超时并释放该项的缓存。

    7 回复  |  直到 14 年前
        1
  •  2
  •   jdu.sg    14 年前

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

    问题2是如何设计一个允许客户机/用户代码与数据交互的api。

    型号#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缓冲区中返回整个对象,并让客户机管理整个过程

    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\u something()将必须构建一个缓存,客户端仍然需要迭代。

        2
  •  5
  •   Mark Byers    14 年前

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

        3
  •  2
  •   Andrei Ciobanu    14 年前

    使用 realloc . Reference link

        4
  •  2
  •   JeremyP    14 年前

    我的选择将是使用与 fread() 并将接口转换为各种流。

    • 要么填满缓冲区,要么将所有项放入其中,然后返回实际读取的项数
    • 保持某种状态,以便后续调用只获取未读项目
    • 读取所有项目后返回0
        5
  •  1
  •   binW    14 年前

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

        6
  •  0
  •   Aidanc    14 年前

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

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

        7
  •  0
  •   Bobby    14 年前

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

    - 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