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

 
AnsiString и char, неувязка какая-то?, никак не пойму. во всех компонентах возвращается ансистринг, а при поп
Guest
Отправлено: 09.07.2006, 19:36


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







никак не пойму. во всех компонентах возвращается ансистринг, а при попытке записать результат в текстовый файл требует чар! они как-то приводятся друг к другу? уже голову сломал! помогите, пожалуйста! мыло zeipt@yandex.ru заранее благодарю!!!
Konstantine
Отправлено: 09.07.2006, 22:08


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

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



чар в ансистринг:
CODE
char *chr="sbldbfldjb";
AnsiString str(chr);

ансистринг в чар:
CODE
AnsiString str="kdfgblkfnl";
char *chr=str.c_str();
BreakPointMAN
Отправлено: 10.07.2006, 00:54


Станционный диспетчер

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



AnsiString в char*, имхо, лучше так переводить:

CODE

AnsiString str="qwerty";
char *chr=new char[str.Length()+1];
strcpy(chr,str.c_str());
// ...
delete []chr;
olegenty
Отправлено: 10.07.2006, 08:52


Ветеран

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



смотря зачем переводить. если не для хранения, то strcpy не надо.
Shagg
Отправлено: 10.07.2006, 15:19


Дежурный стрелочник

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



еще вопрос (не хотелось из-за этого новый топик открывать smile.gif ):
почему следующий код
CODE

 Memo1->Lines->Clear();
 for (int i=1; i<=Edit1->Text.Length(); i++)
   Memo1->Lines->Add((int)Edit1->Text[i]);

для символов с кодом больше 126 возвращает отрицательные числа???
Guest
Отправлено: 10.07.2006, 15:49


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







Первое: с кодом больше 127
Второе: посмотрите инфу по char, int и их знаковых/беззнаковых вариациях.
Boyko
Отправлено: 10.07.2006, 15:52


Станционный диспетчер

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



Потому что ты так написал!

int значит signed int

Так надо написать

... (unsigned) Edit1->Text[i]
Grigoriy
Отправлено: 10.07.2006, 16:03


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

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



CODE

Memo1->Lines->Clear();
for (int i=1; i<=Edit1->Text.Length(); i++)
Memo1->Lines->Add((unsigned char)Edit1->Text[i]);


При представлении отрицательного числа — отрицательное число в ячейке памяти — это последовательность битов, в которой самый старший бит равен 1.
При представлении натурального числа — значение может быть только равным или больше 0 при любых значениях битов.

Модуль отрицательного числа, хранящегося в ячейке памяти размером N бит, равен разности числа равного (2 в степени N) и исходного отрицательного числа.

Действительно. Давайте представим, допустим, число -1 так

11111111

а число 1 так

00000001

Сделаем операцию суммирования и убедимся, что действительно -1+1=0

11111111
+
00000001
____________
100000000

Получили 9-значное число, у которого только самый старший (8) бит равен 1. Но в микропроцессоре привыполнении арифметических операций над 8-битными операндами (регистр...регистр, регистр...ячейка памяти, регистр...непосредственный операнд, ячейка памяти...непосредственный операнд) старший бит (8) (нумерация битов с нуля) не сохраняется в операнде-результате, а переносится во флаг CF — нулевой бит регистра флагов. Значит результат действительно будет нулевым.

Пример 2 (-2+1=-1)

11111110
+
00000001
____________
11111111

(Модуль 11111110) = 100000000 — 11111110 = 2.

Если бы складывались числа 254 и 1 результат был бы тот же 255 и столбик записывался точно так же.

В виде одной и той же последовательности битов можно представить как отрицательное число так и положительное.

Как не странно, процессору "все равно", как подразумевается последовательность битов в операнде — как целое число или как натуральное.

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

Отредактировано Grigoriy — 10/07/2006, 16:05

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