C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Необъяснимое поведение программы!!!, Спецы, посмотрите, plz. Уже заморочился!
nikolayk
Отправлено: 04.02.2005, 19:13


Ученик-кочегар

Группа: Участник
Сообщений: 19



C++Builder 6.
Простое приложение с Memo1, Memo2 на форме и кнопкой. Все лишнее я постарался убрать.
Есть буфер char *buffer1 в который из Memo1 записывается текст.
Далее в цикле (for) выполняется оператор.
В результате почему-то текст из Memo2 попадает в буфер!!!
Кто-нибудь может объяснить, почему это происходит?
Привожу текст файла Unit1.cpp.

CODE

#include <vcl.h>
#pragma hdrstop

#include "Unit1_.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char *buffer1 = "";
int i,k,j;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
{
}
//-------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
i =(Memo1->Text).Length();
buffer1 = (Memo1->Text).c_str();
for (j=0;j<i;j++)
{
Memo2->Text = (Memo2->Text);
}
}



Отредактировано Admin — 04/02/2005, 21:09
Gedeon
Отправлено: 04.02.2005, 19:42


Ветеран

Группа: Модератор
Сообщений: 1742



Возьмите свой код в тэги, иначе не все отображается.
Konstantine
Отправлено: 04.02.2005, 19:48


Мастер участка

Группа: Модератор
Сообщений: 545



ну первое — эта строка:
CODE
buffer1 = (Memo1->Text).c_str();
не копирует буфер, а здесь
CODE
for (j=0;j{
Memo2->Text = (Memo2->Text);
}
скорее всего ошибка синтаксиса
Admin
Отправлено: 04.02.2005, 19:59


Владимир

Группа: Администратор
Сообщений: 1190



CODE
char *buffer1 = "";


а где выделение памяти под строку ???
надо делать что-то типа:

CODE

i =(Memo1->Text).Length();
char *buffer1 = new char[i+1];
strcpy(buffer1,(Memo1->Text).c_str());


Отредактировано Admin — 04/02/2005, 21:06
nikolayk
Отправлено: 04.02.2005, 23:32


Ученик-кочегар

Группа: Участник
Сообщений: 19



Admin-у.
Попробовал при инициализации буфера выделить память
так: char *buffer1 = " "; Сработало!
Правильно ли я понял, что мало объявить массив символов,
нужно еще обязательно выделять под него память?
В случае AnsiString это правило тоже справедливо?

Konstantin-у.
А если под буфер выделена память, то оператор

buffer1 = (Memo1->Text).c_str();

все-равно не скопирует содержание Memo1 в буфер?
А оператор

Memo2->Text = (Memo2->Text);

остался после удаления всего, что не касалось этой проблемы.

И еще. А как взять текст исходника в теги?

Спасибо всем кто откликнулся!
Konstantine
Отправлено: 05.02.2005, 00:08


Мастер участка

Группа: Модератор
Сообщений: 545



теперь рассказую:
1) переменная buffer1 — это обычная переменная, которая указывает на начало какого-то блока данных (неизвестного размера)... теперь: в начале вы присваиваете ей адресс буфера с одним значением 0 (конец строки), а потом (в самой программе — переприсваиваете его значению адреса временного буфера, возвражённого c_str()...)
то что предложил Admin — это выделение памяти под строку символов (2-я строка кода), и собственно функция копирования буфера памяти (3-я строка кода)
2) я так и не понял что даёт
CODE
Memo2->Text = (Memo2->Text);
wink.gif
3) теги кода — [CОDE]и[/CОDE]... а внутри них — сам код программы (кстати копировать отсюда не рекомендую, т.к. буквы О — русские, а должны быть англ.)

P.S.: о такой скуки на работе в такое время и не столько написАть можно sad.gif
Guest
Отправлено: 05.02.2005, 10:38


Не зарегистрирован







CODE
Попробовал при инициализации буфера выделить память
так: char *buffer1 = " "; Сработало!


таким образом вы выделили под буфер 1 байт (под 1 символ типа char)
Вся ваша строка влезет в 1 байт ??? biggrin.gif

Если нет — если она будет больше 1 байта — то она расположится
на памяти, занимаемой другими переменными, на коде программы
и т.д. что будет приводить к "непонятным" и разнообразным ошибкам.

Прочитайте про операторы new и delete
Прочитайте внимательно про указатели
(char *buffer1 — это указатель) и выделение памяти.

Вернуться в Вопросы программирования в C++Builder