Неопределенный идентификатор / необъявленный - PullRequest
1 голос
/ 17 июня 2020

Я недавно начал работать с C ++ и хотел создать простую функцию шифрования прерывания, которую можно было бы вызвать, однако, поскольку я скопировал структуру кодирования из моей программы python, я, похоже, получаю 4 ошибки и 2 предупреждения. Бит режима - это логическое значение, где true - для шифрования, а false - для расшифровки (он работал на python, так что, привет).

Первый в строке, где я создаю функцию, где int - это , он говорит «идентификатор» в «undefined»

Второй в той же строке, говоря «ожидается a ')'»

Третий идет после 3 операторов if, говоря «идентификатор» CharPos «undefined», даже если он определен

И Forth в той же строке, говоря: «'CharPos': необъявленный идентификатор»

#include <iostream>
#include <fstream>
#include <string>

std::string Encryption(std::string Password, int Key, bool Mode) {
    std::string Alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
    std::string EncryptPass = "";
    if (Key > 36) {
        Key = Key % 36;
    }
    for (int X = 0; X < Password.length(); X++) {
        if (Password.at(X) == ' ') {
            EncryptPass = EncryptPass + " ";
        }
        else {
            for (int Y = 0; Y < 36; Y++) {
                if (Password.at(X) == Alphabet.at(Y)) {
                    if (Mode == true) {
                        int CharPos = Y + Key;
                        if (CharPos > 35) {
                            CharPos = CharPos - 36;
                        }
                    }
                    if (Mode == false) {
                        int CharPos = Y - Key;
                        if (CharPos < 0) {
                            CharPos = CharPos + 36;
                        }
                    }
                    if (Mode != true and Mode != false) {
                        int CharPos = 0;
                    }
                    char CharPos2 = CharPos;
                    char EncryptChar = Alphabet.at(CharPos2);
                    EncryptPass = EncryptPass + EncryptChar;
                }
            }
        }
    }
    return EncryptPass;
}

Любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Как отмечалось выше, основная проблема в вашем коде заключается в том, что CharPos переопределяется в каждом предложении if.

Каждое место, куда вы помещаете int CharPos = ..., создает новый переменная, и хотя ее имя у вас похоже, для компилятора есть три уникальные переменные с этим именем. Чтобы использовать одну и ту же переменную во всех областях - среде переменных, вы должны определить ее один раз в первой общей области из всех, что означает, что в for l oop до пунктов if - else.

Кроме того, как указано выше, Mode != true || Mode != false эквивалентно true!

Я переписал ваш код чтобы быть в безопасности, добиться желаемого шифрования и более читабельного (IMO).


std::string encrypt(const std::string& word, std::size_t shift_amount, bool should_shift_up)
{
    static const std::string alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";

    assert (shift_amount <= alphabet.size()); // makes no sense having shift > alphabet size!

    std::string encrypted_word(word.size(), '\0');

    for (std::size_t idx = 0; idx < word.size(); ++idx)
    {
        char original_char = word[idx];
        std::size_t pos_in_alphabet = alphabet.find(original_char);

        std::size_t shifted_char = 'a';
        if (should_shift_up)
        {
            shifted_char = (pos_in_alphabet + shift_amount) % alphabet.size();
        }
        else
        {
            shifted_char = (pos_in_alphabet > shift_amount)  
                         ? pos_in_alphabet - shift_amount
                         : alphabet.size() - shift_amount + pos_in_alphabet;
        }

        encrypted_word[idx] = alphabet[shifted_char];
    }

    return encrypted_word;
}
0 голосов
/ 17 июня 2020

у вас есть проблемы с областью видимости некоторых переменных, например здесь: char CharPos2 = CharPos; charPos больше не входит в область видимости, поэтому на самом деле это недопустимое присвоение.

Итак, вместо этого определения нового CharPost в каждом if else, объявляйте его раньше и повторно назначайте его при каждой проверке if, например:

if (Password.at(X) == Alphabet.at(Y)) {
    int CharPos = 0;
    if (Mode == true) {
        CharPos = Y + Key;
        if (CharPos > 93) {
            CharPos = CharPos - 94;
        }
    }
    if (Mode == false) {
        CharPos = Y - Key;
        if (CharPos < 0) {
            CharPos = CharPos + 94;
        }
    }
    if (Mode != true or Mode != false) {
        CharPos = 0;
    }
    char CharPos2 = CharPos;
    char EncryptChar = Alphabet.at(CharPos2);
    EncryptPass = EncryptPass + EncryptChar;
}

, но помимо этого, ваш код сломан ... поэтому только транспиляция не работает здесь ...

смотрите здесь:

std::string Alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
...
for (int Y = 0; Y < 94; Y++) {
    if (Password.at(X) == Alphabet.at(Y)) {

Алфавит в (Y) взорвется для значений выше 36 ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...