函数不接受 c++ 参数

Posted

技术标签:

【中文标题】函数不接受 c++ 参数【英文标题】:c++ arguments aren't accepted into functions 【发布时间】:2019-10-28 20:16:46 【问题描述】:

我的 c++ 程序是这样的:

#include <iostream>
#include <cstdlib>
#include <dos.h>
using namespace std;

void arr(int pts,string *splt_msg)
  for(int x=-1;x<pts-1;x++)
    string input;
    cout<<"Enter part "<<x<<endl;
    cin>>input;
    (*splt_msg)[x]=input;
  


void print_arr(string *splt_msg,int del,int parts)
  for(int x=-1;x<parts-1;x++)
    cout<<(*splt_msg)[x];
    delay(del);
  


int main()
  cout<<"Parts in message: ";
  int parts;
  cin>>parts;
  cout<<"Delay between parts(ms): ";
  int del;
  cin>>del;
  parts--;
  string splt_msg[parts];
  string (*Parr)[parts]=&splt_msg;
  arr(parts,Parr);
  print_arr(Parr,del,parts);
  return 0;

这是错误代码(在 windows 和 mingw 上):

c:\Users\User\Desktop\c++>g++ -o program test1.cpp
In file included from test1.cpp:3:0:
c:\mingw\include\dos.h:54:2: warning: #warning "<dos.h> is obsolete; consider using <direct.h> instead." [-Wcpp]
  ^~~~~~~
test1.cpp: In function 'void arr(int, std::__cxx11::string*)':
test1.cpp:18:14: error: 'delay' was not declared in this scope
delay(del);
        ^
test1.cpp: In function 'int main()':
test1.cpp:32:17: error: cannot convert 'std::__cxx11::string (*)[parts] aka std::__cxx11::basic_string<char> (*)[parts]' to 'std::__cxx11::string* aka std::__cxx11::basic_string<char>*' for argument '2' to 'void arr(int, std::__cxx11::string*)'
   arr(parts,Parr);
                 ^
test1.cpp:33:27: error: cannot convert 'std::__cxx11::string (*)[parts] aka std::__cxx11::basic_string<char> (*)[parts]' to 'std::__cxx11::string* aka std::__cxx11::basic_string<char>*' for argument '1' to 'void print_arr(std::__cxx11::string*, int, int)'
   print_arr(Parr,del,parts);
                           ^

有人知道我做错了什么以及解决方案吗? 感谢您的帮助,我只是想编写一个简单的程序来测试一些概念,例如将指针传递给函数,但它似乎不起作用。

【问题讨论】:

这行应该是什么意思 string (*Parr)[parts]=&amp;splt_msg; ?说真的,我不知道 @foreknownas_463035818 这是指向 std::string 的指针的 VLA 的声明,称为 Parr。绝对不是他们想要的。 注意有关 dos.h 已过时的警告。 delay 函数几十年前就消失了。查看std::this_thread:::sleep_for 寻找现代替代品。 你从哪里定义或包含string的定义? 如果你想学习指针,最好使用实际需要指针的示例。无需在您的代码中使用它们。虽然,从我的脑海中,我不知道需要原始指针的东西的好例子,我不记得我上次使用的时候......确实有更重要的东西要学习 【参考方案1】:

这段代码更像是 C 风格而不是 C++。你正在做困难的容易出错的事情。尝试使用向量等

string splt_msg[parts];

甚至不应该计算,因为parts 不是一个常量表达式。

尝试使用 std::vector 之类的东西。并通过引用传递。例如:

#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>

template<typename T>
T Read() noexcept 
    T output;
    std::cin >> output;
    return output;


void arr(std::vector<std::string>& splt_msg) 
    for (auto& msg : splt_msg) 
        std::cout << "Enter part \n";
        std::cin >> msg;
    


void print_arr(std::vector<std::string> const& splt_msg, int delay) 
    for (auto& msg : splt_msg) 
        std::cout << msg;
        Sleep(delay);
    


int main() 
    std::cout << "Parts in message: ";
    auto parts = Read<int>();

    std::cout << "Delay between parts(ms): ";
    auto delay = Read<int>();

    std::vector<std::string> splt_msg(parts);
    arr(splt_msg);
    print_arr(splt_msg, delay);

编辑:甚至更好:使用对象

#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>

template<typename T>
T Read() noexcept 
    T output;
    std::cin >> output;
    return output;


class SplitMessage 
private:
    std::vector<std::string> splitMessage;
public:
    SplitMessage(size_t length) noexcept : splitMessage(length) 

    void GetData() noexcept;
    void PrintData(int delay) const noexcept;
;

void SplitMessage::GetData() noexcept 
    for (auto& msg : splitMessage) 
        std::cout << "Enter part \n";
        std::cin >> msg;
    


void SplitMessage::PrintData(int delay) const noexcept 
    for (auto& msg : splitMessage) 
        std::cout << msg;
        Sleep(delay);
    


int main() 
    std::cout << "Parts in message: ";
    auto parts = Read<int>();

    std::cout << "Delay between parts(ms): ";
    auto delay = Read<int>();

    SplitMessage splt_msg(parts);
    splt_msg.GetData();
    splt_msg.PrintData(delay);

【讨论】:

【参考方案2】:

这两个函数都需要std::string*(指向字符串的指针)作为第一个参数,但两次都需要将std::string*[](指向字符串的指针数组)作为第一个参数。解决方案取决于您想要实现的目标,但我想,您想使用索引器为数组的一个元素调用函数:print_arr(Parr[0],del,parts);

其他一些注意事项:

for(int x=-1;x&lt;parts-1;x++)cout&lt;&lt;(*splt_msg)[x];... 将访问字符串的第 -1 个字符,即 UB,但可能只是崩溃。应该是for(int x=0;x&lt;parts;x++) string splt_msg[parts]; 不是有效的 C++,因为 parts 在编译时不是常量。

【讨论】:

以上是关于函数不接受 c++ 参数的主要内容,如果未能解决你的问题,请参考以下文章

错误 C2660:函数不接受 2 个参数 C++

vs2013写c++程序,其中localtime_s函数不接受一个参数怎么解决?!

C++ - 使用 strcpy_s(s+2,s+3);不起作用 - “函数不接受 2 个参数”

error C2660: fopen_s : 函数不接受 2 个参数

如何模板化一个接受模板化参数并在 C++ 中对其应用模板化函数的函数?

为啥复制构造函数应该在 C++ 中通过引用来接受它的参数?