У меня возникли проблемы с созданием и выполнением прототипных функций в программировании на c

#c #function-prototypes

#c #функция-прототипы

Вопрос:

Я начал изучать программирование на C и просто возился с разными командами, и, похоже, мне трудно использовать прототипные функции и выполнять их. Я использую CodeBlocks для всего. Мой код заключается в том, чтобы просто установить пароль и попросить пользователя ввести пароль для продолжения. Кажется достаточно простым, не так ли? Насколько я понимаю, это то, что у меня есть прямо сейчас. (Я не продвинулся дальше в этом, потому что я обнаружил ошибку на ранней стадии)

 #include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;

// prototype declaration
int getPassword(int nPassword);
// declare combo to be matched
const int nCombo = 3141
int main(int nNumberofArgs, char* pszArgs[])
{
    getPassword();
    return 0;
}
// fetch password from user to compare to nCombo
int getPassword(int nPassword)
{
    cout << "Please enter password..." << endl;
    cin  >> nPassword;
    return nPassword;
}
  

Когда я запускаю эту программу как есть, строка cout не появляется на экране, программа завершается, и ничего не делается. Пожалуйста, помогите мне с этим. очень расстраивает.

Комментарии:

1. Ваша функция ожидает аргумент int, но вы вызвали его без него. Вы имели в виду использовать cin in main и передавать это значение в getPassword ?

2. Поскольку вы вставили его, он не будет компилироваться, не говоря уже о запуске — у вас отсутствует точка с запятой после const int nCombo = 3141, и вы вызываете getPassword(); без требуемого аргумента INT.

3. getPassword() принимает int тип, вы ничего ему не передали. Я удивлен, что это скомпилировано. Кроме того, вы немедленно перезаписываете переменную nPassword внутри функции, прежде чем она будет использована. Это делает передачу его по значению совершенно бесполезной.

4. По возможности вместо использования прототипов функций измените порядок своих функций так, чтобы функции определялись перед любой строкой кода, использующей функцию. Если у вас есть функции, которые вызываются в нескольких файлах, вы должны использовать прототипы функций. Однако, если функция используется только в файле, в котором существует исходный код, определяющий функцию, то обычно проще получить определение функции и ее тело перед любым использованием функции, чтобы определение функции служило прототипом. Поэтому переместите функцию getPassword() выше main() и избавьтесь от прототипа.

Ответ №1:

Хорошо, итак, есть некоторые проблемы с вашим фрагментом кода, помимо отсутствующей точки с запятой после вашего объявления nCombi .

В вашем объявлении и определении int getPassword(int) вы указываете, что функция должна принимать целое число, но вы не указываете его при вызове функции. Кроме того, функция возвращает целое число, которое вы не фиксируете.

Я представил некоторые исправления ниже.

 #include<cstdlib>
#include<cstdio>
#include<iostream>
using namespace std;

// prototype declaration
int getPassword();

// declare combo to be matched
const int nCombo = 3141;

int main(int nNumberofArgs, char* pszArgs[])
{
    // The main control loop. We continue this forever or until the user submits the correct password
    while (true)
    {
        // Capture input from the user. Save the result in pw
        int pw = getPassword();

        // Here we test if the user has submitted the correct password
        if (nCombo == pw)
        {
            cout << "You got it!" << endl;

            // Break out of the loop, and exit the program
            break;
        }
    }

    return 0;
}

// Fetch password from user to compare to nCombo
int getPassword()
{
    int nPassword = 0;

    cout << "Please enter password..." << endl;
    cin  >> nPassword;

    return nPassword;
}
  

Комментарии:

1. Большое вам спасибо! Ваш код безупречен. Я не могу поверить, что я пересмотрел приравнивание переменной к возврату getPassword (). Я все еще не совсем понимаю, почему cout << «Пожалуйста, введите пароль …» << endl; не отображался при выполнении программы, но спасибо.

Ответ №2:

Ну, первое, что я увидел, это то, что вы передаете аргументы своей main функции. Это недопустимо, поскольку main функция вызывается первой, и, следовательно, у программы нет возможности передать ей аргументы. поэтому я бы посоветовал вам изменить его на простой int main(){...}

Следующим шагом было бы то, что вы определили getPassword функцию для приема аргумента nPassword , но когда вы вызываете функцию, вы не передаете никаких аргументов, поэтому я бы предположил, что ваша функция getPassword не вызывается. Для этого есть два исправления :

a) Make getPassword не принимает никаких аргументов.

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

Итак, после исправления ‘a’ я бы предложил сделать что-то вроде :

 int getPassword(){
    int nPassword;

    std::cout << "Please enter password..." << std::endl;
    std::cin >> nPassword;
    return nPassword;
}
  

и затем вызываю функцию с помощью

 int nPassword;
nPassword = getPassword();
  

Вышеуказанные вещи в одном коде были бы похожи :

 #include<iostream>

//protoype declaration
int getPassword();

//combo to check for
const int nCombo = 3141;

int main(){
    int nPassword;
    nPassword = getPassword();

    if (nPassword == nCombo)
    {
        std::cout << "Correct password!" << std::endl;
    }
    else
    {
        std::cout << "Incorrect password!" << std::endl;
    }

    return 0;
}

int getPassword(){

    int nPassword;

    std::cout << "Please enter password..." << std::endl;
    std::cin >> nPassword;
    return nPassword;
}
  

Конечно, если вы хотите, чтобы пользователь продолжал вводить пароль до тех пор, пока он не будет правильным, вы можете просто поместить содержимое main функции в while loop , которое продолжается до тех пор, пока введенный пароль не будет правильным. Надеюсь, это помогло.

Комментарии:

1. Нет способа передать аргументы main() ? Вы уверены?