|
|
  |
в чем прелесть указателей ? |
|
|
|
Jan 30 2007, 13:27
|

Гуру
     
Группа: Свой
Сообщений: 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 * Да здесь я ошибся, но спор шел о приведении типов Цитата(dryadae @ Jan 30 2007, 17:13)  Цитата(prottoss @ Jan 30 2007, 03:42)  Цитата(zltigo @ Jan 30 2007, 07:27)  Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памятиВы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/ flat), и ничего больше "Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё... А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно 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
--------------------
|
|
|
|
|
Jan 30 2007, 13:49
|
Частый гость
 
Группа: Новичок
Сообщений: 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 * Да здесь я ошибся, но спор шел о приведении типов Цитата(dryadae @ Jan 30 2007, 17:13)  Цитата(prottoss @ Jan 30 2007, 03:42)  Цитата(zltigo @ Jan 30 2007, 07:27)  Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памятиВы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/ flat), и ничего больше "Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё... А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно IAR 4.10B: Кривой у вас компилятор  Писать с его помощью 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 P.S. Кстати, команда call не заталкивает, а вызывает. По крайней мере, в 80x86 и Motorola 68K.
Сообщение отредактировал dryadae - Jan 30 2007, 13:55
|
|
|
|
|
Jan 30 2007, 14:12
|

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

|
Цитата(dryadae @ Jan 30 2007, 17:13)  Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/ flat), и ничего больше "Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё... push ebp mov ebp, esp start equ [ebp+4] ; вот где начинаются аргументы Вашей функции, порядок зависит от callspec Аххха  Тихо переметнулись на х86. ОК  , вот мой код для х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 Как раз заталкивает (Вашими словами) в стек ВЕСЬ МАССИВ
--------------------
|
|
|
|
|
Jan 30 2007, 14:40
|

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

|
Цитата(prottoss @ Jan 30 2007, 12:15)  Не надо флудить и злорадно хихикать  Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте Вот что точно не надо так это говорить другим что им делать. А теперь по теме. Рискну ответиь за dxp. В С всегда можно предать пременную по значению, что вы и продемонстрировали. Но вы никогда не заставите компилятор предать в функцию массив пременных.
--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
|
|
|
|
|
Jan 30 2007, 14:43
|
Частый гость
 
Группа: Новичок
Сообщений: 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'а "заталкивает", и теперь ставите знак равенства между вашей нетночностью и моими словами
Сообщение отредактировал dryadae - Jan 30 2007, 14:48
|
|
|
|
|
Jan 30 2007, 14:47
|

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

|
Цитата(SpiritDance @ Jan 30 2007, 18:40)  Цитата(prottoss @ Jan 30 2007, 12:15)  Не надо флудить и злорадно хихикать  Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте Вот что точно не надо так это говорить другим что им делать. А теперь по теме. Рискну ответиь за dxp. В С всегда можно предать пременную по значению, что вы и продемонстрировали. Но вы никогда не заставите компилятор предать в функцию массив пременных. А я уже заставил - два раза показывал. Объявил массив array1 и передал его в качестве параметра функции fun. И не надо мне говорить - правильно это или не правильно и как я это сделал. Примите просто как факт - ЭТО СДЕЛАННО.
--------------------
|
|
|
|
|
Jan 30 2007, 15:05
|
Частый гость
 
Группа: Новичок
Сообщений: 154
Регистрация: 7-03-06
Пользователь №: 15 051

|
Цитата(prottoss @ Jan 30 2007, 15:01)  Цитата(dryadae @ Jan 30 2007, 18:50)  Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово. Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив. Это не Си, это компайлер такой. Цитата(prottoss @ Jan 30 2007, 15:01)  Бугага  Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально. О да. С весьма сомнительной совместимостью. Вспомнить хотя бы те же DDVT - понту было много, а толку? Где сейчас BC, и иже с ним?
Сообщение отредактировал dryadae - Jan 30 2007, 15:05
|
|
|
|
|
Jan 30 2007, 15:24
|

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

|
Цитата(SpiritDance @ Jan 30 2007, 19:12)  Цитата(prottoss @ Jan 30 2007, 14:47)  Примите просто как факт - ЭТО СДЕЛАННО.
Суть в том что Вы сами до конца не понимаете что сделали с точки зрения семантики языка. Функция fun ну или math128 принимают в качестве значений не массивы, а пременные, определенного вами типа. Ну да Бог с Вами. Да нет, я все прекрасно понимаю. А суть в том, что Вы просто выбрали позицию большинсва, хотя все, кто учавствует в споре, я надеюсь, прекрасно понимают о чем говорят и что я имею ввиду. Ну да и Бог с нами со всеми
--------------------
|
|
|
|
|
Jan 30 2007, 16:15
|

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)  А ЧТО тогда было переданно в функцию?  А Вы не знаете? СТРУКТУРА. В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры В функцию были переданы значения массива путем помещения их (значений) в структуру, но не массив. Массив в С/С++ нельзя передать по значению.Цитата(prottoss @ Jan 30 2007, 16:03)  Цитата(dxp @ Jan 30 2007, 16:51)  Да? А я Вам сейчас покажу вашим же способом, что можно: Код void f(int); int g(); ... f(g()); Ась? КаковО??!  И таким способом я могу что угодно передавать куда угодно. Просто волшебство! Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра. О! Уже неплохо! Теперь экстаполируем этот пример на массивы и структуры: там сначала формируется временный объект типа структура (в стеке) и затем этот временный объект типа структура передается в функцию. Т.е. в функцию передается структура, а не массив. Цитата(prottoss @ Jan 30 2007, 16:03)  И что здесь волшебного?  . Ну если только это Ваши первые достижения в Си  Послушайте, уважаемый, у меня было уже ...дцать поводов перейти на оценку Вашего скилла в обсуждаемом вопросе, но я от этого воздержался и в конце концов доброжелательно посоветовал Вам восполнить пробелы в знаниях по языку. Вы же вместо этого просто начали хамить. Что ж, если угодно оставаться в воинствующем неведении, это дело хозяйское, я как мог старался помочь и старался быть корректным. С меня достаточно, жизнь Вас лучше научит (когда придете устраиваться на работу и будете отвечать на эти вопросы на продемонстрированном уровне). Всего Вам.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|