Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2023, 23:20   #1
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию Указатели.

Здравствуйте! Создал функцию, которая принимает указатель на указатель одним из параметров, а вызываю эту функцию с аргументом не константным указателем на указатель и, как итог, ошибка.
cannot convert parameter 1 from 'TCHAR **' to 'const TCHAR *[]'
Не могу понять в чём дело.

Код:
BOOL WhatIsWeight(const TCHAR* ppPropFont[], const int nSizePropFont);
//.................
WhatIsWeight(pCurselItems, nItem);
apofioz вне форума Ответить с цитированием
Старый 28.02.2023, 07:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Создал функцию, которая принимает указатель на указатель одним из параметров
так почему используете другую?
p51x вне форума Ответить с цитированием
Старый 28.02.2023, 07:50   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, попробуй так

BOOL WhatIsWeight(const TCHAR* const* ppPropFont, const int nSizePropFont);
Алексей1153 вне форума Ответить с цитированием
Старый 28.02.2023, 08:04   #4
AbakBarama
Пользователь
 
Регистрация: 12.05.2011
Сообщений: 57
По умолчанию

TCHAR ** - указатель на указатель
TCHAR *[] - массив указателей
Компилятор вполне резонно пишет 'cannot convert'. Нет?
AbakBarama вне форума Ответить с цитированием
Старый 28.02.2023, 08:20   #5
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

AbakBarama, в аргументе функции такие пустые скобочки эквивалентны звёздочке, так что там у него именно TCHAR** . Но проблема не в этом, а в квалификаторе
Алексей1153 вне форума Ответить с цитированием
Старый 28.02.2023, 12:49   #6
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Но проблема не в этом, а в квалификаторе
А поподробнее это можно объяснить, я не могу понять почему...? А понять надо.
В смысле не там квалификатор const поставил?
apofioz вне форума Ответить с цитированием
Старый 28.02.2023, 12:51   #7
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
попробуй так
Что это значит? Константный указатель на константные данные или всё же нет?
Да, так собирается, но осталось много не ясного.

Последний раз редактировалось apofioz; 28.02.2023 в 13:05.
apofioz вне форума Ответить с цитированием
Старый 28.02.2023, 14:48   #8
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, я попытался найти в тырнете ответ. Насколько я понял, происходит следущее:

int** имеет такой тип
Код:
int /*nonconst*/* /*nonconst*/*
const int** имеет такой тип
Код:
int const* /*nonconst*/*
по правилам неявного преобразования const не может добавиться только к одному уровню косвенности, а добавляется ко всем сразу

поэтому из int** получается int const* const* , а в сигнатуре функции был указан int const* * .

в деталях могу ошибаться, но вроде как-то так происходит
Алексей1153 вне форума Ответить с цитированием
Старый 28.02.2023, 16:37   #9
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Алексей1153 НИЧЕГО НЕ ПОНЯТНО, если есть указатель на int*, а, скажем, в функции параметр const int*, то int* не может преобразоваться к const int*, а преобразуется int const* const*, но почему не к const TCHAR* const*, и как это читать и ещё неплохо бы понимать... Насколько я понимаю это не константный указатель на константные данные, так?


Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
а в сигнатуре функции был указан int const* *
Нет, в сигнатуре функции const TCHAR**, точнее const TCHAR* [], что одно и тоже.


Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
по правилам неявного преобразования const не может добавиться только к одному уровню косвенности, а добавляется ко всем сразу
Что следует понимать под уровнем косвенности?
apofioz вне форума Ответить с цитированием
Старый 28.02.2023, 17:42   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

apofioz, int я для примера привёл. Вместо него любой тип можешь представить (к слову, TCHAR - это вообще не тип, а макрос)

уровень косвенности - это одна звёздочка
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Указатели - надо начальную букву в слове сделать большой используя указатели FerrariF70 Общие вопросы C/C++ 13 08.09.2017 04:28
Указатели viks1 Помощь студентам 6 17.04.2013 01:18
Указатели Alexandr- Помощь студентам 8 16.03.2013 23:23
Указатели AquaticSoul Общие вопросы C/C++ 5 22.12.2009 15:13
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39