Здравствуйте, эксперты. У меня 3 вопроса (1) Как перевести строку Ansi в Char? Пример: char str; str=Socket->ReceiveText(); Мне выдается сообщение: E2034 Cannot convert 'AnsiString' to 'char' (2) Как сменить кодировку в MEMO с WIN на DOS или KOI? (3) Как высчитать в MEMO текущее положение курсора на строке и букве?
Здравствуйте, BaXI! 1) Решение проблемы с AnsiString и Char в следующем: Char - это 1 символ, ну а стринг - это строка символов; потому нужно объявить так: char str[256]; или char *str; Это, конечно, смотря какие строки... 2) напрямую кодировку поменять нельзя (по крайней мере, я не знаю такого метода у класса TMemo. но можно сделать массивы-таблицы перекодировки, т.е. в них написать символы в том порядке, как они установлены в нужной кодировке и создать функцию, которая бы конвертировала текст из одной кодировки в другую. можно сделать компонент на базе TMemo, который бы такую фишку поддерживал.
Ответ отправлен: 12.11.2002, 10:55 Отправитель: Nick Vishnievski Отвечает Jadd
Приветствую Вас, BaXI! 1)Тип char - тип одного символа. Тебе надо использовать char*. Т.е. твой код будет таким: char *str; str = Socket->ReceiveText().c_str(); функция c_str() преобразует AnsiString строку к char* типу. 2)Надо думать 3)Memo1->CarretPos возвращает тип TPoint, что означает, что Memo1->CarretPos.x-порядковый номер символа в строке, а Memo1->CarretPos.y-порядковый номер строки Удачи Ответ отправлен: 09.11.2002, 03:22 Отправитель: Jadd
Вопрос № 351
Здравствуйте, эксперты. У меня 3 вопроса (1) Как перевести строку Ansi в Char? Пример: char str; str=Socket->ReceiveText(); Мне выдается сообщение: E2034 Cannot convert 'AnsiString' to 'char' (2) Как сменить кодировку в MEMO с WIN на DOS или KOI? (3) Как высчитать в MEMO текущее положение курсора на строке и букве?
Первое все просто - у тебя должен быть не char, а char *. Тогда скорее всего конвертация пройдет. У меня сейчас нет билдра поэтому проверить не смогу. Кодировку не знаю сможешь ли ты сменить, но ты точно сможешь сменить там шрифт - выбери KOI шрифт. Должна быть функция GetCurPos() - по-моему она называлась как-то так. (GetSelStart() - или так она называлась). Короче - смотри хелп там будет написанно. Ответ отправлен: 09.11.2002, 09:51 Отправитель: vitya
Вопрос № 352
Привет эксерты! Как обойти двоичное дерево на чистом Си без использования рекурсивной функции (какие циклы в функции рекурсивные или нерекурсивные разницы неимеет).
Добрый день, Гарик! С такой структурой, как у тебя дерево нерекурсивно обойте НЕ удастся. Если ты хочешь, чтобы был итеративный обход, то тебе нужно так же хранить указатель на предка и, насколько я понимаю, самое главное - у тебя должно быть двоичное дерево поиска - то есть, слева меньший эелемент, справа больший. struct SNode { int data; SNode* pLeft; SNode* pRight; SNode* pParent; }; С твоей структурой, можно реализовать следующий вариант: //нет указателя на parent node void traverseWidth(SNode * pRoot) { //я использую деку, так как удалять элементы буду с левого конца, а это дорогая операция для vector - а. std::deque dqNodes; dqNodes.push_back(pRoot); SNode * pT; while (dqNodes.size()) { pT = dqNodes.begin(); if (pT->pLeft) dqNodes.push_back(pT->pLeft);
if (pT->pRight) dqNodes.push_back(pT->pRight); printf("%d
", pT->data); dqNodes.pop_front(); } } Аналогично можно реализовать обход в глубину void traverseDepth(SNode * pRoot) { std::vector vecNodes; vecNodes.push_back(pRoot); SNode * pT; while (vecNodes.size() > 0) { pT = vecNodes.back(); if (pT->pLeft) { vecNodes.push_back(pT->pLeft); } else if (pT->pRight) { vecNodes.push_back(pT->pRight); } else { vecNodes.pop_back(); printf("%d
", pT->data); } } }
Ответ отправлен: 09.11.2002, 09:46 Отправитель: vitya Отвечает Yuri Gordienko
Добрый день, Гарик! Без рекурсии тут никак не обойтись, точнее можно, но это будет эмуляция той-же рекурсии, а именно - организовываешь что-то типа стека в функции и пихаешь в нее следующее значение, далее цикл и т.п. Реализовывать на примере не хочу, т.к. это полный и некрасивый бред. Ответ отправлен: 09.11.2002, 13:29 Отправитель: Yuri Gordienko Отвечает Avl2k
Приветствую Вас, Гарик! Не уверен насчет "чистоты" C, поскольку программирую на C++, но примерчик накропал. P.S. Если поместить текст в приложение, то ответ почему-то пропадает! struct tree_node { tree_node* m_parent; tree_node* m_subnodes[100]; // не более 100 ветвей int m_subnodesCount; const char* m_name; }; void init_node( tree_node* node, const char* name, tree_node* parent ) { node->m_name = name; node->m_parent = parent; node->m_subnodesCount = 0; if( parent != NULL ) parent->m_subnodes[parent->m_subnodesCount++] = node; } void print_tree( const tree_node* node ) { int path[100]; // не более 100 уровней int path_size = 0; int i = 0; for(;;) { // пытаемся спустится вниз по ветке while( i < node->m_subnodesCount ) { path[path_size++] = i; //
запоминаем номер текущей ветки node = node->m_subnodes[i]; i = 0; }
Здравствуйте эксперты. Я вот что хочу у вас спросить значит... . В приложении я привел два примера которые работают обсолютно одинаково, но в них есть одно различие, доступ к полям осуш. по разному... .Какой вариант лучше и почему..., обоснуйте свой ответ. Удачи... .
Доброе время суток, kuper! Нихрена себе одинаково!!! В первом случае возвращаешь сумму параметров функции, а во втором сумму переменных объекта класса, - две огромнейшие разницы!!!!!!!! Ответ отправлен: 09.11.2002, 13:33 Отправитель: Yuri Gordienko Отвечает Dzik
Доброе время суток, kuper! Мне кажется второй пример хуже. Т.к при его вызове приходится вызывать еще два метода, а это немного, но долше.
Ответ отправлен: 09.11.2002, 09:50 Отправитель: Dzik Отвечает Sensey
Приветствую Вас, kuper! Первый естественно быстрее, но 2 универсальнее. Во в тором случае ты можешь спокойно поменять имена полей, не переписывая методов... Также во втором случае ты например можешь поставить мониторинг на обращение к переменным Х и У
А вообще внутри методов класса вполне возможно использование имен...
Ответ отправлен: 10.11.2002, 10:48 Отправитель: Sensey Отвечает Avl2k
Доброе время суток, kuper! Если имеется ввиду, что надо сравнить доступ к члену через функцию и "напрямую", то могу ответить следующее: 1. В функциях-членах принято осуществлять доступ "напрямую" в целях оптимизации. Хотя практически все современные компиляторы сами достаточно "умные" и могут раскрутить вызов функции самостоятельно. 2. В функциях, внешних по отношению к классу, принято осуществлять доступ через функции-члены в целях улучшения стиля и надежности программы. В том смысле, что если реализация функции изменится, места с "прямым" доступом про это не узнают. Ответ отправлен: 10.11.2002, 17:43 Отправитель: Avl2k Отвечает baldr
Приветствую Вас, kuper! Собственно, второй вариант - это уже излишнее стремление к абстракции... :( Конечно, первый лучше! И вот почему: 1) При вызове функции тратятся машинные такты на собственно вызов. А учитывая еще и сами твои функции, которые просто возвращают значение, лучше сделать их inline... 2) Внутри класса нет смысла вызывать интерфейсные функции этого же класса (а зачастую даже и дружественных классов!), если можно достаточно легко выполнить те же действия напрямую. Другое дело, если у тебя функция выполняет какие-то сложные расчеты, тогда имеет смысл просто вызвать ее, чем выполнять их же, усложняя процедуру...
Ответ отправлен: 09.11.2002, 23:53 Отправитель: baldr Отвечает vitya
Приветствую Вас, kuper! Во первых в коде много ошибок: 1. return - первая буква R. 2. скорее всего функция add не должна вообще принимать параметров. 3. во втором случае у тебя нет функции out_x() в коде (как и в первом случае, но там нету вызова). 4. Нет инициализации переменных x и z. To есть там будет мусор, при том всегда, так как у тебя нет set методов для этих переменных. :) 5. нет закрывающих скобок у объявлений классов. 6. Я переписал код: class X { int x; int y; public: X(const int i, const j) : x(i), y(j) {} int getX() {return x;} int getY() {return y;} int add() {return x + y;} }; class X { int x; int y; public: X(const int i, const j) : x(i), y(j) {} int getX() {return x;} int getY() {return y;} int add() {return getX() + getY();} }; 7. Кроме того я
бы советовал у всех трех функций поставить модификатор const. В отсутствии оптимизатора первый вариант, конечно, предпочтительней, так как во втором случае происходит два дополнительных вызова функции. Если эта функция add будет вызываться очень часто, что накладные расходы выростут. Однако же, современные компиляторы с оптимизатором (MSVC в особенности) сделают во первых все три функции inline - то есть вызовов функций не будет вообще.
Ответ отправлен: 09.11.2002, 09:18 Отправитель: vitya
Форма отправки вопроса
Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook"
и "Microsoft Outlook Express". В программе The Bat!
подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте,
что в некоторых браузерах могут стоять запреты на открытие других
окон, а также "чрезмерное" кэширование данных,
при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet
Explorer 5.0+ или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.