powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сквозной указатель?
14 сообщений из 14, страница 1 из 1
Сквозной указатель?
    #38712169
krid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые, подскажите пожалуйста,
есть функции:

void drawlist (??? //HDC){
// рисую
}


void drawUI(HDC *thdc){
//
drawlist( ??? );
}


функция drawUI принимает указатель на HDC.
этот указатель передается как параметр для функции drawlist для доп. операций.

Где знаки вопроса, я не знаю как это описать. Тоесть понятно, что на уровне drawUI я использую *thdc.
Но как уйти глубже?


Q_Q
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712179
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может я конечно тупой, но проблемы вообще не понимаю.
Если так, не могли бы Вы более подробно сформулировать вопрос.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void drawlist ( HDC *thdc ){
       // рисую
}


void drawUI( HDC *thdc ){
  //
  drawlist( thdc );
}


функция drawUI принимает указатель на HDC.

HDC и так хендл, почему бы просто его не передавать. Если ф-ция draw, его не меняют - указатель не нужен. Просто передавать HDC по значению. IMHO
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712662
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kridУважаемые, подскажите пожалуйста,
есть функции:

Код: plaintext
1.
2.
3.
void drawlist (??? //HDC){
       // рисую
}




Код: plaintext
1.
2.
3.
4.
void drawUI(HDC *thdc){
  //
  drawlist( ??? );
}




функция drawUI принимает указатель на HDC.
этот указатель передается как параметр для функции drawlist для доп. операций.

Где знаки вопроса, я не знаю как это описать. Тоесть понятно, что на уровне drawUI я использую *thdc.
Но как уйти глубже?


Q_Q

Как я понял, krid спрашивает про абстрактный квалификатор, по которому любой взглянув на прототип функции понял бы, что:
авторэтот указатель передается как параметр для функции drawlist для доп. операций.


Некоторый аналог

ISO/IEC 9899:201x7.24.2.3 The strcpy function
Synopsis
1
Код: plaintext
1.
2.
3.
#include <string.h>
char *strcpy(char * restrict s1,
const char * restrict s2);



Всем понятно откуда и куда идёт копирование, по квалификатору const.

Если я не ошибаюсь, стандарт Си таких квалификаторов не предусматривает, и я не уверен что такие "пользовательские" квалификаторы есть в С++. Хотя возможно существует возможность их создать искусственно, но надеюсь что такой возможности нет. Это лишнее.

Резюмируя: если я вас правильно понял, то используйте комментарии к функциям.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712663
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSISO/IEC 9899:201x7.24.2.3 The strcpy function
Synopsis
1
Код: plaintext
1.
2.
3.
#include <string.h>
char *strcpy(char * restrict s1,
const char * restrict s2);



Всем понятно откуда и куда идёт копирование, по квалификатору const.



И всем понятно, что s1 не должен пересекаться с s2 по квалификатору restrict.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712691
krid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, прошу прощения, если описал задачу не верно. Дело в том, что я только учу этот язык и поэтому могу не верно истолковать нужное.

В любом случае, попробую иначе:
Есть обработка сообщения.
Из нее вызывается ф-ция PaintUI с указателем на tempDC.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
case WM_PAINT:
        {

            BeginPaint(hwnd, &ps);


            tempDC = CreateCompatibleDC(ps.hdc);


            tempBMP=CreateCompatibleBitmap(ps.hdc,420,420);
            hOLD   = SelectObject(tempDC, tempBMP);
            SelectObject( tempDC, tempBMP );
            paintUI(&tempDC);
            BitBlt(ps.hdc,0,0,420,420,tempDC,0,0,SRCCOPY);
            SelectObject(tempDC, hOLD);
            DeleteObject( tempBMP );
            DeleteDC( tempDC );
            EndPaint(hwnd, &ps);
            return 0;
        }



Далее в PaintUI я вызываю другую ф-цию, которая рисует список объектов, где вместо вопросов (???) должно быть что-то, что помогло бы мне использовать тот же tempDC из обработки сообщения WM_PAINT.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void paintUI(HDC *thdc){
            SelectObject(*thdc,font);
            SetBkColor(*thdc,bgColor);
            FillRect(*thdc,&r,brush);
            SetBkMode(*thdc,TRANSPARENT);
            SetTextColor(*thdc,RGB(65,65,225));
            // 
            drawList(???,&data);

}



Код: plaintext
1.
2.
3.
4.
void drawList(HDC ???,std::vector<std::string> *zdata) {
             // 
             TextOutA(???,16,20,(*zdata).at(0).c_str(),32);
}
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712764
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас либо слишком очевидный вопрос, по типу f1 принимает x, f1 вызывает в себе f2, как сделать чтобы f2 принимало этот-же x.
Код: plaintext
1.
2.
3.
4.
T f1(T* x)
{
return f2(x)+f3(x);
}


, либо я вас вновь не понимаю.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712769
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда только учат математику, то не начинают с двойных интегралов и пространств Соболева. Си в программировании так-же фундаментален и важен как математика в науке(чуть меньше конечно, но всё же). Так что начините с чего-нибудь более простого для изучения. Начните читать стандарт.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Как я понял, krid спрашивает про абстрактный квалификатор, по которому любой взглянув на прототип функции понял бы, что:
авторэтот указатель передается как параметр для функции drawlist для доп. операций.




Характер семантики операций с операндом-параметром функции не может быть в языках C и C++ вырожен на уровне языка никакими способами. В смысле -- дополнительные это операции, или основные.

По семантике данного типа -- HDC -- даже "дополнительные" операции с ним будут не CONST, да и в WinAPI квалификаторы CONST не применяются.

Комментарии конечно же можно применять для этого.
Также можно применять пустые (псевдо)квалификаторы, выполненные в виде пустых макроопределений (нефункциональных).

Код: plaintext
1.
2.
3.
4.
#define input 
#define output

char* strcpy( output char* dst, input const char* src);




В данном конкретном случае к параметру HDC это всё неприменимо, ввиду его особой семантики.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712819
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kridДалее в PaintUI я вызываю другую ф-цию, которая рисует список объектов, где вместо вопросов (???) должно быть что-то, что помогло бы мне использовать тот же tempDC из обработки сообщения WM_PAINT.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void paintUI(HDC *thdc){
            SelectObject(*thdc,font);
            SetBkColor(*thdc,bgColor);
            FillRect(*thdc,&r,brush);
            SetBkMode(*thdc,TRANSPARENT);
            SetTextColor(*thdc,RGB(65,65,225));
            // 
            drawList(???,&data);

}




Достаточно просто передать HDC как параметр.
Передаваться он должен по значению, поскольку внутри функции сам HDC не меняется.

std::vector<std::string> следует передавать по константной ссылке, а не по указателю.
Причина -- функция drawList, очевидно, не может работать при zdata == NULL, её вызов в этом
случае бессмысленен. Поэтому нужно передавать именно как константную ссылку -- её нельзя задать
NULL, она всегда должна быть.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void drawList(HDC dc, const std::vector<std::string> &zdata);

void paintUI(HDC dc)
{
            SelectObject(dc,font);
            SetBkColor(dc,bgColor);
            FillRect(dc,&r,brush);
            SetBkMode(dc,TRANSPARENT);
            SetTextColor(dc,RGB(65,65,225));
            drawList( dc,&data);
}
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712924
krid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv, Благодарю. Исправил код. Всё вполне работает.

Если есть возможность и желаение, посоветуйте книги именно на эту тему. Указатели, WINAPI и "правильный код".
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38712939
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКогда только учат математику, то не начинают с двойных интегралов и пространств Соболева. Си в программировании так-же фундаментален и важен как математика в науке(чуть меньше конечно, но всё же). Так что начините с чего-нибудь более простого для изучения. Начните читать стандарт.
Чтение стандарта - не самый лучший старт для изучения. Кроме того стандарт языка
не покрывает библиотек GDI графики о которых и спрашивает автор.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38713083
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kridпосоветуйте книги именно на эту тему. Указатели, WINAPI и "правильный код".

Это -- три разные книги.

WINAPI - Фроловы. Старая книжка.
"правильный код" -- McConnel, но я бы не советовал бросаться её читать.
Указатели -- достаточно любого стандартного учебника по С. Прата, например.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38713086
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSashaMercury Начните читать стандарт.
Чтение стандарта - не самый лучший старт для изучения.


Я бы сказал -- худший.

Можно читать тогда уж книги, подобные этой
Код: plaintext
1.
2.
3.
Харбисон С.П., Стил Г.Л. Язык C с примерами. Пер. с англ. -М.: Бином, 2011 г.-528с.

ISBN 978-5-9518-0417

если так на стандарты тянет.

А лучше всего читать УЧЕБНИКИ.
...
Рейтинг: 0 / 0
Сквозной указатель?
    #38713445
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryТак что начините с чего-нибудь более простого для изучения. Начните читать стандарт.Стандарт пишется чётким, сухим языком. Для людей, которые его (стандарт) и так знают.
Начинать надо с учебников, которые:
1. Излагают не весь стандарт, а наиболее употребительные его части;
2. Излагают материал более "человечно".
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сквозной указатель?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]