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 |
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); |
3) теги кода — [CОDE]и[/CОDE]... а внутри них — сам код программы (кстати копировать отсюда не рекомендую, т.к. буквы О — русские, а должны быть англ.)
P.S.: о такой скуки на работе в такое время и не столько написАть можно
|
|
Guest |
Отправлено: 05.02.2005, 10:38 |
|
Не зарегистрирован
|
CODE | Попробовал при инициализации буфера выделить память
так: char *buffer1 = " "; Сработало!
|
таким образом вы выделили под буфер 1 байт (под 1 символ типа char)
Вся ваша строка влезет в 1 байт ???
Если нет — если она будет больше 1 байта — то она расположится
на памяти, занимаемой другими переменными, на коде программы
и т.д. что будет приводить к "непонятным" и разнообразным ошибкам.
Прочитайте про операторы new и delete
Прочитайте внимательно про указатели
(char *buffer1 — это указатель) и выделение памяти.
|
|