考虑编写用于处理任意度多项式的简单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在规定的要求范围内?
答案 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 _