Вопрос № 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-е издание, Герберт Шилдт. Денег не жалей.
Есть функции с переменным количеством параметров 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% случаев можно обойтись, пусть даже за счёт пары наносекунд выполнения.
--------- Программирование - не способ заработка, а спсоб по-иному взглянуть на мир.