powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запутался в static_cast<>
20 сообщений из 20, страница 1 из 1
Запутался в static_cast<>
    #39610139
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В С:
Код: plaintext
1.
2.
3.
4.
5.
char a = '@';
char *ap = &a;
void *vpa = &ap;
char *bp = *((char**)vpa);
char b = *bp;


как сделать в "правильном С++" аналог для выделенного?
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610154
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,
Разве так не работает?
Код: plaintext
1.
char *bp = *static_cast<char**>(vpa);
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610160
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZ,

только зачем?

писать дольше, а смысла ни статик- ни реинтерпрет касты не добавляют
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610184
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglписать дольше, а смысла ни статик- ни реинтерпрет касты не добавляютзато читать понятнее, сразу видно творение криворукого обкуренного китайского школьника ))
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610244
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZWhite Owl,
Разве так не работает?
Код: plaintext
1.
char *bp = *static_cast<char**>(vpa);

Нет, увы, но так не работает.

Впрочем, все как обычно... Первый вопрос на форуме не о том чем надо.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <iostream>
#include <cstdlib>
#include <string.h>
#include <vector>

int main(int argc, char **argv) {
	std::vector<char*> arr(3);
	arr[0] = "red";
	arr[1] = "green";
	arr[2] = "blue";

	std::qsort(arr.data(), arr.size(), sizeof(char*),
		[](const void *a, const void *b) {
			const char* ar = *static_cast<const char**>(a);
			const char* br = *((char**)b);
			return strcmp(ar, br);
		}
	);

	for(auto p: arr) std::cout << p << ' ';
	std::cout << "\n";
	return 0;
}



Код: plaintext
1.
2.
3.
4.
5.
$ g++ -std=c++11 -Wno-write-strings test_qsort.cpp 
test_qsort.cpp: In lambda function:
test_qsort.cpp:14:49: error: static_cast from type ‘const void*’ to type ‘const char**’ casts away qualifiers
    const char* ar = *static_cast<const char**>(a);
                                                 ^
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610251
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlNekZWhite Owl,
Разве так не работает?
Код: plaintext
1.
char *bp = *static_cast<char**>(vpa);

Нет, увы, но так не работает.слишком мало констов ))
надо бы так, кмк:
Код: plaintext
1.
const char* ar = *( static_cast< const char * const * >( a ) );
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610252
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но выглядит извращенски
Код: plaintext
1.
const char* ar = *reinterpret_cast<const char**>(const_cast<char *>(static_cast<const char *>(a)));
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610254
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
egorychWhite Owlпропущено...
Нет, увы, но так не работает.слишком мало констов ))
надо бы так, кмк:
Код: plaintext
1.
const char* ar = *( static_cast< const char * const * >( a ) );


Точняк, надо больше const, тогда статик каст прокатывает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	char *a = "1234";
	char*const* b = &a;
	char*const*const* c = &b;
	char*const*const*const* d = &c;
	char*const*const*const*const* e = &d;
	char*const*const*const*const*const* f = &e;
	char*const*const*const*const*const*const* g = &f;
	
	char *h = ******(static_cast< char *const*const*const*const*const*const* >( g ));
	
    std::cout << h;
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610272
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	std::qsort(arr.data(), arr.size(), sizeof(char*),
		[](const void *a, const void *b) {
			const char* ar = *static_cast<const char**>(a);
			const char* br = *((char**)b);
			return strcmp(ar, br);
		}
	);


А зачем вы пытаетесь привести к const char** и разыменовать его, когда там на самом деле const char*, т.е. разыменовывается мусор, а не указатель?
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610295
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychWhite Owlпропущено...
Нет, увы, но так не работает.слишком мало констов ))
надо бы так, кмк:
Код: plaintext
1.
const char* ar = *( static_cast< const char * const * >( a ) );

хм... понял, спасибо.
Хотя С стиль все равно более понятный :)
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610307
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlХотя С стиль все равно более понятный :)только его плохо видно в коде и он - хороший источник трудноуловимых ошибок, потому как по любому приведёт что угодно к чему угодно. Но ведь пострелять в ногу - наше любимое развлечение =))
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610380
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyWhite Owl
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	std::qsort(arr.data(), arr.size(), sizeof(char*),
		[](const void *a, const void *b) {
			const char* ar = *static_cast<const char**>(a);
			const char* br = *((char**)b);
			return strcmp(ar, br);
		}
	);


А зачем вы пытаетесь привести к const char** и разыменовать его, когда там на самом деле const char*, т.е. разыменовывается мусор, а не указатель?
const void *a - это указатель на ячейку массива, в которой указатель на строку. Т.е. a - это указатель на указатель.
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610503
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВ С:
Код: plaintext
1.
2.
3.
4.
5.
char a = '@';
char *ap = &a;
void *vpa = &ap;
char *bp = *((char**)vpa);
char b = *bp;


как сделать в "правильном С++" аналог для выделенного?


Так
Код: plaintext
1.
2.
3.
4.
5.
6.
char a = '@';
char *ap = &a;
void *vpa = &ap;
// так
char *bp = *reinterpret_cast< char** >( vpa );
char b = *bp;
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610507
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

https://wandbox.org/permlink/LAejlid3QwlkntU6

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>

int main(int argc, char *argv[]) 
{
	std::vector<const char*> arr = { "red", "green", "blue", "apple-green", "orange", "violett" };

	std::sort( arr.begin(), arr.end(), 
		[](const char *a, const char *b) 
                {
			return std::strcmp(a, b) < 0;
		}
	);

	for( auto p: arr ) 
            std::cout << p << ' ';
	std::cout << "\n";
	return 0;
}



Модератор: Исправил ...
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610517
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://wandbox.org/permlink/YbEyXEjoCNfkixVY

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
#include <cstdlib>

int main(int argc, char *argv[]) 
{
	std::vector<const char*> arr = { "red", "green", "blue" };

    // void qsort( void *ptr, std::size_t count, std::size_t size, /*compare-pred*/* comp );
	std::qsort( arr.data(), arr.size(), sizeof(arr[0]),
		[](const void *a, const void *b) -> int
        {
            using cstring_t = const char*;
            using p_cstring_t = const cstring_t*;
            const char* as = *reinterpret_cast< p_cstring_t >(a);
            const char* bs = *reinterpret_cast< p_cstring_t >(b);
			return std::strcmp(as, bs);
		}
	);

	for( auto p: arr ) 
            std::cout << p << ' ';
	std::cout << "\n";
	return 0;
}
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610621
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткинconst void *a - это указатель на ячейку массива, в которой указатель на строку. Т.е. a - это указатель на указатель.
А, да.
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610627
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Код: plaintext
1.
2.
3.
4.
5.
6.
	std::sort( arr.begin(), arr.end(), 
		[](const char *a, const char *b) 
                {
			return std::strcmp(a, b);
		}
	);


В std::sort компаратор должен вычислять операцию "less". std::strcmp - не то.
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39610651
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyMasterZiv
Код: plaintext
1.
2.
3.
4.
5.
6.
	std::sort( arr.begin(), arr.end(), 
		[](const char *a, const char *b) 
                {
			return std::strcmp(a, b);
		}
	);


В std::sort компаратор должен вычислять операцию "less". std::strcmp - не то.

А ведь и правда.
Минуту.
Исправил.
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39612289
White OwlС стиль все равно более понятный
"Понятный" — это если ты понимаешь, в какие касты (static, const...) и их комбинации он превращается.
А так ты не заметил, что теряешь const.
...
Рейтинг: 0 / 0
Запутался в static_cast<>
    #39612314
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Утка ВасинаWhite OwlС стиль все равно более понятный
"Понятный" — это если ты понимаешь, в какие касты (static, const...) и их комбинации он превращается.
А так ты не заметил, что теряешь const.Не теряю а выкидываю.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запутался в static_cast<>
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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