prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dryadae 0 30 января, 2007 Опубликовано 30 января, 2007 (изменено) · Жалоба А, просите, какое отношение поставленая задачка имеет к непередаче массива в качестве параметра??? Ну как решается? Естественно sizeof() структуры и memset() ну и что? А самое непосредственное. Вы же, когда будете вызывать memset() передадите указатель на тип char? Неправда - void * :) :) :) Да здесь я ошибся, но спор шел о приведении типов Передал именно указатель на область памяти которая в качестве подмножества содержит наряду с мусором и кусочки памяти относящиеся к структуре. И работать memset() будет с областью памяти обнулив и память относящуюся к тому что кото-то где-то считает относящуюся к структуре и всю прочую. Отлично. Тогда говоря Вашими терминами, я, в своем примере, в функцию, в качестве параметра, передал область памяти Вы передали то, что лежит в стеке. А в стеке лежит адрес (2 байта у near адресации, 4 у far/flat), и ничего больше :excl: "Передать" - значит затолкнуть в стек, а не засунуть в глобальную переменную, или куда-то там ещё... А вот тут Вы не правы, в стек, или куда там еще, заталкивается ВЕСЬ массив, так как он передан по ЗНАЧЕНИЮ. Привожу листинг, скомпилированно 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 :excl: P.S. Кстати, команда call не заталкивает, а вызывает. По крайней мере, в 80x86 и Motorola 68K. Изменено 30 января, 2007 пользователем dryadae Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Вы передали то, что лежит в стеке. А в стеке лежит адрес (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 Как раз заталкивает (Вашими словами) в стек ВЕСЬ МАССИВ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба И даже массив мона))) Ежели правильна приготовить :) Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? 2 dxp: так в итоге - Ваш вердикт: Возможно ли массив передать в функцию как аргумент функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Не надо флудить и злорадно хихикать :) Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте Вот что точно не надо так это говорить другим что им делать. А теперь по теме. Рискну ответиь за dxp. В С всегда можно предать пременную по значению, что вы и продемонстрировали. Но вы никогда не заставите компилятор предать в функцию массив пременных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Кривой у вас компилятор Писать с его помощью TSR и обработчики прерываний - смерти подобно. И вообще, чтобы понять, надо не компилятором, а ручками. Тогда сразу станет ясна разница между Pascal и C, и то, что представляет из себя каждый тип. Ахахааххааааахххххххххааааааааааааааааа Вы в зеркало то давно смотрелись, нехай мобыть оно тоже кривое??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dryadae 0 30 января, 2007 Опубликовано 30 января, 2007 (изменено) · Жалоба P.S. Кстати, команда call не заталкивает, а вызывает. По крайней мере, в 80x86 и Motorola 68K. нюню, а это чьи слова? "Передать" - значит затолкнуть в стек ©Так вот, строчка 0000001A ........ CALL ?LONG_FARG_16_L07 Как раз заталкивает (Вашими словами) в стек ВЕСЬ МАССИВ Странный Вы человек. Сами написали в комменте напротив CALL'а "заталкивает", и теперь ставите знак равенства между вашей нетночностью и моими словами :huh: Изменено 30 января, 2007 пользователем dryadae Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Не надо флудить и злорадно хихикать :) Если у Вас есть что сказать по теме, говорите, если нет - тихо наблюдайте Вот что точно не надо так это говорить другим что им делать. А теперь по теме. Рискну ответиь за dxp. В С всегда можно предать пременную по значению, что вы и продемонстрировали. Но вы никогда не заставите компилятор предать в функцию массив пременных. А я уже заставил - два раза показывал. Объявил массив array1 и передал его в качестве параметра функции fun. И не надо мне говорить - правильно это или не правильно и как я это сделал. Примите просто как факт - ЭТО СДЕЛАННО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dryadae 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово. Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив. Почитайте посты с самого начала. Тут же все бородатые и не очень дядьки на меня напали и объявили мне войну. Бугага Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dryadae 0 30 января, 2007 Опубликовано 30 января, 2007 (изменено) · Жалоба Да Бог с вами. Только накушаетесь вы со стеком, помяните моё слово. Да кто Вам сказал, что я ТАК делаю. Я лишь неосторожно сказал, что МОЖНО передать массив в качестве аргумента, и добавил - ежели правильно приготовить массив. Это не Си, это компайлер такой. Бугага Си, и тем паче с плюсиками, предоставляет очень много возможностей использовать тривиальные вещи не тривиально. О да. С весьма сомнительной совместимостью. Вспомнить хотя бы те же DDVT - понту было много, а толку? Где сейчас BC, и иже с ним? Изменено 30 января, 2007 пользователем dryadae Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Это не Си, это компайлер такой. Что Вы за компиляторы цепляетесь - я Вам Выше привел два кода и два листинга - первый под AVR на IAR C, второй под х86 на MS Visul Studio. Что, ОБА глючат??? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SpiritDance 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Примите просто как факт - ЭТО СДЕЛАННО. Суть в том что Вы сами до конца не понимаете что сделали с точки зрения семантики языка. Функция fun ну или math128 принимают в качестве значений не массивы, а пременные, определенного вами типа. Ну да Бог с Вами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Примите просто как факт - ЭТО СДЕЛАННО. Суть в том что Вы сами до конца не понимаете что сделали с точки зрения семантики языка. Функция fun ну или math128 принимают в качестве значений не массивы, а пременные, определенного вами типа. Ну да Бог с Вами. Да нет, я все прекрасно понимаю. А суть в том, что Вы просто выбрали позицию большинсва, хотя все, кто учавствует в споре, я надеюсь, прекрасно понимают о чем говорят и что я имею ввиду. Ну да и Бог с нами со всеми :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 50 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба А ЧТО тогда было переданно в функцию? :) А Вы не знаете? СТРУКТУРА. В функцию был передан массив по значению. Просто массив был приведен к типу обределенной мной структуры В функцию были переданы значения массива путем помещения их (значений) в структуру, но не массив. Массив в С/С++ нельзя передать по значению. Да? А я Вам сейчас покажу вашим же способом, что можно: void f(int); int g(); ... f(g()); Ась? КаковО??! ;) И таким способом я могу что угодно передавать куда угодно. Просто волшебство! Вот что Ваш код делает: Вызывается функция g, и возвращаемое ею значение типа int передается функции f в качестве входного параметра. О! Уже неплохо! Теперь экстаполируем этот пример на массивы и структуры: там сначала формируется временный объект типа структура (в стеке) и затем этот временный объект типа структура передается в функцию. Т.е. в функцию передается структура, а не массив. И что здесь волшебного? :) . Ну если только это Ваши первые достижения в Си :) Послушайте, уважаемый, у меня было уже ...дцать поводов перейти на оценку Вашего скилла в обсуждаемом вопросе, но я от этого воздержался и в конце концов доброжелательно посоветовал Вам восполнить пробелы в знаниях по языку. Вы же вместо этого просто начали хамить. Что ж, если угодно оставаться в воинствующем неведении, это дело хозяйское, я как мог старался помочь и старался быть корректным. С меня достаточно, жизнь Вас лучше научит (когда придете устраиваться на работу и будете отвечать на эти вопросы на продемонстрированном уровне). Всего Вам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться