Перейти к содержанию
    

в чем прелесть указателей ?

А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char?

Неправда - void * :) :) :)

Да здесь я ошибся, но спор шел о приведении типов

 

Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет

с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.

Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше :excl:

"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...

А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что?
А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char?

Неправда - void * :) :) :)

Да здесь я ошибся, но спор шел о приведении типов

 

Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет

с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую.

Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше :excl:

"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...

А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно IAR 4.10B:

Кривой у вас компилятор :blush: Писать с его помощью 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:

 

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

Изменено пользователем dryadae

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше :excl:

"Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё...

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  /* о, опять, надо Билу Гею пожаловаться!!! */

 

 

 

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

 

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

 

0000001A   ........           CALL    ?LONG_FARG_16_L07

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И даже массив мона))) Ежели правильна приготовить :)

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

 

2 dxp:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот что точно не надо так это говорить другим что им делать.

А теперь по теме. Рискну ответиь за dxp.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кривой у вас компилятор :blush: Писать с его помощью TSR и обработчики прерываний - смерти подобно.

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

Ахахааххааааахххххххххааааааааааааааааа :biggrin: Вы в зеркало то давно смотрелись, нехай мобыть оно тоже кривое???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

нюню, а это чьи слова?

 

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

 

0000001A   ........           CALL    ?LONG_FARG_16_L07

 

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

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

Изменено пользователем dryadae

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Вот что точно не надо так это говорить другим что им делать.

А теперь по теме. Рискну ответиь за dxp.

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово.
Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив. Почитайте посты с самого начала. Тут же все бородатые и не очень дядьки на меня напали и объявили мне войну. Бугага :biggrin: Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово.
Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив.

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

 

Бугага :biggrin: Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально.

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

Изменено пользователем dryadae

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не Си, это компайлер такой.
Что Вы за компиляторы цепляетесь - я Вам Выше привел два кода и два листинга - первый под AVR на IAR C, второй под х86 на MS Visul Studio. Что, ОБА глючат???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Ну да и Бог с нами со всеми :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

А Вы не знаете? СТРУКТУРА.

В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры

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

 

 

Да? А я Вам сейчас покажу вашим же способом, что можно:

    void f(int);
    int g();
    ...
    f(g());

Ась? КаковО??! ;) И таким способом я могу что угодно передавать куда угодно. Просто волшебство!

Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра.

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

 

И что здесь волшебного? :) . Ну если только это Ваши первые достижения в Си :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...