如何正确传递带有指向函数的指针的数组?

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&lt;int&gt; total(sides + 1) 欢迎来到 Stack Overflow。当您编写代码时,您应该尽可能独立地实现新功能,并且在它们完美运行之前不要组合它们。您正在尝试获取对数组进行操作的函数;所有这些关于用户交互、文件 I/O 和随机数的东西都只是阻碍了视图。 你为什么将&amp;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 个字节。在桌面上,我很少检查这些东西。我的朋友,什么是正常的?

以上是关于如何正确传递带有指向函数的指针的数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过带有指针的函数传递 char 变量(示例已发送)?

如何在 STL 中使用指向向量的指针,就像我们在将数组地址传递给另一个函数时将指针分配给数组一样?

c ++按值或指向函数语法的指针传递数组

如何定义指向函数的指针?

如何正确地将浮点指针从 C 库传递到其 C# 包装器

C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?