0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
|
|
1 | |
Как осуществляется преобразование типов (для чего)?14.01.2012, 02:35. Показов 2382. Ответов 19
Метки нет (Все метки)
Как осуществляется преобразование типов (для чего)?
int *p=(int*)str; // ругается на p Спасибо P.s Си
0
|
14.01.2012, 02:35 | |
Ответы с готовыми решениями:
19
Для чего в приведенном коде используется преобразование типов Преобразование типов double в int для задания размерности массива Преобразование типов, как понять фразу из учебника Преобразование типов в C++: как преобразовать строку в тип double? |
1186 / 543 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|||||||||||
14.01.2012, 02:50 | 2 | ||||||||||
VN, преобразование типов необходимо не столь часто, более разумный пример тебе
В твоём примере компилятор ругается не на p, а на то что ты преобразовывать собрался что-то не правильно и из твоего str тип int* не сделать.
0
|
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
|
||||||
14.01.2012, 03:13 [ТС] | 3 | |||||
0
|
Модератор
12832 / 7569 / 1764
Регистрация: 25.07.2009
Сообщений: 13,961
|
||||||
14.01.2012, 05:40 | 4 | |||||
На самом деле в С всё совсем не так!
Код
~/cpp/other $ gcc -o void void.c ~/cpp/other $ ./void abcdefghijklmno 0x61626364 0x65666768 0x696a6b6c 0x6d6e6f00 ~/cpp/other $ Код
~/cpp/other $ g++ -o void++ void.c void.c: In function 'int main()': void.c:6: error: invalid conversion from 'void*' to 'char*' ~/cpp/other $ Просто из любопытства - а Вы этим чего добиться хотели?
0
|
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
|
||||||
14.01.2012, 05:46 | 5 | |||||
В моем понимании так. - объявляется указатель на на массив типа int состоящий из двух элементов - матрица приводится (временно перобразуется) к одномерному массиву состоящему из двух элементов и берется адрес первого элемента патрицы. - адрес из второго пункта присваивается указателю на массив int из двух элементов
0
|
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
|
|
14.01.2012, 06:14 | 7 |
0
|
14.01.2012, 06:45 | 8 | |||||
Тогда
вот
0
|
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
|
||||||
14.01.2012, 08:13 | 9 | |||||
откуда 34 то???
0
|
0 / 0 / 0
Регистрация: 14.12.2011
Сообщений: 90
|
|
14.01.2012, 10:22 [ТС] | 10 |
int str[2][16]={{0,4,4,3,4,3},{8,3,4,2,4,4,4}}; 2 по 16 а я его с помощью указателя хочу рассматривать как 16 по 2.Так как допускается создание указателя на другую размерность.
0
|
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
|
||||||
14.01.2012, 11:06 | 11 | |||||
VN, вот 16 по 2
1
|
14.01.2012, 12:35 | 12 |
В gcc не смертелен выход на пределы массива +1. Ну, у меня по крайней мере.
Есть подозрение, что при данном смещении str + i натыкается на адрес i, и по нему i присваивается единица. Это хорошо видно при компилировании через g++. Но через gcc получаются 2 ситуации, раз и два. Т.е. в случае с выводом адреса i, gcc помещает ее раньше чем str.
0
|
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
|
|
14.01.2012, 20:21 | 13 |
вы пытаетесь записать данные в память которая не в ходит в диапзон вашего массива. это серьезная ошибка. этого вполне достаточно чтобы так не делать.
0
|
14.01.2012, 20:29 | 14 |
Я нигде не говорил, что так можно делать, я специально пытался вызвать сегфолт(уже не помню зачем), и пришел к выводу, что если не выводить адрес переменной i, то gcc поместит ее достаточно близко к str, чтобы можно было перейти на нее, просто прибавляя к str sizeof(int).
0
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||
14.01.2012, 20:47 | 15 | |||||
VN, преобразования типов выполнятся при всяком присваивании значений переменным, чей тип отличается от типа присваиваемых значений и при всяком вызове подпрограмм с фактическими параметрами, типы которых не совпадают с типами формальных параметров. Иногда преобразования типов явные, иногда неявные, например,
0
|
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
|
|
15.01.2012, 05:00 | 16 |
В C++ лучше пользоваться static_cast'ом, а не (тип) или тип(выражение)
0
|
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
|
|
15.01.2012, 08:47 | 17 |
По стандарту гарантируется осмысленность значения указателя на элемент, следующий за последним элементом массива, что сделано для применимости к массивам алгоритмов STL, но разыменовывать такие указатели стандарт запрещает.
0
|
278 / 173 / 21
Регистрация: 10.07.2011
Сообщений: 441
|
||||||
15.01.2012, 10:49 | 18 | |||||
soon, в разбираемом примере всего 32 индекса. от 0 до 31 включительно.
даже если следовать вашей логике о выходе на +1 это будет 32ой индекс. а ни как не 33ий как вы пытаетесь сделать вот в этом вашем примере.
0
|
15.01.2012, 19:18 | 19 |
Я, возможно, не так выразился. Как я уже сказал, я намеренно пытался вызвать segmentation fault, т.е. я имел ввиду, чтобы вызвать сегфолт нужно разыменовать следующий за следующим за концом массива элемент. Смысл разымновывать ptr + size, если программа не упадет? Зачем я пытался это сделать - не помню(как я, опять-же, говорил. Ну взбрело резко в голову, мол надо вызвать сегфолт, ну и попытался). Нет смысла говорить мне о том, что так делать нельзя в реальных задачах, я это понимаю.
Суть то оказалась не в этом. Я действительно удивился, когда вместо вылета программы я получил бесконечный цикл. На первый взгляд ошибок не было(если не считать за ошибку выход за пределы массива). Поэтому я закинул его на форум и убежал по делам. Уже на выходе меня посетила мысь о возможном присваивании i = 1. Так и было. Но, как оказалось, стоит только вывести адрес i, как программа перстает циклится. Собственно, ответ на свой вопрос я уже получил, да и от темы мы отклонились. За сим флудить прекращаю.
0
|
greeezz
|
15.01.2012, 20:10
Как осуществляется преобразование типов (для чего)?
#20
|
1
|
15.01.2012, 20:10 | |
15.01.2012, 20:10 | |
Помогаю со студенческими работами здесь
20
Как запретить преобразование типов при использовании cin Преобразование типов - как строку чисел перевести в целочисленный массив ? По какому правилу осуществляется приведение типов в Java Преобразование типов для объекта Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |