Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 15.12.2015
Сообщений: 19

Использование собственного класса в Windows Forms

15.12.2015, 15:26. Показов 1473. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прошу помочь мне с использованием собственного класса (последовательный алгоритм шифрования RSA) - представлен усеченный вариант, не влияющий, как я предполагаю, на проблему.
На сайте уже было несколько тем по этому поводу, но все же...
Я пользовалась вот этим ответом, но пока безрезультатно...(
Итак. У меня есть мой класс SerialRSA:

SerialRSA.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
public class SerialRSA
{
private: 
    const int MAX;
    char *Text;
    unsigned int e, d, n;
        void GenerateKey();
public:
    SerialRSA(char* _Text, int lenght);
    int getE() { return e; };
    int getD() { return d; };
    int getN() { return n; };
};
SerialRSA.cpp
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
SerialRSA::SerialRSA(char* _Text, int lenght):MAX(lenght)
{
    Text=_Text;
    GenerateKey();
}
void SerialRSA::GenerateKey()
{
    // Генерация ключей e, d, n.
}
Форма MyForm:
MyForm.h
C++
1
private: SerialRSA *serial; //error C2143: syntax error : missing ';' before '*'
MyForm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "MyForm.h"
#include "SerialRSA.h"
 
char* SystemStringToChar(System::String^ string)
{
    return (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(string);
}
void CryptRSA::MyForm::btnCrypt_Click(System::Object^ sender, System::EventArgs^ e)
{
    if (!String::IsNullOrWhiteSpace(txtCrypt->Text))
    {
        const int MAX = 20;
        String^ txt = txtCrypt->Text;
        int length = txt->Length;
        if (length <= MAX)
        {
            try
            {
                //Преобразование string в массив char
                char *Text = SystemStringToChar(txt);
                serial = new SerialRSA(Text, length); //error C2065: 'serial' : undeclared identifier
 
                //Вывод сгенерированных ключей
                txtOpenKey->Text = String::Format("{0}, {1}", serial->getE(), serial->getN()); //left of '->getN' must point to class/struct/union/generic type 
                txtCloseKey->Text = String::Format("{0}, {1}", serial->getD(), serial->getN());
            }
            catch (Exception ^ex)
            {
                MessageBox::Show(ex->ToString(), "Отладочная информация", MessageBoxButtons::OK, MessageBoxIcon::Error);
            }
        }
        else
        {
            MessageBox::Show(String::Format("Длина текста для шифрования превышает максимально допустимый размер (%1 символов)", MAX), 
                "Алгоритм RSA", MessageBoxButtons::OK, MessageBoxIcon::Error);
        }
    }
    else
    {
        MessageBox::Show("Не найден текст для шифрования", "Алгоритм RSA",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
}
Что я делаю не так? Почему экземпляр serial не определяется?
Заранее благодарю за любую помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2015, 15:26
Ответы с готовыми решениями:

Использование собственного класса в Windows Forms
Здравствуйте, есть такая проблема, никак не могу понять как в Winwows Forms использовать свой класс. Есть у меня класс class.cpp, form1.h,...

Использование собственного класса в Виндовс Формс
Надо сделать программу на Windows Forms. По сути ето типа база данных транспортных средств должа быть, правда без использования баз данных...

Использование Boost в Windows Forms
Здравствуйте, возникла необходимость использовать библиотеки boost в windows forms. Скачал, подключил, в консоли работают. В формах...

2
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
15.12.2015, 15:44
C++
1
2
3
4
5
6
7
SerialRSA::SerialRSA(char* _Text, int lenght):MAX(lenght)
{
   Text=new char[lenght+1]; // Память ОБЯЗАТЕЛЬНО выделяем
   strcpy(Text,_Text);  // Данные ОБЯЗАТЕЛЬНО копируем
   GenerateKey();
}
SerialRSA::~SerialRSA(){delete[] Text;}// деструктор
Цитата Сообщение от Annushkash Посмотреть сообщение
private: SerialRSA *serial; //error C2143: syntax error : missing ';' before '*'
Удаляем это файл совсем.
А в MyForm.cpp добавляем
C++
1
SerialRSA *serial;
0
0 / 0 / 1
Регистрация: 15.12.2015
Сообщений: 19
16.12.2015, 11:15  [ТС]
Спасибо, все заработало! Почистила класс, удалила ненужные массивы).

И еще можно вопрос не по теме:
облазила несколько форумов и многие из тех, кто решал задачу шифрования RSA сталкивались с проблемой кодирования-декодирования ANSII. Я пробовала решить проблему так, как там описано, но у меня не получается. В результате в txtbox выводится -20-32 (при шифровании "ма").

Вот код:
MyForm.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
void CryptRSA::MyForm::btnCrypt_Click(System::Object^ sender, System::EventArgs^ e)
{
    if (!String::IsNullOrWhiteSpace(txtCrypt->Text))
    {
        String^ txt = txtCrypt->Text;
        int length = txt->Length;
        if (length <= MAX)
        {
            try
            {
                //Преобразование string в массив char
                unsigned char *Text = SystemStringToChar(txt);
                serial = new SerialRSA();
 
                //Вывод сгенерированных ключей
                txtOpenKey->Text = String::Format("{0}, {1}", serial->getE(), serial->getN());
                txtCloseKey->Text = String::Format("{0}, {1}", serial->getD(), serial->getN());
 
                //Вывод зашифрованного текста
                unsigned int *cryptoCode = serial->Crypt(Text, length);
                                //Попытка удаления массива Text приводит к ошибке _BLOCK_TYPE_IS_VALID
                String^ outStr;
                for (int i = 0; i < length; i++)
                    outStr = String::Format(outStr+"{0} ", cryptoCode[i]);
                txtEncrypt->Text = outStr;
                stripLbl->Text="Текст зашифрован";
            }
            catch (Exception ^ex)
            {
                MessageBox::Show(ex->ToString(), "Отладочная информация", MessageBoxButtons::OK, MessageBoxIcon::Error);
            }
        }
        else
        {
            MessageBox::Show(String::Format("Длина текста для шифрования превышает максимально допустимый размер ({0} символов)", MAX), 
                "Алгоритм RSA", MessageBoxButtons::OK, MessageBoxIcon::Error);
        }
    }
    else
    {
        MessageBox::Show("Не найден текст для шифрования", "Алгоритм RSA",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
}
 
void CryptRSA::MyForm::btnEncrypt_Click(System::Object^ sender, System::EventArgs^ e)
{
    if (!String::IsNullOrWhiteSpace(txtEncrypt->Text))
    {
        try
        {
            String^ code = txtEncrypt->Text;
            int length = 0;
            unsigned int* arrayCode = StringToInt(" \n", code, length);
            
            char *Text = serial->Encrypt(arrayCode, length);
            String^ outStr;
            for (int i = 0; i < length; i++)
                outStr = String::Format(outStr+"{0}", Text[i]);
            txtCrypt->Text = outStr;
            stripLbl->Text="Текст дешифрован";
        }
        catch (Exception ^ex)
        {
            MessageBox::Show(ex->ToString(), "Отладочная информация", MessageBoxButtons::OK, MessageBoxIcon::Error);
        }
    }
    else
    {
        MessageBox::Show("Не найден текст для дешифрования", "Алгоритм RSA",
            MessageBoxButtons::OK, MessageBoxIcon::Error);
    }
}
RSA.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
unsigned int* SerialRSA::Crypt(unsigned char* Text, int lenght)
{
    //Массив для хранения шифротекста.
    unsigned int *CryptoText = new unsigned int [lenght];
 
    //Получение из введённых данных десятичного кода ASCII и
    //дальнейшее его преобразование по формуле ci = (mj^e)%n.
    int c;
    for (int j = 0; j < lenght; j++)
    {
        c = 1;
        unsigned int i = 0;
        int ASCIIcode = (static_cast<int>(Text[j]));
        while (i<e)
        {
            c = c*ASCIIcode;
            c = c%n;
            i++;
        }
        CryptoText[j] = c;
    }
    return CryptoText;
}
 
char* SerialRSA::Encrypt(unsigned int* Code, int lenght)
{
    //Массив для хранения шифротекста.
    char* Tdecrypt = new char[lenght];
 
    //Расшифровка полученного кода по формуле mi = (ci^d)%n и перевод его в десятичный код ASCII.
    int m;
    for (int j = 0; j < lenght; j++)
    {
        m = 1;
        unsigned int i = 0;
        while (i<d)
        {
            m = m*Code[j];
            m = m%n;
            i++;
        }
        Tdecrypt[j] = static_cast<char>(m);
    }
    return Tdecrypt;
}
И заодно: как я поняла, динамические массивы нужно удалять сразу после использования (к примеру, массив Text), а у меня ошибка почему-то...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.12.2015, 11:15
Помогаю со студенческими работами здесь

Использование WinINet в Windows Forms
Возможно использовать WinInet в Windows Form или нет. Если возможно то пожалуйста подскажите как.

Использование string в Windows Forms Application
Я уже достаточно давно и вроде бы неплохо программирую на Turbo Delphi и решил перейти на Visual C++, но столкнулся с такими проблемами,...

Использование std::string в проектах Windows Forms
Вот кусок из кода с участием переменной string. Всё необходимое для работы с ней подключено: #include &lt;iostream&gt; #include...

Чтение переменных класса из файла в Windows Forms
Здравствуйте. Столкнулся с такой проблемой. Пользователь в моей программе должен выбрать файл, из которого будет произведено чтение...

Array из собственного класса
Здравствуйте. Описал классы нота и массив нот: #pragma once #include &lt;stdlib.h&gt; using namespace System; ref class Note { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru