如何正确传递带有指向函数的指针的数组?
Posted
技术标签:
【中文标题】如何正确传递带有指向函数的指针的数组?【英文标题】:How do you correctly pass arrays with pointers to a function? 【发布时间】:2018-10-27 01:22:49 【问题描述】:我必须动态分配一个数组并将其传递给一个函数,以计算掷出加权骰子的几率。每当我运行我的代码时,该函数不记得添加到我的数组中的值并返回随机值,我将 *weight 传递给 roll 函数的方式有什么问题?我在添加权重后添加了打印语句,并且权重输入正常,直到通过指针传递给函数。
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;
int roll (int sides, double *weight)
int total[sides + 1];
total[0] = 0;
for (int i = 1; i <= sides; i++)
total[i] = total[i - 1] + weight[i];
int current = (rand() % total[sides + 1] - 1 + 1);
//cout << current << " ";
for (int i = 1; i <= sides; i++) // 1 to weight 1,,,,, weight 1 to weight
2
if (current <= total [i] && current > total[i - 1])
current = i;
return current;
应该检索滚动的随机数的函数。 ^
int main ()
int sides = 0;
int rolls = 0;
int answer = 0;
int currentRoll = 0;
bool done = false;
double* weight;
double totalWeight;
srand(time(NULL));
cout << "Dice Roll Menu: " << endl << "1. Specify an output file" << endl <<
"2. Enter sides and weight for a die" << endl << "3. Simulate a specified
number of rolls of the weighted die" << endl << "4. Exit" << endl;
while (done != true)
cout << endl << "Enter a number that corresponds to you choice: ";
cin >> answer;
while (answer == 2) //SIDES
cout << "Please enter the number of sides on the die (must be
greater than two): ";
cin >> sides;
if (sides < 2)
cout << "Invalid input, try again." << endl;
else
weight = new double[sides + 1];
for (int i = 0; i < sides + 1; i++)
weight[i] = 0;
break;
while (answer == 2)
totalWeight = 0;
for (int i = 1; i <= sides; i++) //WEIGHT
cout << "Enter a weight for side " << i << ": ";
cin >> weight[i];
cout << "TEST: " << weight[i] << endl;
totalWeight = weight[i] + totalWeight;
if (weight[i] < 0)
cout << "Invalid input. Try again.";
totalWeight -= weight[i];
i--;
break;
确定边数和权重并动态分配数组的循环。 ^
while (answer == 3)
cout << "Enter the amount of rolls you would like to perform: ";
cin >> rolls;
if (rolls < 0)
cout << "Invalid input. Try again.";
else
else if (totalWeight == 0)
cout << "Please enter weights of the dice first!" << endl;
answer = 1;
else
done = true;
break;
//ACTUAL CODE HERE
for (int i = 1; i <= rolls; i++) //CALCULATES
currentRoll = roll(sides, &weight[i]);
cout << currentRoll << " ";
【问题讨论】:
不使用标准容器的原因是什么,例如std::vector
?
int total[sides + 1];
请注意,这不是有效的 C++。为了表示 C++ 中数组中的条目数,条目数用编译时常数表示。您使用的扩展不是 C++ 语言的正式组成部分。请改用std::vector<int> total(sides + 1)
。
欢迎来到 Stack Overflow。当您编写代码时,您应该尽可能独立地实现新功能,并且在它们完美运行之前不要组合它们。您正在尝试获取对数组进行操作的函数;所有这些关于用户交互、文件 I/O 和随机数的东西都只是阻碍了视图。
你为什么将&weight[i]
传递给roll
?想想它在做什么,以及你希望它做什么。
@PaulMcKenzie ,我必须能够使用动态分配的数组来完成这个程序,遗憾的是不允许使用向量。
【参考方案1】:
也许主导 cmets 的许多误解都与简单地使用 C++(但没有使用 std::containers)有关。
我的开箱即用的想法(或者只是疯狂)是:之间真的没有冲突:
“我必须能够使用'动态分配的数组'来完成这个程序,遗憾的是我不允许使用向量
然而,所有相关人员似乎都同意这是一个 C++ 类分配。
所以,我们需要考虑一种动态创建数组的方法(我认为这部分很简单,不知道为什么)。我们想要一些编译时间固定大小的东西。数组必须存在于动态内存中。 (而且没有标准容器。)
目标也表述得更简单了
我必须动态分配一个数组并将它传递给一个函数 计算概率...
我提出以下建议。 (这段代码编译运行。)
#include <iostream>
using std::cout, std::flush, std::endl;
// Step 1 - wrap an array inside a class
class Array_t
const int m_sz;
int64_t* m_arr;
public:
Array_t()
: m_sz(128)
, m_arr (new int64_t[m_sz]) // allocate array in dynamic memory
// init for easy sum ... -------------v
for (int j=0; j<m_sz; j+=1) m_arr[j] = 1; // easy sum
~Array_t() = default;
int64_t sum()
int64_t retVal = 0;
for (int i=0; i<m_sz; i+=1)
retVal += m_arr[i]; // direct access to the data!
return retVal;
;
// If your C++ 'Hello World' has no class ... why bother?
// Step 2 - auto var the above
class DUMY999_t
public:
DUMY999_t() = default;
~DUMY999_t() = default;
int operator()(int argc, char* argv[]) return exec(argc, argv);
private:
int exec(int , char** )
// here is the array wrapped in a class, an automatic var!
// the array is dynamically allocated in the class (see ctor)
Array_t arr;
// ctor provides the compile time constant
// Step 3
// pass the array (in the class) to some function foo()
cout << "\n foo(arr) :" << foo(arr) << endl;
// Step 4 - can we solve the 'how pass' question?
// It should be obvious that foo is redundant ...
// the following is both more direct
// and object-oriented (a good thing)
// >>> put the function in the object that has the data <<<
cout << "\n arr.sum() :" << arr.sum() << endl;
// invoke an object method which has
// direct access to the data!
return 0;
// why pass the data to the function? (c-style?)
int64_t foo(Array_t& arr)
return arr.sum();
// why not install the function into the object? (c++?)
; // class DUMY999_t
int main(int argc, char* argv[]) return DUMY999_t()(argc, argv);
典型输出:
foo(arr) :128
arr.sum() :128
【讨论】:
经过深思熟虑的方法,但是(语法)您不能将 逗号运算符 与using std::cout, std::flush, std::endl;
一起使用
@DavidC.Rankin - 谢谢。直到你提到它,我才注意到这个特性是“新的”,并且只在“-std=c++17”之后才可用。逗号列表称为“使用声明符列表;”带有描述:“具有多个 using-declarator 的 using-declaration 等效于具有一个 using-declarator 的相应 using-declarations 序列。”见en.cppreference.com/w/cpp/language/namespace。
现在这是我不知道的。日子很好,我学到了一些新东西。谢谢。
它也可以。唯一奇怪的是我在使用 c++17 的 Linux 上的可执行文件大小~4500 bytes
比 c++11 可执行文件大(剥离)。那是~32%
——这正常吗?
@DavidC.Rankin - 我构建了一个并行代码(-O3 和许多选项,我的可交付成果),并且使用“使用 declarator-list”的构建小 16 个字节。在桌面上,我很少检查这些东西。我的朋友,什么是正常的?以上是关于如何正确传递带有指向函数的指针的数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 STL 中使用指向向量的指针,就像我们在将数组地址传递给另一个函数时将指针分配给数组一样?
C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?