Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2010, 20:49   #1
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию При удалении потока Invalid Pointer Operation

Здравствуйте, написал программу для шифрования. Все работает хорошо, но при разрушении потоков появляется ошибка Invalid Pointer Operation. Как ее избавиться?

Код:
#include <vcl.h>
#pragma hdrstop
#include "Main.h"
#pragma package(smart_init)
#pragma resource "*.dfm"

TBox *Box;

unsigned char S[256];
unsigned int i, j;

void rc4_init(unsigned char *key, unsigned int key_length) {
    for (i = 0; i < 255; i++)
        S[i] = i;

    for (i = j = 0; i < 255; i++) {
         unsigned char temp;

        j = (j + key[i % key_length] + S[i]) % 255;
        temp = S[i];
        S[i] = S[j];
        S[j] = temp;
    }

    i = j = 0;
}

 unsigned char rc4_output() {
     unsigned char temp;

    i = (i + 1) % 255;
    j = (j + S[i]) % 255;

    temp = S[j];
    S[j] = S[i];
    S[i] = temp;

    return S[(temp + S[j]) % 255];
}

__fastcall TBox::TBox(TComponent* Owner)
        : TForm(Owner)
{
}

void __fastcall TBox::OButton1Click(TObject *Sender)
{
        if (OpenDialog1->Execute())
                Edit1->Text = OpenDialog1->FileName;
}

void __fastcall TBox::OButton2Click(TObject *Sender)
{
        if (OpenDialog1->Execute())
                Edit4->Text = OpenDialog1->FileName;        
}

void __fastcall TBox::SButton2Click(TObject *Sender)
{
        if (SaveDialog1->Execute())
                Edit5->Text = SaveDialog1->FileName;
}

void __fastcall TBox::SButton1Click(TObject *Sender)
{
        if (SaveDialog1->Execute())
                Edit2->Text = SaveDialog1->FileName;
}
void __fastcall TBox::RC4ButtonClick(TObject *Sender)
{
TFileStream *stream, *outstream;
unsigned char *c;
unsigned char *key;
int size;
AnsiString str;
c= new unsigned char [256];
for (int y = 0; y < strlen((unsigned unsigned char*)c); y++)
        c[y]=0;
stream = new TFileStream(Edit1->Text,fmOpenRead|fmShareDenyWrite);
outstream=new TFileStream(Edit2->Text,fmCreate|fmOpenWrite);
key=Edit3->Text.c_str();
rc4_init(key, strlen((unsigned char*)key));
size=stream->Size;

while(size>=0)
{
        if (size<256)
        {
                char b;
                while(stream->Read(&b,1))
                {
                        b^=rc4_output();
                        outstream->Write(&b,1);
                }
        }
        else
        {
                char b;
                while(stream->Read(&b,1))
                {
                        b^=rc4_output();
                        outstream->Write(&b,1);
                }
        }
        stream->Free();
        outstream->Free();
}
}
//---------------------------------------------------------------------------
RIO вне форума Ответить с цитированием
Старый 20.06.2010, 20:55   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а разве delete stream не катит в билдере?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 21:00   #3
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Катит Но при нем тоже самое
RIO вне форума Ответить с цитированием
Старый 20.06.2010, 21:06   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

стоп, верно, у вас же цикл, и сколько раз в цикле вы делаете Free потокам?

+внешний цикл вечный.

ЗЫ: кстати, вы не в Делфи, обьявлять переменные можно по месту использования, а не сверху

ЗЗЫ:
Код:
 if (size<256)
а какая разница в ветках условия?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 20.06.2010 в 21:11.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 21:17   #5
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Все работает Спасибо Да на самом деле понаписывал ерунды, сейчас буду исправлять эти недочеты

Последний раз редактировалось RIO; 20.06.2010 в 21:31.
RIO вне форума Ответить с цитированием
Старый 20.06.2010, 21:27   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
while(size>=0)
{
        if (size<256)
        {
                char b;
                while(stream->Read(&b,1))
                {
                        b^=rc4_output();
                        outstream->Write(&b,1);
                }
        }
        else
        {
                char b;
                while(stream->Read(&b,1))
                {
                        b^=rc4_output();
                        outstream->Write(&b,1);
                }
        }
}
        stream->Free();
        outstream->Free();
а если так?(кстати надо чтоб size менялся, а то цикл вечный, может изза этого чтото и глючит?)

http://cplusplus.com/doc/tutorial/exceptions/ почитайте
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 20.06.2010 в 21:29.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.06.2010, 21:40   #7
RIO
Форумчанин
 
Аватар для RIO
 
Регистрация: 15.12.2007
Сообщений: 422
По умолчанию

Мы написали одновременно сообщения наверное Опять говорю Вам - огромное спасибо А насчет ссылки, уже читаю
RIO вне форума Ответить с цитированием
Старый 20.06.2010, 21:49   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да, вы исправили, а я написал, вот так и вышло
ЗЫ, сайт полезный, но в принципе если в билдере вы, то вам не все интерестно оттуда будет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Invalid pointer operation. KoBRaAndrey Общие вопросы Delphi 6 02.06.2010 17:32
Invalid pointer operation и потоки zotox Помощь студентам 4 30.10.2009 14:38
Invalid Pointer Operation csander Общие вопросы Delphi 0 21.10.2009 17:44
Invalid Pointer Operation Unconnected Общие вопросы Delphi 3 21.02.2009 20:23
Invalid pointer operation Димарик Общие вопросы Delphi 2 05.11.2007 09:53