Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / что хотят в этой задаче ??? / 14 сообщений из 14, страница 1 из 1
26.09.2020, 13:35
    #40002845
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
Эккель который Брюс. задача от туда .

Текст :
Определить массив типа int. получить начальный адрес массива и привести его к типу void* при помощи static_cast. Написать функцию , в аргументах которой передаются *void, число (количество байт) и значение. Функция должна присваивать передаваемое значение каждому байту в заданном интервале. Протестировать функцию на массиве int.

1. верно ли я понял суть задачи, реализовав следующим образом ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <iostream>
#define TYPE long
using namespace std;
using namespace std;

void myFunc(void* p, int qtyByte,int Val)
{
	unsigned char* z = static_cast<unsigned char*>(p);
	for (int i = 0; i<=qtyByte-1;i++)
		z[i] = Val;
	
}
int main(int argc, char** argv) {
	int m[] = { 0,0,0};
	void* p = static_cast<void *>(m);
	myFunc(p, 2, 10);
}


если верно , то какой смысл перегонять это сначало в void * ??? Можно ведь сразу передать как int *. или может есть смысл сначала в void * ? или автор просто хочет показать , что можно перегнать в void * , а потом обратно преобразовать в исходный ?


2. в чем смысл предостережений использования всяких там staic_cast, reintepret_cast, dynamic_cast ?
скажем Эккель пишет: static_cast это для безопасного или более менее безопасного приведения, включая то которое может быть выполнено неявно.
а скажем reintepret_cast самый опасный из всех видов приведений.
так в чем их опасность то у всех ? что я например потеряю дробную часть, переводя из float в int , ну так я в курсе этого. или что-то ещё ???
...
Рейтинг: 0 / 0
26.09.2020, 13:42
    #40002847
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
andron81или автор просто хочет показать , что можно перегнать в void * , а потом обратно
преобразовать в исходный

Или не в исходный. Да,именно так, типичная учебная задача на освоение новой техники. В
данном случае - приведения типов.

andron81так в чем их опасность то у всех ?

В багах, которые они могут породить или замаскировать. На пальцах не объяснить, приходит с
опытом многодневной отладки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.09.2020, 13:54
    #40002854
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
смысл перегонять это сначало в void * ???

Dimitry Sibiryakov

Да,именно так, типичная учебная задача на освоение новой техники. В
данном случае - приведения типов.


а ты знаешь , прикол в том , что передавать int * не выйдет, каст_статик забракует :

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include <iostream>
#define TYPE long
using namespace std;
void myFunc(int* p, int qtyByte, int Val)
{
    unsigned char* z = static_cast<unsigned char*>(p);
    for (int i = 0; i <= qtyByte - 1; i++)
        z[i] = Val;

}
int main(int argc, char** argv) {
    int m[] = { 0,0,0 };
   // void* p = static_cast<void*>(m);
    myFunc(m, 2, 10);
}
...
Рейтинг: 0 / 0
26.09.2020, 14:32
    #40002861
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
andron81смысл перегонять это сначало в void * ???

Чтобы в жидких мозгах студентов выкристаллизовалось умение пользоваться static_cast.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.09.2020, 15:19
    #40002867
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
Dimitry Sibiryakov,

со статиком не выйдет иначе.
...
Рейтинг: 0 / 0
26.09.2020, 15:23
    #40002868
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
У некоторых студентов мозги настолько жидкие, что точка насыщения для кристаллизации так и
не образовывается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.09.2020, 17:29
    #40002900
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
andron81,

Опасность reintepret_cast в том, что не все преобразования в нем разрешены, но часть тех которые запрещены (например из-за алиасинга) описаны в стандарте как Undefined Behavior(UB), и компилятор не обязан выдавать ошибку (в отличии от static_cast).
Т.е. будет UB, а вы даже не узнаете, пока где-то что-то крашнется (в лучшем случае).
...
Рейтинг: 0 / 0
26.09.2020, 17:37
    #40002902
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
Хотя вот в соседней теме выяснили что и static_cast может подгадить )
https://www.sql.ru/forum/1329465/pochemu-ya-tut-ne-mogu-zamenit-reinterpret-cast-na-static-cast
...
Рейтинг: 0 / 0
26.09.2020, 18:05
    #40002907
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
Anatoly MoskovskyОпасность reintepret_cast в том, что не все преобразования в нем разрешены

Точнее я бы сказал, что особо опасен он тем, что некоторая часть разрешённых
преобразований выполняется не совсем так как ожидает наивный кодописатель.

Именно поэтому явные преобразования следует избегать насколько это только возможно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
26.09.2020, 18:56
    #40002927
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
andron81, это попытка научить студентов изобретать велосипед типа memset
...
Рейтинг: 0 / 0
26.09.2020, 22:30
    #40002964
andron81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
Dimitry Sibiryakov,

а во ,пожалуйста, мне подсказали где искать баги .

int x = 0x7ffffff; //134217727
float y = static_cast<float>(x); //134217728.

преобразования явные . и как с этим бороться ??? )))
...
Рейтинг: 0 / 0
27.09.2020, 00:12
    #40002975
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
andron81и как с этим бороться ??? )))

Легко: никогда не использовать явные преобразования типов без точного понимания зачем и
почему.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.09.2020, 00:51
    #40003160
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
andron81,


Я считаю что суть задачи вы поняли верно.

Условие <= N-1 выглядит необычно, обычно пишут <N

Смысл преобразования в void* , чтобы функцию было удобно вызывать без каста на любом объекте.

finc( &x, sizeof(x), 0). Обнулит память переменной x для любого типа.

Посмотрите memset () в stdlib.h
...
Рейтинг: 0 / 0
28.09.2020, 01:01
    #40003163
НеофитSQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
что хотят в этой задаче ???
> чем смысл предостережений использования всяких там staic_cast, reintepret_cast, dynamic_cast ?

Это разные виды молотков. Один для подгонки, другой для рихтовки.
Reinterpret_cast это вообще кувалда, которая редко нужна.

Каждый каст увеличивает риск ошибки, поэтому если нужен молоток, начинайте с менее опасных.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / что хотят в этой задаче ??? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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