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

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


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

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

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

Выпуск № 128
от 15.06.2005, 06:00

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


Вопрос № 21966: Здравствуйте уважаемые. Кто объяснит мне - как работает память при висящей dll в памяти. Почему при вызове ее функций, ее глобальные переменные не устанавливаются (вернее устанавливаются только для текущего вызова....
Вопрос № 21978: Здравствуйте Эксперты, хотелось бы узнать : как из допустим непостоянной переменной удалить первые 3 символа .. и последние 6 символов то есть : char myVar= "this is test char**"; и чтобы получилось к приверу myVar= "s...
Вопрос № 21994: Есть функции с переменным количеством параметров f1 и f2. Как из функции f1 вызвать функцию f2 с тем же списком переменных. Пример: void myPrint(char *format, ...) { printf(format, ???); // printf - известная функция, но как передать ей пере...

Вопрос № 21.966
Здравствуйте уважаемые.
Кто объяснит мне - как работает память при висящей dll в памяти. Почему при вызове ее функций, ее глобальные переменные не устанавливаются (вернее устанавливаются только для текущего вызова.
Отправлен: 09.06.2005, 12:01
Вопрос задал: Voituk Alexander (статус: 8-ой класс)
Всего ответов отправлено: 1

Отвечает: Jadd
Здравствуйте, Voituk Alexander!
Ну потому что dll ничем не владеет. ВООБЩЕ. Dll проецируется в память вызывающего процесса либо явным связыванием, либо неявным. Как только dll спроецирована в пространнство процесса, для всех потоков становиятся доступными ее функции. Далее, как я и говорил в начале, после запуска какой-то функции из dll, та считывает свои параметры из стека потока и размещает в этом стеке свои переменные. Как только функция завершает свою работу, то все, что было в стеке этой функции теряется, т.к. стек уже недоступен НИ ДЛЯ КОГО!!!!. Кроме того, все объекты, которые были созданы кодом этой DLL уничтожаются, т.к. принадлежат вызывающемо потоку (например, главному потоку процесса). Например, если вызывать какую-то функцию dll, которая выделяет память, то память не освобождается даже, если dll выгрузить из пространства процесса, т.к. система не фиксирует кто зарезервировал этот регион памяти. Поэтому память освободится только когда процесс вызовет функцию, которая освобождает данный участок п амяти. Единственно, что в вашем случае я бы избегал использования глобальных (сиречь статических) переменных, кроме случаев, когда dll-ка скомпилирована и скомпонована библиотекой С/С++. Удачи и читайте книги Дж.Рихтера. Там много про это написано.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 9-ый класс)
Отправлен: 09.06.2005, 17:32
Оценка за ответ: 5
Комментарий оценки:
Я так и думал.


Вопрос № 21.978

Здравствуйте Эксперты, хотелось бы узнать :
как из допустим непостоянной переменной удалить первые 3 символа .. и последние 6 символов
то есть : char myVar= "this is test char**";
и чтобы получилось к приверу myVar= "s is test"
Ну вобщем чтобы не светилиь первые три и последные шесть : )
Отправлен: 09.06.2005, 16:41
Вопрос задал: ДимооН :) (статус: 1-ый класс)
Всего ответов отправлено: 3

Отвечает: Rusland
Здравствуйте, ДимооН :)!
Например, перевести в AnsiString и использовать функцию SubString

Приложение:

Ответ отправил: Rusland (статус: 4-ый класс)
Отправлен: 09.06.2005, 16:51

Отвечает: Jadd
Здравствуйте, ДимооН :)!
Дк просто все. Только там не char myVar, а char* myVar, т.к. тип char содержит только 1 байт, т.е. символ, а не строку. А char* - указатель на начало последовательности байтов типа char. Как говорится, почувствуй разницу. А отсюда и вывод, берешь каждый символ по его индексу в строке и склеиваешь.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 9-ый класс)
Отправлен: 09.06.2005, 17:16
Оценка за ответ: 2

Отвечает: duckslayer777_ Скрипник Евгений
Привет. Извини, сейчас сессия, так что лазить в книге искать ф-ю времени нету. Вообще, создай свою ф-ю для обрезки. Входными параметрами будут переменная с текстом, кол-во символов удаляемых с начала, с конца. В теле ф-ии в буферную строку записывай с позиции i+([кол-во символов удаляемых с начала]-1) по i-([кол-во символов удаляемых с конца]-1). Затем:
return <буферную строку>;
Удачи, разбирайся, времени и сил не жалей.
И купи себе книгу н-р: Полный справочник по С++ 4-е издание, Герберт Шилдт. Денег не жалей.
Ответ отправил: duckslayer777_ Скрипник Евгений (статус: 4-ый класс)
Отправлен: 10.06.2005, 16:41


Вопрос № 21.994
Есть функции с переменным количеством параметров f1 и f2. Как из функции f1 вызвать функцию f2 с тем же списком переменных. Пример:
void myPrint(char *format, ...) {
printf(format, ???); // printf - известная функция, но как передать ей переменное количество параметров, переданное в функцию myPrint?
}
Отправлен: 10.06.2005, 00:13
Вопрос задал: BAY (статус: Посетитель)
Всего ответов отправлено: 3

Отвечает: Jadd
Здравствуйте, BAY!
Очень просто. Эх, пришлось вспомнить stdlib :). Короче. При вызове функции для ее аргументов выделяется область памяти, зовущаяся стеком. Так вот, не имеет большой разницы сколько там параметров. В данном случае в теле функции мы объявляем переменную типа va_list (это типа такой, а не имя переменной). А дальше по тексту, в том мсете, где начинаем работать с этим списком, сначала блока пишем va_start, а в конце блока va_end. Таким образом, у нас получится что-то типа этого кода:
va_list ap;
.............какой-то код...................
va_start(ap, format); //передаем наш список параметров и последний перед списком аргумент
....какой-то код.....................
va_end(ap);
При этом каждый раз ар будет содержать нужный аргумент. Читай хелп для получения больше инфы по этому механизму. Удачи.
---------
Hakuna matata
Ответ отправил: Jadd (статус: 9-ый класс)
Отправлен: 10.06.2005, 09:39

Отвечает: Eugene
Здравствуйте, BAY!
Используя макросы va_arg, va_end, va_start заинклюдить <stdio.h> <stdarg.h>.
В цикле узнать кол-во аргументов и присвоить их значения элементам массива.
Далее использовать switch.
Пока писал понял что все гораздо сложнее-мы не знаем ни количества ни типов аргументов. Для того чтобы узнать это придется писать парсер первого аргумента, наподобии аналогичного в самой функции printf. Поэтому-придумай програмную конструкцию попроще, вот мой совет.
P.S.Если таки придумаешь другой выход из ситуации - напиши,плиз, интересно.
Ответ отправил: Eugene (статус: 1-ый класс)
Отправлен: 10.06.2005, 10:22

Отвечает: Гриценко Юрий Алексеевич
Здравствуйте, BAY!
А никак, потому что стек для каждой функции создаются свой! Пользуй цикл+свитч и вызывай функцию с 1 параметром до победного. Но всё-таки лучше упрости прогу, т.к. без функций с переменным кол-вом параметров в 99% случаев можно обойтись, пусть даже за счёт пары наносекунд выполнения.
---------
Программирование - не способ заработка, а спсоб по-иному взглянуть на мир.
Ответ отправил: Гриценко Юрий Алексеевич (статус: 4-ый класс)
Отправлен: 14.06.2005, 23:21


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

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

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

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

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


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


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

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.cplus
Отписаться
Вспомнить пароль

В избранное