реклама на сайте
подробности

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> в чем прелесть указателей ?
prottoss
сообщение Jan 30 2007, 13:27
Сообщение #46


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dryadae @ Jan 30 2007, 17:13) *
Цитата(prottoss @ Jan 30 2007, 02:36) *

Цитата(zltigo @ Jan 30 2007, 06:26) *
А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char?

Неправда - void * smile.gif smile.gif smile.gif
Да здесь я ошибся, но спор шел о приведении типов

Цитата(dryadae @ Jan 30 2007, 17:13) *
Цитата(prottoss @ Jan 30 2007, 03:42) *

Цитата(zltigo @ Jan 30 2007, 07:27) *
Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет
с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.
Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше excl.gif
"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...
А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно IAR 4.10B:

Код
   71              fun(*(array_as_param *)array1);
   \   00000012   ....               LDI     R30, LOW(array1)
   \   00000014   ....               LDI     R31, (array1) >> 8
   \   00000016   E604               LDI     R16, 100
   \   00000018   E010               LDI     R17, 0
   \   0000001A   ........           CALL    ?LONG_FARG_16_L07 /* заталкивает куда то массив */
   \   0000001E   ....               RCALL   fun

............................................................................

Maximum stack usage in bytes:

     Function                       CSTACK RSTACK
     --------                       ------ ------
     fun                              100      2 /* стека данных используется как раз под наш МАССИВ */


PS: Если уж спорите, так держите под рукой компилятор, чтоб не голословить: + dxp


--------------------
Go to the top of the page
 
+Quote Post
dryadae
сообщение Jan 30 2007, 13:49
Сообщение #47


Частый гость
**

Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051



Цитата(prottoss @ Jan 30 2007, 13:27) *
Цитата(dryadae @ Jan 30 2007, 17:13) *
Цитата(prottoss @ Jan 30 2007, 02:36) *

Цитата(zltigo @ Jan 30 2007, 06:26) *
А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char?

Неправда - void * smile.gif smile.gif smile.gif
Да здесь я ошибся, но спор шел о приведении типов

Цитата(dryadae @ Jan 30 2007, 17:13) *
Цитата(prottoss @ Jan 30 2007, 03:42) *

Цитата(zltigo @ Jan 30 2007, 07:27) *
Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет
с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.
Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше excl.gif
"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...
А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно IAR 4.10B:

Кривой у вас компилятор blush.gif Писать с его помощью TSR и обработчики прерываний - смерти подобно.
И вообще, чтобы понять, надо не компилятором, а ручками. Тогда сразу станет ясна разница между Pascal и C, и то, что представляет из себя каждый тип.

Цитата
Код
   71              fun(*(array_as_param *)array1);
   \   00000012   ....               LDI     R30, LOW(array1)
   \   00000014   ....               LDI     R31, (array1) >> 8
   \   00000016   E604               LDI     R16, 100
   \   00000018   E010               LDI     R17, 0
   \   0000001A   ........           CALL    ?LONG_FARG_16_L07 /* заталкивает куда то массив */
   \   0000001E   ....               RCALL   fun

............................................................................

Maximum stack usage in bytes:

     Function                       CSTACK RSTACK
     --------                       ------ ------
     fun                              100      2 /* стека данных используется как раз под наш МАССИВ */


PS: Если уж спорите, так держите под рукой компилятор, чтоб не голословить: + dxp

Я не "голословлю", адрес тоже можно использовать как аргумент - например, в случае far-адресации для выяснения идентификатора процесса, который может равняться cs excl.gif

P.S. Кстати, команда call не заталкивает, а вызывает. По крайней мере, в 80x86 и Motorola 68K.

Сообщение отредактировал dryadae - Jan 30 2007, 13:55
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 14:12
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dryadae @ Jan 30 2007, 17:13) *
Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше excl.gif
"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...
push ebp
mov ebp, esp
start equ [ebp+4]
; вот где начинаются аргументы Вашей функции, порядок зависит от callspec
Аххха smile.gif Тихо переметнулись на х86. ОК smile.gif , вот мой код для х86



Код
22:       fun(*(array_as_param *)array1);
0040B548   sub         esp,64h /* итит ехо на лево, это что со стеком вытворяють!!! */
0040B54B   mov         ecx,19h
0040B550   mov         esi,offset array1 (0042281c)
0040B555   mov         edi,esp
0040B557   rep movs    dword ptr [edi],dword ptr [esi]
0040B559   call        @ILT+5(fun) (0040100a)
0040B55E   add         esp,64h  /* о, опять, надо Билу Гею пожаловаться!!! */




Цитата(dryadae @ Jan 30 2007, 17:49) *
P.S. Кстати, команда call не заталкивает, а вызывает. По крайней мере, в 80x86 и Motorola 68K.
нюню, а это чьи слова?

Цитата
"Передать" - значит затолкнуть в стек ©
Так вот, строчка

Код
0000001A   ........           CALL    ?LONG_FARG_16_L07


Как раз заталкивает (Вашими словами) в стек ВЕСЬ МАССИВ


--------------------
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 14:28
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dxp @ Jan 29 2007, 16:57) *
Цитата(prottoss @ Jan 29 2007, 14:38) *
И даже массив мона))) Ежели правильна приготовить smile.gif

Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?


2 dxp:
так в итоге - Ваш вердикт: Возможно ли массив передать в функцию как аргумент функции?


--------------------
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jan 30 2007, 14:40
Сообщение #50


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(prottoss @ Jan 30 2007, 12:15) *
Не надо флудить и злорадно хихикать smile.gif Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте

Вот что точно не надо так это говорить другим что им делать.
А теперь по теме. Рискну ответиь за dxp.

В С всегда можно предать пременную по значению, что вы и продемонстрировали. Но вы никогда не заставите компилятор предать в функцию массив пременных.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 14:41
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dryadae @ Jan 30 2007, 17:49) *
Кривой у вас компилятор blush.gif Писать с его помощью TSR и обработчики прерываний - смерти подобно.
И вообще, чтобы понять, надо не компилятором, а ручками. Тогда сразу станет ясна разница между Pascal и C, и то, что представляет из себя каждый тип.
Ахахааххааааахххххххххааааааааааааааааа biggrin.gif Вы в зеркало то давно смотрелись, нехай мобыть оно тоже кривое???


--------------------
Go to the top of the page
 
+Quote Post
dryadae
сообщение Jan 30 2007, 14:43
Сообщение #52


Частый гость
**

Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051



Цитата
Цитата(dryadae @ Jan 30 2007, 17:49) *

P.S. Кстати, команда call не заталкивает, а вызывает. По крайней мере, в 80x86 и Motorola 68K.
нюню, а это чьи слова?

Цитата
"Передать" - значит затолкнуть в стек ©
Так вот, строчка

Код
0000001A   ........           CALL    ?LONG_FARG_16_L07


Как раз заталкивает (Вашими словами) в стек ВЕСЬ МАССИВ

Странный Вы человек. Сами написали в комменте напротив CALL'а "заталкивает", и теперь ставите знак равенства между вашей нетночностью и моими словами huh.gif

Сообщение отредактировал dryadae - Jan 30 2007, 14:48
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 14:47
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(SpiritDance @ Jan 30 2007, 18:40) *
Цитата(prottoss @ Jan 30 2007, 12:15) *

Не надо флудить и злорадно хихикать smile.gif Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте

Вот что точно не надо так это говорить другим что им делать.
А теперь по теме. Рискну ответиь за dxp.

В С всегда можно предать пременную по значению, что вы и продемонстрировали. Но вы никогда не заставите компилятор предать в функцию массив пременных.
А я уже заставил - два раза показывал. Объявил массив array1 и передал его в качестве параметра функции fun. И не надо мне говорить - правильно это или не правильно и как я это сделал. Примите просто как факт - ЭТО СДЕЛАННО.


--------------------
Go to the top of the page
 
+Quote Post
dryadae
сообщение Jan 30 2007, 14:50
Сообщение #54


Частый гость
**

Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051



Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 15:01
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dryadae @ Jan 30 2007, 18:50) *
Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово.
Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив. Почитайте посты с самого начала. Тут же все бородатые и не очень дядьки на меня напали и объявили мне войну. Бугага biggrin.gif Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально.


--------------------
Go to the top of the page
 
+Quote Post
dryadae
сообщение Jan 30 2007, 15:05
Сообщение #56


Частый гость
**

Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051



Цитата(prottoss @ Jan 30 2007, 15:01) *
Цитата(dryadae @ Jan 30 2007, 18:50) *
Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово.
Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив.

Это не Си, это компайлер такой.

Цитата(prottoss @ Jan 30 2007, 15:01) *
Бугага biggrin.gif Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально.

О да. С весьма сомнительной совместимостью. Вспомнить хотя бы те же DDVT - понту было много, а толку? Где сейчас BC, и иже с ним?

Сообщение отредактировал dryadae - Jan 30 2007, 15:05
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 15:10
Сообщение #57


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(dryadae @ Jan 30 2007, 19:05) *
Это не Си, это компайлер такой.
Что Вы за компиляторы цепляетесь - я Вам Выше привел два кода и два листинга - первый под AVR на IAR C, второй под х86 на MS Visul Studio. Что, ОБА глючат???


--------------------
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Jan 30 2007, 15:12
Сообщение #58


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(prottoss @ Jan 30 2007, 14:47) *
Примите просто как факт - ЭТО СДЕЛАННО.

Суть в том что Вы сами до конца не понимаете что сделали с точки зрения семантики языка. Функция fun ну или math128 принимают в качестве значений не массивы, а пременные, определенного вами типа. Ну да Бог с Вами.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 15:24
Сообщение #59


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(SpiritDance @ Jan 30 2007, 19:12) *
Цитата(prottoss @ Jan 30 2007, 14:47) *

Примите просто как факт - ЭТО СДЕЛАННО.

Суть в том что Вы сами до конца не понимаете что сделали с точки зрения семантики языка. Функция fun ну или math128 принимают в качестве значений не массивы, а пременные, определенного вами типа. Ну да Бог с Вами.
Да нет, я все прекрасно понимаю. А суть в том, что Вы просто выбрали позицию большинсва, хотя все, кто учавствует в споре, я надеюсь, прекрасно понимают о чем говорят и что я имею ввиду.

Ну да и Бог с нами со всеми smile.gif


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 30 2007, 16:15
Сообщение #60


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Jan 30 2007, 16:03) *
Цитата(dxp @ Jan 30 2007, 16:51) *
Цитата(prottoss @ Jan 30 2007, 14:50) *

А ЧТО тогда было переданно в функцию? smile.gif

А Вы не знаете? СТРУКТУРА.
В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры

В функцию были переданы значения массива путем помещения их (значений) в структуру, но не массив. Массив в С/С++ нельзя передать по значению.


Цитата(prottoss @ Jan 30 2007, 16:03) *
Цитата(dxp @ Jan 30 2007, 16:51) *
Да? А я Вам сейчас покажу вашим же способом, что можно:
Код
    void f(int);
    int g();
    ...
    f(g());

Ась? КаковО??! wink.gif И таким способом я могу что угодно передавать куда угодно. Просто волшебство!
Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра.

О! Уже неплохо! Теперь экстаполируем этот пример на массивы и структуры: там сначала формируется временный объект типа структура (в стеке) и затем этот временный объект типа структура передается в функцию. Т.е. в функцию передается структура, а не массив.

Цитата(prottoss @ Jan 30 2007, 16:03) *
И что здесь волшебного? smile.gif . Ну если только это Ваши первые достижения в Си smile.gif

Послушайте, уважаемый, у меня было уже ...дцать поводов перейти на оценку Вашего скилла в обсуждаемом вопросе, но я от этого воздержался и в конце концов доброжелательно посоветовал Вам восполнить пробелы в знаниях по языку. Вы же вместо этого просто начали хамить. Что ж, если угодно оставаться в воинствующем неведении, это дело хозяйское, я как мог старался помочь и старался быть корректным. С меня достаточно, жизнь Вас лучше научит (когда придете устраиваться на работу и будете отвечать на эти вопросы на продемонстрированном уровне). Всего Вам.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 00:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01476 секунд с 7
ELECTRONIX ©2004-2016