Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на C / C++

Выпуск № 119
от 12.11.2002, 19:30

Администратор:
Имя: Nick.Box
URL: Информационный ресурс
ICQ: 365124
[censored], [censored]
О рассылке:
Задано вопросов: 359
Отправлено ответов: 773
Активность: 215.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Nick Vishnievski
Статус: Начальный
Общий рейтинг: 109.52
[Подробней >>]
Jadd
Статус: Профессиональный
Общий рейтинг: 142.69
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.46
[Подробней >>]
 
Yuri Gordienko
Статус: Доверительный
Общий рейтинг: 120.6
[Подробней >>]
Avl2k
Статус: Доверительный
Общий рейтинг: 124.7
[Подробней >>]
Dzik
Статус: Опытный
Общий рейтинг: 113.94
URL: Разработка игрушек
[Подробней >>]
 
Sensey
Статус: Профессиональный
Общий рейтинг: 123.2
URL: Страничка рассылки по Паскаля...
Телефон: +38 (0572) 41-76-04 дом.
[Подробней >>]
baldr
Статус: Профессиональный
Общий рейтинг: 115
URL: Сайт об ОС DOS. Всем, кто любит эту ОС!
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 350. Здравствуйте, эксперты. У меня 3 вопроса (1) Как перевести строку Ansi в Char? Пример: char str; ... (ответов: 2)
Вопрос № 351. Здравствуйте, эксперты. У меня 3 вопроса (1) Как перевести строку Ansi в Char? Пример: char str; ... (ответов: 1)
Вопрос № 352. Привет эксерты! Как обойти двоичное дерево на чистом Си без использования рекурсивной функции (каки... (ответов: 3)
Вопрос № 353. Здравствуйте эксперты. Я вот что хочу у вас спросить значит... . В приложении я привел два примера к... (ответов: 6)

Вопросов: 4, ответов: 12


 Вопрос № 350

Здравствуйте, эксперты. У меня 3 вопроса
(1) Как перевести строку Ansi в Char?
Пример:
char str;
str=Socket->ReceiveText();
Мне выдается сообщение: E2034 Cannot convert 'AnsiString' to 'char'
(2) Как сменить кодировку в MEMO с WIN на DOS или KOI?
(3) Как высчитать в MEMO текущее положение курсора на строке и букве?


Приложение:


Вопрос отправлен: 08.11.2002, 20:55
Отправитель: BaXI

[Следующий вопрос >>] [Список вопросов]

Отвечает Nick Vishnievski

Здравствуйте, 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 текущее положение курсора на строке и букве?


Приложение:


Вопрос отправлен: 08.11.2002, 20:58
Отправитель: BaXI

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, BaXI!

Первое все просто - у тебя должен быть не char, а char *.
Тогда скорее всего конвертация пройдет. У меня сейчас нет билдра поэтому проверить не смогу.
Кодировку не знаю сможешь ли ты сменить, но ты точно сможешь сменить там шрифт - выбери KOI шрифт.
Должна быть функция GetCurPos() - по-моему она называлась как-то так. (GetSelStart() - или так она называлась).
Короче - смотри хелп там будет написанно.

Ответ отправлен: 09.11.2002, 09:51
Отправитель: vitya


 Вопрос № 352

Привет эксерты!
Как обойти двоичное дерево на чистом Си без использования рекурсивной функции (какие циклы в функции рекурсивные или нерекурсивные разницы неимеет).


Приложение:


Вопрос отправлен: 09.11.2002, 03:00
Отправитель: Гарик

[Следующий вопрос >>] [Список вопросов]

Отвечает vitya

Добрый день, Гарик!
С такой структурой, как у тебя дерево нерекурсивно обойте НЕ удастся.
Если ты хочешь, чтобы был итеративный обход, то тебе нужно так же хранить указатель на предка и, насколько я понимаю, самое главное - у тебя должно быть двоичное дерево поиска - то есть, слева меньший эелемент, справа больший.
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;
}

printf( "%s ", node->m_name );
node = node->m_parent;
if( node == NULL )
break; // дошли до корня
i = ++path[--path_size]; // вспоминаем номер текущей ветки
}
}
void main()
{
tree_node root;
init_node( &root, "root", NULL );
tree_node node1, node2, node3;
init_node( &node1, "node1", &root );
init_node( &node2, "node2", &root );
init_node( &node3, "node3", &root );
tree_node node11, node12;
init_node( &node11, "node11", &node1 );
init_node( &node12, "node12", &node1 );
tree_node node31, node32, node33;
init_node( &node31, "node31", &node3 );
init_node( &node32, "node32", &node3 );
init_node( &node33, "node33", &node3 );
print_tree( &root );
}

Ответ отправлен: 11.11.2002, 16:51
Отправитель: Avl2k


 Вопрос № 353

Здравствуйте эксперты.
Я вот что хочу у вас спросить значит... .
В приложении я привел два примера которые работают обсолютно
одинаково, но в них есть одно различие, доступ к полям осуш.
по разному... .Какой вариант лучше и почему..., обоснуйте
свой ответ.
Удачи... .



Приложение:


Вопрос отправлен: 09.11.2002, 07:12
Отправитель: kuper

[Следующий вопрос >>] [Список вопросов]

Отвечает Yuri Gordienko

Доброе время суток, 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.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (42)
C / C++ (29)
Perl (9)
Delphi (14)
Pascal (21)
Basic / VBA (10)
Java / JavaScript (12)
PHP (10)
MySQL / MSSQL (8)
Пользователю
Windows 95/98/Me (29)
Windows NT/2000/XP (20)
"Железо" (27)
Поиск информации (13)
Администратору
Windows NT/2000/XP (11)
Linux / Unix (15)
Юристу
Гражданское право (9)
Семейное право (5)
Трудовое право (4)
КоАП (4)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное