Компилятор ожидает ;

229
25 декабря 2017, 13:17

Уже кидал данную программу ранее, но после того раза в ней некоторые вещи изменились, поэтому опять кидаю. В общем, на этот раз компилятор ожидает ; там, где этого знака не должно быть и ругается на = . Ниже код программы. 2 одинаковые ошибки в описании

int encryptionResult(int x, int key) и int encryptionResultReverse(int x, int y) при них же в комментах там описание ошибок (постарался виделить все)

и еще одна непонятная ошибка в int main() в первой строке описания

#include <iostream>
#include <sstream>
#include <algorithm>
#include <math.h>
#include <vector>
using namespace std;
typedef vector<int> masInt;
//ключ
const int key = 0x4a567bed;
//начальный вектор инициализации, _H0
const int H0 = 0x2b838811;
//подстановка степени 16 _s
const int s16[] = {
  11, 7, 9, 0,
  8, 5, 12, 1,
  2, 15, 3, 13,
  14, 6, 10, 4 };
//обратная подстановка _s_reverse
const int s16Reverse[] = {
  3, 7, 8, 10,
  15, 5, 13, 1,
  4, 2, 14, 0,
  6, 11, 12, 9 };
//массив констант _C
const int consts[] = {
  0x8e20faa7,
  0x2ba0b470,
  0x47017ddd,
  0x9b505a38,
  0xad08b0c0,
  0xc3282d1c,
  0xd8045870,
  0xef14980e,
  0x6c022c38,
  0xf90a4c07,
  0x3601161c,
  0xf205268d };
//массив для выделения полубайтов hex_basis
const int hexBasis[] = {
  0x0000000f,
  0x000000f0,
  0x00000f00,
  0x0000f000,
  0x000f0000,
  0x00f00000,
  0x0f000000,
  0xf0000000 };
const int basis[] = {
  0x00000001, 0x00000002, 0x00000004, 0x00000008,
  0x00000010, 0x00000020, 0x00000040, 0x00000080,
  0x00000100, 0x00000200, 0x00000400, 0x00000800,
  0x00001000, 0x00002000, 0x00004000, 0x00008000,
  0x00010000, 0x00020000, 0x00040000, 0x00080000,
  0x00100000, 0x00200000, 0x00400000, 0x00800000,
  0x01000000, 0x02000000, 0x04000000, 0x08000000,
  0x10000000, 0x20000000, 0x40000000, 0x80000000 };
//подстановка степени 32 _pi
const int s32[] = { 0, 8, 16, 24, 1, 19, 17, 25, 2, 10, 18, 26, 3, 11, 19, 
  27, 4, 12, 20, 28, 5, 13, 21, 29, 6, 14, 22, 30, 7, 15, 23, 31 };
//обратная подстановка _pi_reverse
const int s32Reverse[]{
  0, 4, 8, 12, 16, 20, 24, 28,
  1, 5, 9, 13, 17, 21, 25, 29,
  2, 6, 10, 14, 18, 22, 26, 30,
  3, 7, 11, 15, 19, 23, 27, 31 };
//линейное преобразование _L
int linearTransformation(int x) {
int mas[32];
for (int i = 0; i<32; ++i) {
    mas[i] = x&basis[s32[i]];
}
int L = 0;
for (int i = 0; i<32; ++i) {
    L |= mas[i];
}
return L;
}
//преобразование, основанное на подстановке s16
int s16Transformation(int x) {
int mas[8];
for (int i = 0; i<8; ++i) {
    mas[i] = s16[x&hexBasis[i]] & hexBasis[i];
}
int S = 0;
for (int i = 0; i<8; ++i) {
    S |= mas[i];
}
return S;
}
//обратное преобразование
int s16ReverseTransformation(int x) {
int mas[8];
for (int i = 0; i<8; ++i) {
    mas[i] = s16Reverse[x&hexBasis[i]] & hexBasis[i];
}
int S_reverse = 0;
for (int i = 0; i<8; ++i) {
    S_reverse |= mas[i];
}
return S_reverse;
}
//преобразование по условию
int dTransformation(int j, int i) {
int S_j = s16Transformation(i);
int L_j = linearTransformation(S_j);
L_j ^= consts[j];
int S = s16Transformation(L_j);
int L = linearTransformation(S);
return L^consts[j];
}
//преобразование по условию
int fTranformation(int x, int k) {
int S = s16Transformation(x^k);
return linearTransformation(S);
}
//массив раундовых ключей
masInt keys(int key) {
masInt K(12);
//int D[12];
for (int i = 0; i<12; ++i) {
    for (int j = 0; j<11; ++j) {
        key = fTranformation(dTransformation(i, j), key);
    }
    K[i] = key^dTransformation(i, 11);
    key = K[i];
}
return K;
}


//результат шифрования 32-х битного блока x на ключе k
int encryptionResult(int x, int key) {
//вот здесь он подчеркивает равно и выдает несколько ошибок
//1. expected a';'
//2. syntax error: missing ';' before '='
//3. syntax error: '='
masInt K(12) = keys(key);
for (int j = 0; j<11; ++j) {
    x = fTranformation(K[j], x);
}
return K[11]^x;
}
//функция сжатия в общем виде
int functionCompression(int x, int k, int H) {
return encryptionResult(k, (x^H));
}
//вычисление H по Ex(H) = y и x


int encryptionResultReverse(int x, int y) {
//вычислим раундовые ключи x0,...,x11
//и вот здесь он подчеркивает равно и выдает несколько ошибок
//1. expected a';'
//2. syntax error: missing ';' before '='
//3. syntax error: '=' 
masInt X(12) = keys(x);
//вычислим H за 11 раундов
y ^= X[11];
for (int i = 0; i<12; ++i) {
    y = s16ReverseTransformation(linearTransformation(y)) ^ X[10 - i];
}
return y;
}


//хэш-функция
int functionHash(masInt x) {
int H = H0;
for (int i = 0; i<x.size(); ++i) {
    H = functionCompression(x[i], key, H);
}
return H;
}

//основная программа
int main() {
//также ругается на строчку ниже (хоть и не подчеркивает ее) и пишет 
следующую ошибку: 'MkHexMasFromStr':indentifier not found
masInt x1_mas = MkHexMasFromStr();
//вычислим хэш сообщения
int H1 = functionHash(x1_mas);
cout << "хэш-сумма от сообщения " << H1 << endl;
//masInt x2_mas = MkHexMasFromStr();
//int H2 = functionHash(x2_mas);
return 0;
}


//преобразование строки в hex массив
masInt MkHexMasFromStr()
{
cout << "Введите x в 16-ричном виде" << endl;
string x_string;
cin >> x_string;
//дополним входное сообщение нулями
while (x_string.size() % 8 != 0) {
    x_string.push_back('0');
}
masInt x_mas (x_string.size() / 8);
//создадим hex-массив 
for (int i = 0; i<x_string.size(); i + 8) {
    stringstream x_stream;
    x_stream << hex << x_string.substr(i, i + 7); //делит массив
    x_stream >> x_mas[i / 8];
}
return x_mas;
}
Answer 1
masInt K(12) = keys(key);

Тут вы создаете экземпляр и сразу же пытаетесь изменить значение переменной. Делайте либо так:

masInt K(12);

Либо так:

masInt K = keys(key);

С

masInt X(12) = keys(x);

Аналогично.

С ошибкой MkHexMasFromStr. Просто поместите код

masInt MkHexMasFromStr() {
    cout << "Введите x в 16-ричном виде" << endl;
    string x_string;
    cin >> x_string;
    //дополним входное сообщение нулями
    while (x_string.size() % 8 != 0) {
        x_string.push_back('0');
    }
    masInt x_mas (x_string.size() / 8);
    //создадим hex-массив 
    for (int i = 0; i<x_string.size(); i + 8) {
        stringstream x_stream;
        x_stream << hex << x_string.substr(i, i + 7); //делит массив
        x_stream >> x_mas[i / 8];
    }
    return x_mas;
}

Перед функцией main. Иначе в функции main не видно вашей функции MkHexMasFromStr.

READ ALSO
Размер кэша строки 2-го уровня - C++

Размер кэша строки 2-го уровня - C++

ЗдравствуйтеЯ пишу программу для определения размера строки кэша второго уровня, пользовался статьей habrahabr

233
Не запускается JAR файл

Не запускается JAR файл

Написал JavaFX приложение, в настройках проекта настроил Artifacts, и сделал Build ArtifactsJar Файл создался, но не запускается

231
JSOUP+ Picasso. Парсинг картинок

JSOUP+ Picasso. Парсинг картинок

Привет всем молодым перспективным программистамМоя проблема обстоит так: На скриншоте у меня выделен код который отвечает за(как я понял)...

208