функция — Как вернуть много vales в main из void (c ++)

Может ли кто-нибудь сказать мне, почему изменения, внесенные в указанные ниже переменные, не переносятся в main?

Я довольно новичок в этом, поэтому, пожалуйста, будьте проще.

Если вам нужно больше моего кода, дайте мне знать: D

void BannedWordsArrayCreate (string filePathInBanned, vector<string> bannedWords, vector<int> bannedWordsCount, vector<int> containsBannedWordsCount ) {

cout << "Please enter the file path for the banned word list. (no extension.): " << endl; //User enters file name
cout << "E.g. C:\\Users\\John\\banned" << endl;
cin >> filePathInBanned;
filePathInBanned += ".txt"; //Takes User defined file name and adds .txt

ifstream inFile;
inFile.open(filePathInBanned,ios::in); //opens file

if (!inFile) //if file cannot be opened: exits function.
{
cerr << "Can't open input file." << filePathInBanned << endl;
exit(1);
}

else if (inFile.is_open()) //if file opens: puts file into vector.
{
string bw = "nothing"; //temporary string used to signal end of file.
while(!inFile.eof() && bw != "")
{
inFile >> bw;
if (bw != "")
{
bannedWords.push_back(bw);
}
}
}
inFile.close();
cout << endl << "Done!" << endl << endl;

for(int i = 0; i < bannedWords.size(); i++)
{
bannedWordsCount.push_back(0);
containsBannedWordsCount.push_back(0);
}
}

0

Решение

Эта строка …

void BannedWordsArrayCreate (string filePathInBanned,
vector<string> bannedWords, vector<int> bannedWordsCount,
vector<int> containsBannedWordsCount )

…нужно запросить переменные по ссылке& лексема) …

void BannedWordsArrayCreate (string& filePathInBanned,
vector<string>& bannedWords, vector<int>& bannedWordsCount,
vector<int>& containsBannedWordsCount )

Ссылки — это, в основном, псевдонимы или альтернативные имена для исходной переменной (предоставляемой вызывающей стороной), поэтому изменения, внесенные «в ссылку», фактически изменяют исходную переменную.

В вашей исходной функции аргументы функции передаются по значению, Это означает, что переменные в вызывающем контексте копируются, и функция начинает работать только с этими копиями — любые изменения в копиях теряются, когда функция возвращается.


По отдельности, !inFile.eof() не используется правильно. Существует много вопросов о переполнении стека, но в целом eof() Флаг может быть установлен потоком только после того, как он узнает, что вы пытаетесь преобразовать (например, если вы попытаетесь прочитать строку и он сможет найти только много пробелов, он потерпит неудачу и установит eof, но если вы спросите поток о том, что является следующим символом (включая пробелы), он вернет этот символ успешно, не нажимая / не устанавливая eof). Вы можете упростить обработку ввода до:

if (!(std::cin >> filePathInBanned))
{
std::cerr << "you didn't provide a path, goodbye" << std::endl;
exit(1);
}

filePathInBanned += ".txt"; //Takes User defined file name and adds .txt

if (ifstream inFile(filePathInBanned))
{
string bw;
while (inFile >> bw)
bannedWords.push_back(bw);
// ifstream automatically closed at end of {} scope
}
else
{
std::cerr << "Can't open input file." << filePathInBanned << std::endl;
exit(1);
}
2

Другие решения

Все ваши параметры передаются по значению. Это означает, что при вызове функции объекты, которые вы передаете, копируются. Поэтому, когда они изменяются внутри функции, изменения выполняются в копии, а не в оригинале, который вы передали. Чтобы это исправить, передайте по ссылке:

void BannedWordsArrayCreate (string& filePathInBanned, vector<string>& bannedWords, vector<int>& bannedWordsCount, vector<int>& containsBannedWordsCount )

& после того, как тип объекта говорит, что мы хотим скопировать адрес памяти в функцию вместо объекта. Поэтому, когда мы вносим изменения в объект внутри функции, мы меняем память по адресу, который мы передали. Оригинал изменяется.

1

По вопросам рекламы [email protected]