【问题标题】:Loop through array of unknown size C++循环遍历未知大小的数组 C++
【发布时间】:2015-04-29 17:55:36
【问题描述】:

我正在尝试遍历大小未知的double 数组。

为什么以下不起作用?

for (unsigned int = 1; i < sizeof(anArray)/sizeof(double); i++) {
    ...
}

一切都编译得很好(g++ -Wall -Werror -std=c++11 app.cpp -o app),但程序根本没有进入循环。

全功能:

struct stock_data {
   int sell_index;
   int buy_index;
   double profit;
};

stock_data max_profit(double price_array[]) {
   int sell_index = -1, buy_index = -1, 
      min = 0;

   double profit = 0.0;

   for(int i = 1; i < size; i++) {

      if(price_array[i] - price_array[min] > profit) {
         sell_index = min;
         buy_index = i;
         profit = price_array[i] - price_array[min];
      }

      if(price_array[i] < price_array[min]) {
        min = i;
      }
   }  

   return {sell_index, buy_index, profit};
}

int main() {
   double yesterday[] = {0.1, 0.2, 0.3, 0.4};
   stock_data data = max_profit(yesterday);
   cout << data.profit << endl;
}

【问题讨论】:

  • sizeof(anArray) 告诉你一个指针的大小,当它除以一个 double 的大小时,是 0 或 1。
  • 我的水晶球说你将anArray 传递给了这个函数,它衰减为一个指针。希望我能看到足够多的代码来确定。
  • 这个数组是在哪里声明的?如果它在其他块中,它可能不起作用。
  • 没有足够的代码来确定任何事情。如果您将 anArray 声明为 double anArray[] 并且 anArray 没有衰减为只是一个指针,那么该代码将起作用。
  • 谈话很便宜。向我们展示代码。

标签: c++ arrays for-loop sizeof function-definition


【解决方案1】:

sizeof(anArray) 返回anArray 类型的大小,可能是*double。您必须将数组大小作为附加参数传递或使用std::vectorsize 方法。

查看 C 主函数 main(argc, argv),其中 argv 是程序的参数,argc 是它们的计数。或者取字符串,它们的结尾由决定其结尾的特殊字符 \0 确定。但这很容易出错。

在 C/C++ 中,没有其他方法可以处理数组。

【讨论】:

    【解决方案2】:

    在 C++ 中,运算符 sizeof 是编译时运算符。那就是它的值不是在运行时由编译器计算出来的。

    所以如果你说数组的大小未知,那么编译器就无法计算出数组占用的内存大小。

    因此很明显 anArray 是指向您可能传递给函数的数组的第一个元素的指针。

    所以这个表达式

    sizeof(anArray)/sizeof(double)
    

    等价于表达式

    sizeof( double * )/sizeof( double ).
    

    您还必须将数组的大小显式传递给函数。

    考虑到按值传递给函数的数组被转换为指向其第一个元素的指针。

    或者另一种方法是使用容器std::vector&lt;double&gt;而不是数组。

    你可以像这样声明你的函数

    stock_data max_profit(double price_array[], size_t size );
    

    然后这样称呼它

     stock_data data = max_profit( yesterday, 
                                   sizeof( yesterday ) / sizeof( *yesterday ) );
    

    【讨论】:

    • 或使用std::arraystd::vector
    • @Cole Johnson 最初他在帖子中写道,他处理未知大小的数组。所以我不建议使用 std::array 因为它的大小也应该在编译时知道。
    • std::vector OTOH,是动态的,不需要在编译时指定大小
    • @Cole Johnson 我说的是 std::array。
    【解决方案3】:

    您的函数max_profit 不知道数组price_array 的大小。 如果您希望函数接受不同大小的数组,您有两种选择:

    • 在数组旁边传递 size 值(C 风格)
    • 使用内部包含sizestd::vector 对象(C++ 样式)

    【讨论】:

      【解决方案4】:

      如果你真的想避免传递大小,你可以在数组末尾添加一个 NaN 并在循环中检查它。

      #include<cmath>
      ...
      for(int i = 0; !isnan(price_array[i]; i++){
          ...
      }
      

      在声明数组时添加 NaN:

      double price_array{0.0d, 5.9d, nan()};
      

      当然,这是假设您的数组中没有任何其他 NaN 作为实际数据的一部分。

      【讨论】:

        猜你喜欢
        • 2019-01-20
        • 2015-02-22
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-15
        • 1970-01-01
        相关资源
        最近更新 更多