微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将不同大小的数组传递给我的c函数?

我不确定这是否可行但我对这些想法持开放态度.

我有一个c功能.它对由用户定义为输入的数组进行一些计算,并生成两个输出值.我们称之为“myfunction”,它看起来像这样:

void myfunction(double array1[18],double array[9],double array [2],double *output1,double *output2)

我想使这个函数更通用,以便它能够采用不同大小的数组.意思是,我希望此函数用户能够定义其他大小的数组输入.

例如,

void myfunction(double array1[81],double array[27],double array [3],double *output2)

在数学上,“myfunction”能够计算出精确的输出,尽管数组大小.我不想复制“myfunction”,因为用户可以将总共5种不同的数组大小定义为输入.

有任何想法吗?先感谢您

解决方法

您可以传递std :: vector或使用模板:

template <std::size_t N1,std::size_t N2,std::size_t N3> // and so on...
void work_with_arrays(double (&arr1)[N1],double (&arr2)[N2],double (&arr3)[N3]){
    std::cout << "First arr of a size: " << N1 << "\n";
    std::cout << "Second arr of a size: " << N2 << "\n";
    std::cout << "Third arr of a size: " << N3 << "\n";
};

int main() {
    double something[32];
    double fewer[13];
    double maybe_byte[8];

    work_with_arrays(something,fewer,maybe_byte);
}

代码输出

First arr of a size: 32
Second arr of a size: 13
Third arr of a size: 8

说明:

应该知道类型T [](T是任何类型)的参数衰减到T *.如果我们处理一个指向数组的指针,我们就没有关于它的长度的信息,这是非常不幸的,因为固定长度数组的长度在编译时是已知的,并且在我们使用它们的任何地方都可以看到.

人们还应该知道函数模板不是函数.它是用于创建函数的模板.对于上面示例中使用的每个不同的N#集合,将为我们的使用生成一个函数.

腐烂问题的解决方法是什么?

我们应该传递对T []的引用,而不是传递原始的T [].这样,类型不会衰减,并且数组的大小将是已知的.

句法?

人们可能会注意到T(& name)[some_size]至少看起来很奇怪.括号是必需的,因为普通的T& name [size]将被解释为T& name [size],它是一个引用数组,而不是对数组的引用.

结论:

能够检测传递为参数的数组的大小,我们不希望用一两种情况限制自己 – 我们想要全部覆盖它们,所以我们使用模板生成具有N#所需值的函数.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐