Member 13433705 Ответов: 1

Ссылка на переменные вне функции


Я относительно новичок в написании функций на C++, в настоящее время у меня есть функция, которая будет принимать файл и проверять его имя. Если он включает "/ ham/ " в имя файла, мы затем увеличиваем количество слов для hamCount и начинаем бросать слова из этого файла в hamMap. Если имя файла содержит "/spam", то мы делаем то же самое, но для спама. Это все хорошо и хорошо, за исключением того, что когда я пытаюсь сделать звонки на карты, они находятся "вне сферы действия". Вот мой пример кода функции:

void mapAssign(string fileName) {
    string wordRead = "";
    ifstream opFile( fileName );
    if( !opFile.is_open() )
    {
        cout << "CANNOT OPEN FILE: " << fileName << endl;
    }

    if( fileName.find("/ham/") == true ) {
        while( getline(opFile, wordRead, ' ') ) {
        ++ham[wordRead];
        ++hamCount;
    }
        ++spam[wordRead];
        ++spamCount;
    }
    }
    
    opFile.close();
    opFile.clear();
    
}



А функция main () - это:
int main(int argc, char* argv[] ) {

    int wordCount;
    int fileStrCount;
    set<string> seenWords;
    map<string, int> ham;
    map<string, int> spam;    
    int hamCount;
    int spamCount;


    if( argc < 2 ) {
        cout <<  "ERROR: Must have atleast one filename! \n";
    }
    //The user gives a path to a directory containing "index"
    //File is used to store filename and fList stores them
    string files = "";
    vector<string> fList;

    //Storing full path of directory to later add /index
    string pathToDir = argv[1];
    string pathToIndex = pathToDir + "index";
    ifstream dirIndex( pathToIndex );

    //Push back all filenames within index to fList
    while( getline( dirIndex, files ) ) {
        fList.push_back( files );
    }

    //Iterate through filenames and open them 
    for(unsigned x = 0; x < fList.size(); x++) {
        string goHere = pathToDir + fList[x];
        mapAssign(goHere);
}








    }
    for(auto elem : ham)
    {
        cout << elem.first << " " << elem.second << "\n";
    }

    cout << endl << endl << endl;

    for(auto elem : spam)
    {
        cout << elem.first << " " << elem.second << "\n";
    }



}


Ошибка компиляции заключается в следующем:
betaAssassin.cpp:26:11: ошибка: ‘ham’ не был объявлен в этой области
++ветчина[wordRead];

Что я уже пробовал:

Я понятия не имею, как действовать дальше, я попытался изменить расположение функции, но это не поможет

1 Ответов

Рейтинг:
7

OriginalGriff

Переменные в основном существуют только в пределах ближайшего набора фигурных скобок, которые их содержат: вне этих скобок они не существуют и не могут быть доступны.

Так как вы объявляете переменные ham и spam внутри main функция, они совершенно невидимы снаружи. Хуже того, как только функция заканчивается, они уничтожаются (потому что они создаются в стеке, и он перерабатывается при выходе из него - так что если вы возвращаете указатель на них, он недействителен, но все равно будет работать.

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


Member 13433705

Привет OriginialGriff,

Спасибо, что так быстро откликнулись! Если я правильно вас понял, вы хотите сказать, что я не должен выполнять эту задачу в функции, так как она просто будет уничтожена в конце? Возможно, я мог бы просто иметь функцию, сообщающую мне, является ли это ветчиной или спамом, а затем возвращающую bool true или false?

OriginalGriff

Нет, задача должна быть в функции - но переменные этого не делают и не могут, если вы хотите, чтобы они были доступны обеим функциям. И ты это делаешь!
Есть альтернативы-вы можете передавать их в качестве параметров от одной функции к другой, - но это немного сложнее, чем вам нужно для этого упражнения.