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

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


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

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 88
от 13.04.2005, 06:30

Администратор:Калашников О.А.
В номере:Вопросов: 3, Ответов: 12


Вопрос № 19347: Здравствуйте эксперты. Пытаюсь объекту CString присвоить длинную строку. CString str; str="длинная строка >255 символов"; в результате присваивается только часть строки. Какую еще надо выполнить инициализацию объекта ...
Вопрос № 19358: Никак не могу подружиться с ссылками и с возвращаемыми значениями ф-ций =( -почему функция, которая возвращает параметр как значение должна сначала сделать копию его а потом возвратить? -почему при возврате значения как ссылки копия не делает...
Вопрос № 19368: Доброе время суток. Есть микроконтроллер, есть ЖК индикатор... Все вроде бы ничего, но не могу сообразить, как нарисовать круг. Точку, линию, текст - нормально, а вот с расчетом окружности запутался, может подскажите какой-нибудь алгоритм рас...

Вопрос № 19347
Здравствуйте эксперты.
Пытаюсь объекту CString присвоить длинную строку.
CString str;
str="длинная строка >255 символов";
в результате присваивается только часть строки.
Какую еще надо выполнить инициализацию объекта str,
чтобы он понимал строки большой длины
с уважением Ильдар
ildar_trvl@rambler.ru
Отправлен: 07.04.2005, 11:17
Вопрос задал: ildar (статус: Посетитель)
Всего ответов отправлено: 4

Отвечает: DSota
Здравствуйте, ildar!
Установить длину строки можно:
CString str;
LPTSTR pstr = str.GetBufferSetLength(Нужный_новый_размер_буфера_строки_в_символах);
Ответ отправил: DSota (статус: Студент)
Отправлен: 07.04.2005, 11:53

Отвечает: vitya
Здравствуйте, ildar!
Таких проблем не должно возникать.
Ответ отправил: vitya (статус: Профессор)
Отправлен: 07.04.2005, 12:14

Отвечает: Malish
Здравствуйте, ildar!
Попробуй через указатель. Вроде проблем не должно быть.
Ответ отправил: Malish (статус: 8-ой класс)
Отправлен: 07.04.2005, 20:48

Отвечает: Raptor1
Здравствуйте, ildar!
Да все нормально присваивается, например так,
просто ты наверное строку в отладчике смотришь, а он действительно показывает
только первые 255 символов
CString strTemp="11111111112222222222333333333344444444445555555555666666666677777777777888888888899999999990000000000111111111122222222223333333333444444444455555555556666666666777777777778888888888999999999900000000001111111111222222222233333333334444444444555555555566666666667777777777788888888889999999999000000000011111111112222222222333333333344444444445555555555666666666677777777777888888888899999999990000000000 End";
AfxMessageBox(strTemp);
Ответ отправил: Raptor1 (статус: 2-ой класс)
Отправлен: 08.04.2005, 23:17


Вопрос № 19358
Никак не могу подружиться с ссылками и с возвращаемыми значениями ф-ций =(
-почему функция, которая возвращает параметр как значение должна сначала сделать копию его а потом возвратить?
-почему при возврате значения как ссылки копия не делается? и делается ли что-то вообще? (по идее должна делать копия переменной представляющей ссылку)
-допустим у нас есть класс с открытыми методами достуап и закрытыми членами-переменними, делаются ли функциями-членами, которые возвращают значение переменных-членов, копии переменных(обьектов)-членов перед тем как их возвратить как значения?
вобщем я немного запутался и прошу не судить меня строго, я толька начинаю изучать с++!
Отправлен: 07.04.2005, 14:32
Вопрос задал: ohitmano (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: dentist
Здравствуйте, ohitmano!
не... погоди... тебе для начала нужно отделить друг от друга понятия параметр и возвр.значение.
1.
значит так:
параметры функции могут передоваться по значению (т.е. функция работает со сзначением параметра)
и по ссылке (ссылку на переменную), т.е. фактически функция получает возможность изменять значения переменных, ей не принадлежащих.
пример1:
int foo(int * a) { return ++(*a); }; // или ++*a, без разницы
void main()
{
int a = 100;
foo(&a); // теперь значение переменной a = 101
}
пример2:
int foo(int a) { return ++a; };
void main()
{
int a = 100;
int b = foo(a); // значение переменной b = 101, a = 100
}
2.
если говорить о возвращении функцией ссылки то нужно понимать, что переменная внутри функции, пренадлежит и существует, только внутри этой самой функции.
здесь функция всётаки вернёт некий адрес, но этой переменной после выхода из функции уже не будет существовать. этот момент можно обойти объявив статическую переменную:
int * foo()
{
static int a = 100;
return &a;
}
т.е. со статическим элементом это прокатит.
а если нужно, чтоб вункция возвращала адрес вновь созданной переменной то так:
int * foo()
{
int * a = (int*) malloc(sizeof(int)); // выделим память
return a;
}
но в этом случае нужно не забыть освободить память от ненужных данных
void main()
{
int * a = foo();
// чего-то с ней делаем
// и когда она нам более не нужна:
free(a);
}
надеюсь доступно объяснил.
удачи!
Ответ отправил: dentist (статус: 1-ый класс)
Отправлен: 07.04.2005, 16:14
Оценка за ответ: 2
Комментарий оценки:
Вобщем то те примеры, котрые привёл уважаемый dentist показывают механизм работы указателей, а не ссылок! И по моему мнению не адн ответ ни на один вопрос.

Отвечает: Федин А.В.
Здравствуйте, ohitmano!
Ссылка - второе имя переменной. Т.е. под нее не виделяется ни каких ресурсов. Все операции проводимые над ссылкой производяться напрямую над переменной (это происходит на уровне компилятора, до генерации кода).
При вызове ф-ции параметры ей могут передоваться двумя способами:
1. Как адрес переменной (передача по ссылке),
2. Как копия переменной (передача по значению).
В первом случае все операции, произведенные над переменной, сохроняться после выхода из ф-ции.Во втором случае после выхода из ф-ции значение переменной не измениться.
Если что-то не понятно пиши на мыло xaliavka@mail.ru или аська: 282926739
Ответ отправил: Федин А.В. (статус: 2-ой класс)
Отправлен: 08.04.2005, 16:22

Отвечает: Raptor1
Здравствуйте, ohitmano!
Кажется будет проще показать на паре примеров. При возврате значения как ссылки делается временная переменная-ссылка на возвращаемое значение

Приложение:

Ответ отправил: Raptor1 (статус: 2-ой класс)
Отправлен: 08.04.2005, 23:16
Оценка за ответ: 5
Комментарий оценки:
Вот это то что я хотел получить в ответ!
Тлько не понял строчку: m_objMain.GetData()=10;(совсем не понял! типа функция возвратит ссылку а потом ссылке присвоится значение?)


Вопрос № 19368
Доброе время суток.
Есть микроконтроллер, есть ЖК индикатор...
Все вроде бы ничего, но не могу сообразить, как нарисовать круг. Точку, линию, текст - нормально, а вот с расчетом окружности запутался, может подскажите какой-нибудь алгоритм расчета???
Буду рад любой мысли или исходнику!!!
СПАСИБО.
Отправлен: 07.04.2005, 20:18
Вопрос задал: AlexMad (статус: Посетитель)
Всего ответов отправлено: 5

Отвечает: Malish
Здравствуйте, AlexMad!
Я понимаю ты можешь строить только по точка (координатам)! Усли не только то надо указывать, потому что есть встроенные функции для построения окружности!!! Они описаны в сотни справочниках по С++.
А по точкам можно! Цикл от -180 до 180 и в цикле функция sin(i)=cos(i) так рисуется круг.
У меня так получилось.
Ответ отправил: Malish (статус: 8-ой класс)
Отправлен: 07.04.2005, 21:47

Отвечает: DSota
Здравствуйте, AlexMad!
Все зависит от возможностей микроконтроллера... В общем случае можно использовать Алгоритм Брезенхема... И оптимизировать его под свою ЖКИ (особенно если он монохромный)...

Приложение:

Ответ отправил: DSota (статус: Студент)
Отправлен: 08.04.2005, 10:26

Отвечает: Voituk Alexander
Здравствуйте, AlexMad!
Предыдущий конечно классный алгоритм, но похоже товарищ не знает что такое микроконтроллер. Ты свои синусы и косинусы будешь сутки считать.
Есть замечательный алгоритм Брезенхама.
Даю в приложении.

Приложение:

Ответ отправил: Voituk Alexander (статус: 6-ой класс)
Отправлен: 08.04.2005, 12:43

Отвечает: Raptor1
Здравствуйте, AlexMad!
Однажды препод усомнился в профессионализме нашей группы (математиков) в области программирования и пообещал зачет по лабе тому кто придумает алгоритм рисования окружности без операций деления извлечения корня и тригонометрических функций. Лаба была сдана нахаляву (причем предмет назывался баллистика и к прграммированию никакого отношения не имел) усилиями меня и еще одного товарища вот собственно алгоритм который был придуман за 40 минут практически с нуля (и без компьютера), я думаю вследствие его краткости комментарии излишни.

Приложение:

Ответ отправил: Raptor1 (статус: 2-ой класс)
Отправлен: 08.04.2005, 23:15

Отвечает: Bob Johnson
Здравствуйте, AlexMad!
Окружность можно нарисовать несколькими способами. Самый простой - это исходя из формулы
x = r*cos (a)
y = r*sin (a)
где r - радиус, а - угол, изменяющийся в пределах от 0 до 2 пи. Но этот способ вряд ли тебе подойдет, потому что вычисление синуса и косинуса весьма трудоемки, особенно на микроконтроллере. Кроме того, надо подбирать шаг а таким, чтобы окружность не имела дырок, но в то же время каждая точка не закрашивалась повторно (для экономии производительности).
другой алгоритм основан на том, что формула окружности: x*x + y*y = r*r. т.е. можно вычислить одну координату исходя из другой: y = sqrt (r*r - x*x). этот метод значительно быстрее предыдущего, но вычисление квадратного корня и возведение в квадрат тоже трудоемкие операции.
И, наконец, самый быстрый метод. Он основан на все той же формуле х*х + у*у = r*r. В начале берется точка x = r и y = 0. Она отрисовывается и координаты х и у изменяются так, чтобы получились координаты следующей точки. Вопрос в том, как определить закон изменения координат без использования квадратного корня и умножения. Для этого вернемся к исходной формуле. Если х*х + у*у меньше r*r, то точка лежит внутри окружности, если больше - вне ее, а если равно, то точно на границе. Исходя из этого и того, что экран у нас пиксельный (т.е. дискретный), можно описать закон изменения координат так: на каждом шаге мы увеличиваем у на 1 (исходными значениями у нас были х = r и у = 0), высчитываем x*x + y*y и если оно стало больше r*r, то уменьшаем на 1 х.
Такой подход позволит отрисовать не более 1/8 окружности, т.к. в дальнейшем х нужно будет уменьшать больше чем на 1 точку, а наш алгоритм этого не позволяет. Но недостающие 7/8 окружности можно дополнить за счет ее симметричности, так что это не будет проблемой. Алгоритм стал проще - на каждую точку теперь надо вычислить только 2 операции умножения. Но он еще не предельно прост! Учитывая, что х и у у нас изменяются только по 1 точк е, можно вообще избавиться от операции умножения: (y + 1)*(y + 1) = y*y + 2*y + 1, а (х - 1)*(х - 1) = х*х - 2*х + 1. Т.е. в начале можно запомнить значение y*y и x*x, а затем изменять их в соответствии с этими формулами (умножение на 2 осуществляется простым двоичным сдвигом влево, поэтому можно считать, что умножать ничего не надо).
Но и это еще не все! у нас остается одна операция умножения в начале, чтобы получить r*r! На первый взгляд, от нее невозможно избавиться... но это совсем не так :) r*r нам нужно только для сравнения с суммой квадратов текущих координат, поэтому ее можно просто приравнять к нулю (не забыв при этом, начальное значение х*х тоже нужно приравнять к 0). Итак, получаем следующий алгоритм:
x = r
y = 0
d = 0 - это сумма квадратов
loop
set pixel (х, у)
d = d + 2*y + 1
у = у + 1
if (d > 0)
{
d = d - 2*x + 1
x = x - 1
}
until (y < x)
программа в приложении (начальное значение d = -r выбрано для того, чтобы окруж ность получилась более правильно формы)

* EMan2.0: ---===*** Debug mode ***===---

Приложение:

Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 09.04.2005, 22:54


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.


http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться

В избранное