通常使用编译时已知的可变大小数据。

时间:2015-08-20 19:49:33

标签: c

考虑编写用于处理任意度多项式的简单API的要求。 一个简单的例子如下:

#define POLYNOM_MAX_ORDER   10

typedef struct polynom_struct
{
    int order;
    float coeffs[POLYNOM_MAX_ORDER];
} polynom_t;

// Polynomial initialization 
// p - a pointer to polynomial instance
// order - the degree of the polynomial
// coeffs - array of the polynomial coefficients of length order+1
void polynom_init(polynom_t* p, int order, float coeffs[])
{
    int i;
    p -> order = order;
    for(i=0; i <= p->order; i++)
    {
        p->coeffs[i] = coeffs[i];
    }
}

// Polynomial value calculation at point "x"
float polynom_calc_point(polynom_t* p, float x)
{
    int i;
    float result =  p->coeffs[0];

    for(i=1; i <= p->order; i++)
    {
        result += x * p->coeffs[i];
        x *= x;
    }
    return result;
}

现在考虑资源受限的嵌入式系统需要类似的API,即添加了两个要求:不应分配额外的未使用的内存,无动态内存分配允许(在堆上,可以考虑一些基于堆栈的分配)。显然,上面的代码违反了第一个要求,因为coeffs字段正在分配最大值而不管它是否被使用。第二个要求是阻止我们动态分配所需的内存。

同样很清楚,如果在编译时不知道多项式阶数,则无法解决这个问题。但如果是这样呢?如果我们知道我们将使用订单N{O_1, O_2, .., O_N}多项式进行硬编码,我们怎样才能代表与上面类似(或可能不同?)的通用API在规定的要求范围内?

3 个答案:

答案 0 :(得分:1)

我不确定这是否可以回答您的问题,但您可以尝试使用灵活数组成员(自C99起),其中最后一个成员(此处coeffs)可以具有不同的大小对于每个对象。

#include <stdio.h>

typedef struct polynom_struct
{
    int order;
    float coeffs[];
} polynom_t;

polynom_t a = { 1, { 1.0f } };
polynom_t b = { 2, { 1.0f, 2.0f, 3.0f } };

int main(void)
{
    printf("%f\n", a.coeffs[0]);
    printf("%f\n", b.coeffs[2]);

    return 0;
}

灵活阵列成员静态启动的能力是GCC extension

  

GCC允许灵活数组成员的静态初始化。这是   相当于定义包含原始的新结构   结构后跟一个足够大小的数组来包含数据。

答案 1 :(得分:1)

@Grzegorz Szpetkowski是一个很好的答案。我想我可以尝试一些可以满足静态分配的东西。欲望。

主要思想是假设少量不同的数组大小,并为每个数组创建一个typedef&#d; d结构。 function hiddenlinks() { var urllink = $(".hidden-small").map(function() { return $(this).attr("href"); }).get().reverse(); console.log(urllink); var spantext = $(".hidden-small span").map(function() { return $(this).text(); }).get(); for ( var i = 0; i < urllink.length; i++ ) { for ( var i = 0; i < spantext.length; i++ ) { console.log(urllink[i]) var urlencode = urllink[i]; console.log(urlencode); var finlink = '<li><a href"'+urlencode+'">'+spantext[i]+'</a></li>' $( finlink ).prependTo( ".paradeiser_children" ); } } } 代表2个元素,array2_T代表3个元素,等等。

结构使用array3_T进行初始化,并以array_init(void *anon, size_t anon_size)参数作弊。以后的代码只使用返回的指针。

void *

答案 2 :(得分:1)

如果你知道多项式及其次序,为什么不只是静态地分配一个具有所有系数总大小的数组,并在struct polynom_struct中存储一个指向该多项式系数起点的指针。您只需要一个静态变量来记住自由系数在数组中的起始位置。

from django.utils.translation import ugettext as _