Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ресурсы, Почему не отображается меню? 
:(
    Опции темы
S.A.G.
Дата 21.8.2007, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Если подставить "101" всеравно меню не отображается.

В чем разница между (char *)101 и "101"?

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 18:48


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  18:43 Найти цитируемый пост)
Если подставить "101" всеравно меню не отображается. 

а если подставить (LPSTR)101 или reinterpret_cast<LPSTR>(101)?

вот пример накидал, может прояснит:
Код

#include <cstdio>

#define A 101
#define MYMAKEINTRESOURCE(i) ((char *)((unsigned long)((unsigned short)(i))))

int main()
{
    char sA[] = "A";
    char *pA1 = sA;
    printf( "\npA1 == %p" , pA1 );

    char *pA2 =  (char *)A;
    printf( "\npA2 == %p" , pA2 );

    char *pA3 = MYMAKEINTRESOURCE( A );
    printf( "\npA3 == %p" , pA3 );

    getc( stdin );
}

PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



(char *)101 работает

Попробуй объяснить чем отличается "101" от (char *)101


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  19:00 Найти цитируемый пост)
Попробуй объяснить чем отличается "101" от (char *)101 

вот:
Цитата(zkv @  21.8.2007,  18:17 Найти цитируемый пост)
Два варианта:

char A[] = "A";
char *pA = A;

и

#define B 101
char *pB =  (char *)B;

в первом случае под строковый литерал на этапе компиляции будет выделена память, затем в процессе выполнения адрес этого участка будет записан в pA
во втором случае мы четко говорим, что строка расположена по адресу B.

и пример в комплекте:
Цитата(zkv @  21.8.2007,  18:54 Найти цитируемый пост)
#include <cstdio>
#define A 101
#define MYMAKEINTRESOURCE(i) ((char *)((unsigned long)((unsigned short)(i))))
int main()
{
    char sA[] = "A";
    char *pA1 = sA;
    printf( "\npA1 == %p" , pA1 );
    char *pA2 =  (char *)A;
    printf( "\npA2 == %p" , pA2 );
    char *pA3 = MYMAKEINTRESOURCE( A );
    printf( "\npA3 == %p" , pA3 );
    getc( stdin );
}

если тут не понятно то спрашивай по тексту, что именно.
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



char * a = "101", имеем последствие - в a содержится адрес 1
char * a = (char *)B == char * a = (char *)101... привести целую константу к типу "указатель на чар"... компилятор разместит строку в память а адрес 1 присвоит a? т.е. когда мы просто пишем "101" оно в памяти не размещено, а когда (char *)101 то строка "101" помещается в память?

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 19:56


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(S.A.G. @  21.8.2007,  19:55 Найти цитируемый пост)
а когда (char *)101 то строка "101" помещается в память?

да ничего не помещается, просто мы явно указываем адрес строки = 101, или 0x00000065(hex). Те говорим: "вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно...
PM MAIL   Вверх
586
Дата 21.8.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



если wc.lpszClassName <= 0xFFFF, то это ID ресурса,
если wc.lpszClassName > 0xFFFF, то это указатель на LPCTSTR
PM   Вверх
S.A.G.
Дата 21.8.2007, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



А разве этот ID не нужен нам как число..? Система генерирует не случайный адрес (101)?

Я поначалу не въехал в преобразование типов...


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
dumb
Дата 21.8.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(zkv @  21.8.2007,  21:05 Найти цитируемый пост)
"вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно...

zkv, ты сам немного запутался... smile
MAKEINTRESOURCE, как уже тут неоднократно упоминалось, просто приведение типа к требуемому прототипами соотв.функций. а передается просто номер - не адрес строки, а просто число. а так как адресов меньше 0xFFFF нет, то функция может четко определить, номер ресурса ей приплыл или адрес строки с именем ресурса.
PM MAIL   Вверх
zkv
Дата 21.8.2007, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(586 @  21.8.2007,  20:17 Найти цитируемый пост)
если wc.lpszClassName <= 0xFFFF, то это ID ресурса,
если wc.lpszClassName > 0xFFFF, то это указатель на LPCTSTR 

ну это уже речь идет об интерпретации системы полученных данных, верно?
тогда следует заметить, что это верно:
Цитата(zkv @  21.8.2007,  20:05 Найти цитируемый пост)
да ничего не помещается, просто мы явно указываем адрес строки = 101, или 0x00000065(hex). Те говорим: "вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно... 

только система не пытается обратиться к памяти по этому адресу, а рассматривает его (сам адрес) как ID, при условии указанном 586

Добавлено через 3 минуты и 32 секунды
Цитата(dumb @  21.8.2007,  20:40 Найти цитируемый пост)
zkv, ты сам немного запутался... 

нет, я возможно только отошел от темы, процитирую себя:
Цитата(zkv @  21.8.2007,  20:05 Найти цитируемый пост)
Те говорим: "вот по этому адресу лежит строка" (точнее символ или их последовательность), откуда она там возьмется науке неизвестно... 

 smile 

Вообще то объяснял, что чем отличается "101" от (char *)101
PM MAIL   Вверх
dumb
Дата 21.8.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



значит это уже я запутался, читая - витиевато излагаете... smile
PM MAIL   Вверх
S.A.G.
Дата 21.8.2007, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



уууууууууууу блииииииииииин smile Доразбираюсь завтра а то седня точно крыша съедет

Это сообщение отредактировал(а) S.A.G. - 21.8.2007, 20:49


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
zkv
Дата 21.8.2007, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(dumb @  21.8.2007,  20:48 Найти цитируемый пост)
значит это уже я запутался, читая - витиевато излагаете... 

да просто уже много постов назад я начал объяснять, что (char *)101 - это не преобразование числа в строку... Пытался наоборот подоступнее.
PM MAIL   Вверх
S.A.G.
Дата 22.8.2007, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


не эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1339
Регистрация: 20.7.2006
Где: in ad equate

Репутация: нет
Всего: 19



Перед тем как переосмыслить все приведу цитату из книги:
Цитата(Финогенов)
Для того чтобы линейка меню была включена в состав приложения как 
его активный элемент, необходимо присвоить члену структуры типа WNDCLASS 
ipszMenuName адрес строки с именем меню, под которым оно фигурирует в файле ресур- 
сов. Как уже отмечалось, вместо адреса строки с именем, описанной где-то в другом мес- 
те, можно просто указать это имя в кавычках. Фактически сама строка будет размещена в 
сегменте данных приложения, а в переменную wc.lpszMenuName будет действительно 
занесен ее адрес.


Я таки считал что (char *)101 и "101" - одно и то же, и упрямо не отрывался от этого толкования. Иногда нужно ткнуть носом. smile +1

Новое объяснение породило еще вполне естественный вопрос. А нафиг системе так дико извращаться, запоминая ID ресурса (целое число без знака) в форме указателя, предварительно преобразовав типы (!!!)? Не проще было бы в структуре типа WNDCLASS предусмотреть поле соотв. целого типа?

И еще одно. Чем же так отличается число 101 (я непомню к какому типу компилятор C++ относит такие целочисленные константы) и адрес строки (да и вообще любой адрес). Ведь любой адрес это поидее тоже целое число?

Прочитал вот это. Стало понятно почему работает пример из книги. Т.е. стало понятно что есть некоторые обстоятельства при которых так может работать.smile При добавлении ресурсов в студии хидер resource.h создается (генерируется) автоматически. Непонятно при каких обстоятельствах это
Цитата
Ресурс может обозначаться либо именем - уникальной строкой,

возможно и зачем предусмотрено оба варианта.

Это сообщение отредактировал(а) S.A.G. - 23.8.2007, 01:06


--------------------
Вот она задачка: спасти себя от себя самого © Cube
Sometimes good people do evil things © A Simple Plan
PM   Вверх
dumb
Дата 23.8.2007, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(S.A.G. @  23.8.2007,  00:48 Найти цитируемый пост)
Чем же так отличается число 101 (я непомню к какому типу компилятор C++ относит такие целочисленные константы) и адрес строки (да и вообще любой адрес). Ведь любой адрес это поидее тоже целое число?

Цитата(dumb @  21.8.2007,  21:40 Найти цитируемый пост)
так как адресов меньше 0xFFFF нет, то функция может четко определить, номер ресурса ей приплыл или адрес строки с именем ресурса.

невнимательно читал...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0621 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.