2

我正在尝试遍历一个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;
}
4

4 回答 4

9

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

因此,如果您说数组的大小未知,则编译器无法计算数组占用的内存大小。

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

因此这个表达式

sizeof(anArray)/sizeof(double)

相当于表达式

sizeof( double * )/sizeof( double ).

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

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

或者另一种方法是使用容器std::vector<double>而不是数组。

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

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

并称它为

 stock_data data = max_profit( yesterday, 
                               sizeof( yesterday ) / sizeof( *yesterday ) );
于 2015-02-27T05:24:07.603 回答
5

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

看看 C 的 main 函数,程序的参数在哪里,main(argc, argv)它们的数量是多少。或者取字符串,它们的结尾由决定其结尾的特殊字符 \0 确定。但这很容易出错。argvargc

在 C/C++ 中,数组没有其他方法。

于 2015-02-27T05:17:01.803 回答
2

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

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

在声明数组时添加 NaN:

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

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

于 2015-02-27T07:07:20.487 回答
1

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

  • size将值与数组一起传递(C 风格)
  • 使用std::vector包含size内部的对象(C++ 风格)
于 2015-02-27T05:28:30.670 回答