【问题标题】:Trouble passing a pointer array to a function将指针数组传递给函数时遇到问题
【发布时间】:2015-01-07 01:57:03
【问题描述】:

在我目前正在处理的一个程序中,我有一个模板函数包含在一个单独的 .h 文件中,它从 .txt 文件中读取五列数据。数据被传递给主程序,在这种情况下,我只关心数组标题“MISC_DATA”。我正在尝试确定数组“MISC_DATA”中的最大值,并编写了另一个必须将数据传递给的函数,以确定这一点。但是,编译器告诉我它无法识别函数调用“Maximum_Value”。我很确定例程调用中包含的变量 MISC_DATA 存在问题,而不是函数本身。要么它无法将 MISC_DATA 识别为数组,要么我的语法错误。我只包括重要的代码 sn-ps 以使其更具可读性。 Read_Five_Columns 函数工作正常,它是函数“Maximum_Value”,由于指针数组 MISC_DATA 在主程序中的写入方式,编译器无法识别该函数。为澄清起见,函数调用中的变量 MISC_DATA 是包含数组的浮点数,变量“size_Mis”是包含数组大小的整数。任何想法将不胜感激。

int main(int argc, const char * argv[]) {

#include "Use_RNG.h"
#include "Read_Columnar_File.h"
#include <fstream>
#include <iostream>

 std::vector<std::string> str3;
 std::vector<int> str4;
 std::vector<char> str5;
 std::vector<int> str6;

    unsigned long size_Mis;
    std::vector<float> MISC_DATA;  // Reads in Misc. spending data
    char File1[8];
    strcpy(File1, "Misc.txt");
    Read_Five_Columns(File1,MISC_DATA,str3,str4,str5,str6);
    str3.clear(); str4.clear(); str5.clear(); str6.clear();
    size_Mis = MISC_DATA.size();

float value;
value = Maximum_Value(MISC_DATA,size_Mis);

end_time = clock();
std::cout << std::endl << "Total Time: " << (end_time-start_time)/CLOCKS_PER_SEC << std::endl;
return 0;
}

int Maximum_Value(float *array,int array_size)
{
    float max = 0;
   for(int i =10; i < array_size-1; i++)
   {
        if(array[i] > max) max = array[i];
   }
    return max;
}

【问题讨论】:

  • 为什么Maxmimum_Value 返回int 而不是float
  • MISC_DATAstd::vector,而不是数组或指针。
  • 并且不要在函数中包含头文件。
  • 感谢 cmets。头文件定义在main调用后被错误的剪切和粘贴,但在实际程序中是在前面列出的。在点击发送之前,我应该仔细检查一下。你是对的,我没有正确理解向量和数组之间的区别。

标签: c++ arrays function pointers vector


【解决方案1】:

我在这里看到了四个问题。

int main(int argc, const char * argv[]) {

#include "Use_RNG.h"
#include "Read_Columnar_File.h"
#include <fstream>
#include <iostream>

所有这些东西的顺序都错了。您不应该将系统头文件包含在函数体中,并且通常您在其他内容之前包含标准库内容。将其修改为如下所示:

#include <fstream>
#include <iostream>

#include "Use_RNG.h"
#include "Read_Columnar_File.h"

int main(int argc, const char * argv[]) {

其次,在使用 Maximum_Value 之前不要声明它。您需要将这个函数的定义移到main() 的定义之前,或者您需要在main() 之前添加一个原型:

int Maximum_Value(float *array,int array_size);

int main(int argc, const char * argv[]) {

然后,您尝试将 std::vector&lt;float&gt; 作为 float* 传递,但这是行不通的:

value = Maximum_Value(MISC_DATA,size_Mis);

但是,由于向量的存储保证是连续的并且像数组一样布局,您可以安全地将指针传递给第一个成员:

value = Maximum_Value(&MISC_DATA[0],size_Mis);

最后,当你应该返回 float 时,你从 Maximum_Value 返回 int


如果可能,我建议使用 std::max_element,它是标准 &lt;algorithm&gt; 标头的一部分:

// If you don't have C++11 then use std::vector<float>::iterator instead of auto.
auto max = std::max_element(MISC_DATA.begin(), MISC_DATA.end());

现在max 是最大元素的迭代器,所以*max 本身就是最大的float

(如果输入范围为空,则max 将等于MISC_DATA.end(),因此等效于您的函数将是value = max == MISC_DATA.end() ? 0f : *max;。)

【讨论】:

  • 很抱歉,您正确提到的问题是由于剪切和粘贴时发生的意外,实际程序中未相应列出。在实际程序中,定义在 main() 之前,并且在 main() 之前还有一个原型。这只是从主程序粘贴到该网站以快速而不是在我点击提交之前检查的工件。因此,如果我可以将指针传递给数组中的第一个元素;如何在函数中传递需要分析的整个数组?
  • @Jon 我建议的方式相同。由于向量中的内存保证与数组的布局方式相同,(&amp;vec[0])[n]vec[n] 具有相同的值。也就是说,您可以将 &amp;vec[0] 视为指向数组中第一个元素的指针,并使用指针数学(就像您在函数中所做的那样)来获取连续元素,就像对任何其他数组一样。
  • 啊,我明白了,您只需要传递对第一个元素的引用,然后函数中的指针数学开始指向连续的元素/内存位置。非常感谢!!
  • @Jon 没问题。但是,我强烈建议使用标准库中的std::max_elementauto max = std::max_element(MISC_DATA.begin(), MISC_DATA.end()); 然后 max 将是最大元素的迭代器(因此 *max 将是值)。
  • 再一次,我不知道标准模板库中存在这样的函数。无论如何,这仍然是一个很好的学习任务。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 2013-02-15
相关资源
最近更新 更多