Хочешь чуда? Будь чудом!
Не нашел в нете решение этой проблемы.
В общем, калькулятор в C++ Builder.
Один Tedit и кнопки.

обработка нажатия кнопки(для добавления цифры в конец имеющейся строки):

Button1Click(){

Edit1->Text=//компонент
AnsiString(//не знаю зачем - явно преобразовываю тип, хотя он вроде автоматически определяется
StrCat(//функция strcat
Edit1->Text.c_str(),//в эту строку
"1"// записываем значение цифры на кнопке
)
);
}

Edit1->Text=AnsiString(StrCat(Edit1->Text.c_str(),"1"));
это еще раз в одну строчку, чтобы было видно

проблема такая

нажать семь раз на кнопку можно
восьмой раз выскакивает ошибка
Invalid pointer operation
хотя все вроде бы прозрачно

вот

@темы: Вопрос, C++

Комментарии
06.01.2011 в 17:18

After silence that which comes nearest to expressing the inexpressible is music.
Может просто написать так ? : Edit1->Text+= "1"; ?

зы. я C# программист, но код бы упростил как написано выше, мб и ошибка исчезнет.
06.01.2011 в 18:38

Хочешь чуда? Будь чудом!
=) спасибо)
правда Edit1->Text+= "1"; ничего не происходит
а вот так Edit1->Text=Edit1->Text+ "1";

то вроде всё нормлаьно)
спасибо)


правда в чем ошибка все равно не понятно...
06.01.2011 в 18:45

В адресе ошибка.
06.01.2011 в 20:38

Хочешь чуда? Будь чудом!
Trotil, это ты просто перевел Invalid POINTER operation?
Или ты в коде это увидел?

Да, в адресе. Но непонятно, почему 7 раз ошибки с адресом нет, а в восьмой раз есть...
06.01.2011 в 20:44

Подсказка - у тебя скорей всего 64-битная система. Угадал?
06.01.2011 в 21:17

Хочешь чуда? Будь чудом!
а вот хз
как узнать какая у меня
в смысле - где посмотреть?
06.01.2011 в 21:20

можно вообще не смотреть, забей )
06.01.2011 в 21:46

I'm not dead... yet.
Программист, который не знает, сколько битная у него система... мда...

Короче, объясняется это очень просто. Функция strcat предназначена для работы с сишными строками, которые по сути представляют из себя тупо массив из байт, под который выделено фиксированное место в памяти. Программист сам выделяет память под такую строку и сам следит за тем чтобы не вылезти за ее границы. Окончание строки определяется по нулевому символу, т.е. мы можем выделить 100 байт, а строка у нас будет "qwerty" и дальше будет идти нулевой байт. Таким образом у нас длина строки - 6 символов, для ее хранения требуется 7 символов, а максимальная емкость 100 символов. А могла бы быть 7 или 1000.

Edit1->Text в принципе представляет из себя такую же сущность (строку), но устроен по-другому: это класс со своим внутренним буфером. Для него переопределены операции сложения и т.п. Когда мы добавляем к нему символ, то этот класс сначала проверяет, не вылезем ли мы за границы выделенной под строку области и если вылезем, то выделяет под строку область увеличенного размера и копирует имеющуюся строку в новую область.

В данном же случае, с помощью метода c_str() мы получаем доступ к внутреннему буферу String и дальше делаем с ним все что хотим (дописываем байты), совершенно не имея понятия о том, каков максимальный размер этого буфера. Разумеется, рано или поздно это приводит к тому что мы вылезаем за его границы и получаем ошибку. Цифра 8 - просто совпадение.
06.01.2011 в 22:14

Хочешь чуда? Будь чудом!
Just-a-Shadow застыдил. Но за развернутый ответ большое спасибо.

Trotil, покопался по просторам интернета. ОС 32-битная...
06.01.2011 в 22:43

I'm not dead... yet.
меня зовут Хи Я надеюсь, что достаточно понятно объяснил) Просто этот вопрос меня тоже интересовал в свое время. Я, правда, не претендую на то что ответ 100% точный. Там еще дофига всяких нюансов есть, в которые я не особо вникал, как прикладной с++ кодер.
06.01.2011 в 22:47

Хочешь чуда? Будь чудом!
Just-a-Shadow , да, мне стало понятно. думаю достаточно понятно. спасибо)