аргументы c ++ не принимаются в функции - PullRequest
1 голос
/ 28 октября 2019

Моя программа на С ++ выглядит так:

#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);
                           ^

Кто-то знает, что я сделал неправильно, и решение? Спасибо за помощь, я просто пытаюсь написать простую программу для проверки некоторых понятий, таких как передача указателей на функции, но она, похоже, не работает.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Этот код больше в стиле 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);
}
0 голосов
/ 28 октября 2019

Обе функции требуют std::string* (указатель на строку) в качестве первого параметра, но оба раза вы передаете std::string*[] (массив указателей на строку) в качестве первого параметра. Решение зависит от того, чего вы хотите достичь, но, я думаю, вы хотите вызвать функцию для одного элемента массива с индексатором: print_arr(Parr[0],del,parts);

Некоторые другие примечания:

  • for(int x=-1;x<parts-1;x++){cout<<(*splt_msg)[x];...} получит доступ к -1-му символу строки, который является UB, но, вероятно, просто вылетает. Должно быть for(int x=0;x<parts;x++)
  • string splt_msg[parts]; не является допустимым C ++, поскольку parts не является константой во время компиляции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...