循环遍历未知大小的数组 C++
Loop through array of unknown size C++
我正在尝试遍历一个大小未知的 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)
returns 类型的大小 anArray
,可能 *double
。您必须将数组大小作为附加参数传递或使用 std::vector
并且它是 size
方法。
看看 C 主函数 main(argc, argv)
,其中 argv
是程序的参数,argc
是它们的计数。或者拿字符串来说,它们的结尾是由一个特殊字符 \0 决定的,它决定了它的结尾。但这很容易出错。
在 C/C++ 中没有其他方法可以使用数组。
在 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 ) );
您的函数 max_profit
不知道数组 price_array
的大小。
如果你想让函数接受不同大小的数组,你有两个选择:
- 将
size
值与数组一起传递(C 样式)
- 使用
std::vector
对象保存 size
内部(C++ 风格)
如果你真的想避免传递大小,你可以在数组的末尾添加一个 NaN 并在循环中检查它。
#include<cmath>
...
for(int i = 0; !isnan(price_array[i]; i++){
...
}
要在声明数组时添加 NaN:
double price_array{0.0d, 5.9d, nan()};
当然,这是假设您的数组中没有任何其他 NaN 作为实际数据的一部分。
我正在尝试遍历一个大小未知的 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)
returns 类型的大小 anArray
,可能 *double
。您必须将数组大小作为附加参数传递或使用 std::vector
并且它是 size
方法。
看看 C 主函数 main(argc, argv)
,其中 argv
是程序的参数,argc
是它们的计数。或者拿字符串来说,它们的结尾是由一个特殊字符 \0 决定的,它决定了它的结尾。但这很容易出错。
在 C/C++ 中没有其他方法可以使用数组。
在 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 ) );
您的函数 max_profit
不知道数组 price_array
的大小。
如果你想让函数接受不同大小的数组,你有两个选择:
- 将
size
值与数组一起传递(C 样式) - 使用
std::vector
对象保存size
内部(C++ 风格)
如果你真的想避免传递大小,你可以在数组的末尾添加一个 NaN 并在循环中检查它。
#include<cmath>
...
for(int i = 0; !isnan(price_array[i]; i++){
...
}
要在声明数组时添加 NaN:
double price_array{0.0d, 5.9d, nan()};
当然,这是假设您的数组中没有任何其他 NaN 作为实际数据的一部分。