Russian Qt Forum
Апрель 30, 2024, 11:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: const char *&  (Прочитано 21154 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Декабрь 06, 2016, 15:06 »

Насчёт моего примера, если честно, то я не совсем представляю, где приведённая в #1 конструкция может применяться, не сталкивался, может поведаете, что делает ваша Test?.
Упрощенный пример:
Цитировать
"This is text";   // исходная строка
"Thi_ i_ tex_";  // нужно получить
Т.е. в каждом слове заменить последнюю букву на подчеркивание. Вот я и поручу поиск конца слова ф-ции Test, конечно менять содержимое строки ей не положено, поэтому аргумент const. А вот вызывающий менять может/должен.  Как видите, ничего особенного я не хочу.

Я бы даже немного перебрал сигнатуру:
Код
C++ (Qt)
const char *Test(const char*)
А лично вам могу посоветовать снять константность с возвращаемого значения Улыбающийся
Тогда внутри Test придется писать const_cast Улыбающийся Ну и сильно много не "вернуть", нередко на входе 2 и больше массивов, которые должны быть "продвинуты".

..не совсем представляю .. не сталкивался..
Тогда может лучше воздержаться от "рекомендую", "советую", и, тем более, грубостей? У меня подобные ситуации возникали неоднократно, и всякий раз я не мог найти четкого решения, всякий раз "приводился", что, конечно, не смертельно, но неприятно. Вот и решил потолковать об этом на форуме, так сказать, "пошлифовать технику"  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #31 : Декабрь 06, 2016, 16:06 »

В функции спецификатор const немного не согласуется с её назначением, так как она в итоге должна позволять изменять содержимое.
Не хотите возвращать индекс/список индексов окончания слов? Таким образом функция может принимать const char*
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #32 : Декабрь 06, 2016, 17:24 »

В функции спецификатор const немного не согласуется с её назначением, так как она в итоге должна позволять изменять содержимое.
Не хотите возвращать индекс/список индексов окончания слов? Таким образом функция может принимать const char*
Не, Igors хочет в вызывающей функции иметь не константный указатель, который бы автоматически приводился к const при передачи его в функцию Test.

Код
C++ (Qt)
void Test( const char * &src )
{
   // Здесь указатель можно только двигать, но нельзя менять данные по указателю.
}
 
void foo()
{
   char *buf = ...;
   Test( buf );
   *buf = '_';
}
 
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #33 : Декабрь 06, 2016, 17:45 »

Да я понял, что он хочет. Как раз это и характеризовал в #29 Улыбающийся
Мне кажется, что по логике функция Test должна позволять редактировать содержимое, на которое указывает src, так как через параметр-ссылку возвращает результат, который будет использован для правки, а не для чтения. Поэтому, для достижения желаемого результата, достаточно в качестве параметра передавать char *&src

Как вариант, на мой взгляд, более читабельный:
Код
C++ (Qt)
std::vector<size_t> Test(const char *&src){
   // поиск индексов конца слов
}
 
void foo(){
   char *buf = ...;
   for (size_t index: Test(buf)){
       buf[index] = '_';
   }
}
 
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #34 : Декабрь 06, 2016, 18:38 »

А еще можно сделать 2 ф-ии - одна берет и возвращает char *, вторая const char*.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #35 : Декабрь 07, 2016, 09:12 »

Мне кажется, что по логике функция Test должна позволять редактировать содержимое, на которое указывает src, так как через параметр-ссылку возвращает результат, который будет использован для правки, а не для чтения.
С какой стати? Чего это ф-ция должна что-то знать/предполагать о том кто/зачем ее использует? А если другой использующий ничего не пишет,  а использует эту ф-цию как часть более сложного поиска где строка всегда неизменяема?

А еще можно сделать 2 ф-ии - одна берет и возвращает char *, вторая const char*.
Если там тельце весомое то все равно сведется к обертке с const_cast. Ну видимо в данном случае это неизбежно

Заметим что и без ссылки не проскочить, напр
Код
C++ (Qt)
void Test( const char ** srcPtr )
 
Те же проблемы и тоже придется привестись
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #36 : Декабрь 07, 2016, 09:30 »

Мне кажется, что по логике функция Test должна позволять редактировать содержимое, на которое указывает src, так как через параметр-ссылку возвращает результат, который будет использован для правки, а не для чтения.
С какой стати? Чего это ф-ция должна что-то знать/предполагать о том кто/зачем ее использует?
А с такой. Я тоже могу использовать vector::operator[] для просмотра значений и в результате своей работы метод не изменяет члены класса, но он почему-то не константный.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #37 : Декабрь 07, 2016, 09:50 »

А еще можно сделать 2 ф-ии - одна берет и возвращает char *, вторая const char*.
Если там тельце весомое то все равно сведется к обертке с const_cast. Ну видимо в данном случае это неизбежно
Можно и без const_cast Улыбающийся и с версией без изменения содержимого.
Код
C++ (Qt)
const char *Test(const char *str){
return str;
}
 
char *Test(char *str){
const char *constStr = str;
return str + (Test(constStr) - constStr);
}
 
int main() {
char buf[10];
const char buf2[10] = "abc";
Test(buf);
Test(buf2);
 
return 0;
}
« Последнее редактирование: Декабрь 07, 2016, 09:54 от __Heaven__ » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #38 : Декабрь 07, 2016, 10:19 »

Можно и без const_cast Улыбающийся и с версией без изменения содержимого.
Остроумно, но все-таки "с развратом" возможности довольно ограничены. Напр ф-ция ищет какое-то слово входящее в обе строки-аргумента, нормальный дызайн типа
Код
C++ (Qt)
bool FindCommonWord( const char *& str1, const char *& str2 );
 
Тут уже затруднительно написать какой-то код чтобы обойти const_cast. Ну и вообще, чего так уж бояться приведений? Ну нежелательно - да, надо по возможности избегать, но если надо - значит надо, все хорошо в меру
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #39 : Декабрь 07, 2016, 10:39 »

Тут уже затруднительно написать какой-то код чтобы обойти const_cast. Ну и вообще, чего так уж бояться приведений? Ну нежелательно - да, надо по возможности избегать, но если надо - значит надо, все хорошо в меру
Если хочется, делайте Улыбающийся
Не забудьте пройтись по памяти Подмигивающий
Код
C++ (Qt)
char *Test(const char*);
int main(){
   Test("Hello sigsegv") = '_';
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Декабрь 07, 2016, 11:17 »

Если хочется, делайте Улыбающийся
Не забудьте пройтись по памяти Подмигивающий
Улыбающийся  Ну вообще-то я обычно использую сишное приведение (какой ужас!). А серьезно - все это "академическое программирование" - порядочное фуфло, тут вполне достаточно поддерживать какой-то необходимый уровень грамотности. Учите "специальность", работа там, а не здесь.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #41 : Декабрь 07, 2016, 11:23 »

Сказал бы я, что на самом деле фуфло, только боюсь, что снова обидитесь Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #42 : Декабрь 08, 2016, 11:24 »

Сказал бы я, что на самом деле фуфло, только боюсь, что снова обидитесь Улыбающийся
Не надо "подымать хвостик" - он у Вас еще очень плохо отрос  Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #43 : Декабрь 08, 2016, 11:32 »

Игорь, завязывайте хвостиками меряться  Смеющийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Декабрь 08, 2016, 13:07 »

Да, и кстати
А с такой. Я тоже могу использовать vector::operator[] для просмотра значений и в результате своей работы метод не изменяет члены класса, но он почему-то не константный.
Их 2, если vector константный, то будет вызван константный оператор [], иначе неконстантый
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.167 секунд. Запросов: 22.