powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чего не нравится программе?
11 сообщений из 11, страница 1 из 1
Чего не нравится программе?
    #33442684
Prizzrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void Test_Func(TOraQuery* P_OraQuery, PChar P_Name, PChar P_Opis)
{
        String full;
        char *a, *b, *c;
        P_OraQuery->SQL->Add("select * from dual");
        a = P_Name;
        b = P_Opis;
        c = strcat(a, b);
        full = AnsiString(c);
        ShowMessage(full);
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        String a, b;
        a = Edit1->Text;
        b = Edit2->Text;
        Test_Func(OraQuery1, a.c_str(), b.c_str());
}
При выполнении TForm1::Button1Click возникает ошибка:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------

Чего я сделал ни так? В чем ошибка?
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33442736
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот и смотри в отладчике
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33442802
Prizzrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего смотреть-то? Ошибка возникает где-то после или непосредственно или вовремя выхода из TForm1::Button1Click. Чего смотреть и главное где?
Я в С++ Builder мало что понимаю, так что мне врядли поможет отладчик в данном случае. Я вообще PLSQL-разработчик, немного знающий Delphi. В Delphi про аналогичной процедуре и аналогичном вызове, ошибок не возникает. Значит это какая-то специфическая особенность C++ Builder.
Я был бы признателен, если бы вы указали бы на мою ошибку или хотябы предположили в чем тут может быть дело.
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33442907
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Prizzrak
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Test_Func(TOraQuery* P_OraQuery, PChar P_Name, PChar P_Opis)
{
..............
        c = strcat(a, b);
.................
}



Переполение строки.
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33442931
Prizzrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lelikk Prizzrak
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void Test_Func(TOraQuery* P_OraQuery, PChar P_Name, PChar P_Opis)
{
..............
        c = strcat(a, b);
.................
}



Переполение строки.

Как бороться? Знаю что есть что-то простое и очевидное, но не знаю что.
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33442971
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй так, вместо строк:

Код: plaintext
1.
c = strcat(a, b);
full = AnsiString(c);
написать
Код: plaintext
1.
2.
3.
char Buf[ 1000 ]; // Размер должен быть более чем длина строка а + длина строки b + 1
strcpy(Buf, a);
strcat(Buf, b);
full = AnsiString(Buf);
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33443562
Prizzrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если размер a и размер b не известны зарание. Может они будут в сумме больше тысячи? Опять будет переполнение. Что делать в таком случае?
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33443671
BlackStar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PrizzrakА если размер a и размер b не известны зарание. Может они будут в сумме больше тысячи? Опять будет переполнение. Что делать в таком случае?

динамически выделять память под необходимый объем.

а вообще что мешает переписать так, коли уж вы String используете?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void Test_Func(TOraQuery* P_OraQuery, PChar P_Name, PChar P_Opis)
{
        String full;
        String a(P_Name);
        a += P_Opis;
        P_OraQuery->SQL->Add("select * from dual");
        full = AnsiString(a);
        ShowMessage(full);
}
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33445245
redex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нежелательно работать с char *, не выделив предварительно память.
Можно сделать так:
char *a, *b, *c;
a = (char *)malloc(strlen(P_Name));
//обработка,если a=NULL
b = (char *)malloc(strlen(P_Opis));
//обработка,если b=NULL
c = (char *)malloc(strlen(a)+strlen(b));
strcpy(c,a);
strcat(c,b);
full = AnsiString(c);
ShowMessage(full);
free(c);
free(b);
free(a);
//вместо strlen - функия, определяющая длину PChar, т.к. я точно не знаю,
//что это за тип
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33445281
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
char *a, *b, *c;
a = (char *)malloc(strlen(P_Name)+1);
//обработка,если a=NULL
b = (char *)malloc(strlen(P_Opis)+1);
//обработка,если b=NULL
c = (char *)malloc(strlen(a)+strlen(b)+1);
strcpy(c,a);
strcat(c,b);
full = AnsiString(c);
ShowMessage(full);
free(c);
free(b);
free(a);
...
Рейтинг: 0 / 0
Чего не нравится программе?
    #33445330
Prizzrak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное всем спасибо. Ваши советы помогли мне разобраться. Я в Delphi немного программирую. Там таких проблем нет. Поэтому я даже не знал с какой стороны к этому подойти. Спасибо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чего не нравится программе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]