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

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

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

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


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

Странный Вы человек. Сами написали в комменте напротив CALL'а "заталкивает", и теперь ставите знак равенства между вашей нетночностью и моими словами huh.gif
prottoss
Цитата(SpiritDance @ Jan 30 2007, 18:40) *
Цитата(prottoss @ Jan 30 2007, 12:15) *

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

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

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

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

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

О да. С весьма сомнительной совместимостью. Вспомнить хотя бы те же DDVT - понту было много, а толку? Где сейчас BC, и иже с ним?
prottoss
Цитата(dryadae @ Jan 30 2007, 19:05) *
Это не Си, это компайлер такой.
Что Вы за компиляторы цепляетесь - я Вам Выше привел два кода и два листинга - первый под AVR на IAR C, второй под х86 на MS Visul Studio. Что, ОБА глючат???
SpiritDance
Цитата(prottoss @ Jan 30 2007, 14:47) *
Примите просто как факт - ЭТО СДЕЛАННО.

Суть в том что Вы сами до конца не понимаете что сделали с точки зрения семантики языка. Функция fun ну или math128 принимают в качестве значений не массивы, а пременные, определенного вами типа. Ну да Бог с Вами.
prottoss
Цитата(SpiritDance @ Jan 30 2007, 19:12) *
Цитата(prottoss @ Jan 30 2007, 14:47) *

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

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

Ну да и Бог с нами со всеми smile.gif
dxp
Цитата(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

Послушайте, уважаемый, у меня было уже ...дцать поводов перейти на оценку Вашего скилла в обсуждаемом вопросе, но я от этого воздержался и в конце концов доброжелательно посоветовал Вам восполнить пробелы в знаниях по языку. Вы же вместо этого просто начали хамить. Что ж, если угодно оставаться в воинствующем неведении, это дело хозяйское, я как мог старался помочь и старался быть корректным. С меня достаточно, жизнь Вас лучше научит (когда придете устраиваться на работу и будете отвечать на эти вопросы на продемонстрированном уровне). Всего Вам.
prottoss
Цитата(dxp @ Jan 30 2007, 20:15) *
Послушайте, уважаемый, у меня было уже ...дцать поводов перейти на оценку Вашего скилла в обсуждаемом вопросе, но я от этого воздержался и в конце концов доброжелательно посоветовал Вам восполнить пробелы в знаниях по языку. Вы же вместо этого просто начали хамить. Что ж, если угодно оставаться в воинствующем неведении, это дело хозяйское, я как мог старался помочь и старался быть корректным. С меня достаточно, жизнь Вас лучше научит (когда придете устраиваться на работу и будете отвечать на эти вопросы на продемонстрированном уровне). Всего Вам.
Извиняюсь, если я обидел Вас своими репликами
Цитата(dxp @ Jan 30 2007, 16:51) *
В функцию были переданы значения массива путем помещения их (значений) в структуру, но не массив. Массив в С/С++ нельзя передать по значению.
Масло масленное. Правильно, массив нельзя, структуру можно. Теперь, если мы адрес массива приведем к типу структуры мы, фактически, передаем массив в функцию, точнее его копию. И, если и с наружи и внутри функции все знают, что под оберткой передаваемой переменой, то все хлопают в ладоши - массив передан по значению.

Еще раз повторюсь. Функция принимает по значению структуру, но мы подсунули ей массив, под видом структуры.

И еще раз повторю начало нашего никчемного спора:

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

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

prottoss: ...показываю...

dxp: Здесь передается не массив, а структура...

Функция принимает в качестве аргумента структуру, но я, правильно его приготовив, скормил его функции, всего то smile.gif
Сергей Борщ
Цитата(prottoss @ Jan 30 2007, 11:29) *
Цитата(Сергей Борщ @ Jan 30 2007, 16:13) *
Какие указатели? "Какой такой павлин-мавлин?"(с)
Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 }
Читайте по губам что спрашивалось, и на что был дан ответ:
Цитата(prottoss @ Jan 30 2007, 00:36) *
Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю.
prottoss
Цитата(Сергей Борщ @ Jan 30 2007, 20:55) *
Цитата(prottoss @ Jan 30 2007, 11:29) *

Цитата(Сергей Борщ @ Jan 30 2007, 16:13) *
Какие указатели? "Какой такой павлин-мавлин?"(с)
Вообще то говорилось, что структура попадает в функцию по значению, попробуйте присвоить ей { 0 }
Читайте по губам что спрашивалось, и на что был дан ответ:
Цитата(prottoss @ Jan 30 2007, 00:36) *
Вам необходимо, что бы все поля данной структуры были равны, допустим, нулю.

Здесь подразумевалось, что структура передается в функцию, а не объявляется внутри функции
defunct
protoss
Цитата
прекрасно понимают о чем говорят и что я имею ввиду.


Тогда, что с вашей точки зрения передается здесь:
Код
void fun(U8 *param, U16 size)
{
    ... работаем с массивом param
    вместо sizeof используем переданный size
}

U8 array1[100];

fun( array1, sizeof(array1) );
prottoss
Цитата(defunct @ Jan 30 2007, 22:06) *
protoss
Цитата
прекрасно понимают о чем говорят и что я имею ввиду.


Тогда, что с вашей точки зрения передается здесь:
Код
void fun(U8 *param, U16 size)
{
    ... работаем с массивом param
    вместо sizeof используем переданный size
}

U8 array1[100];

fun( array1, sizeof(array1) );

Здесь передается указатель, и его размер (указателя) в байтах
dryadae
Цитата(prottoss @ Jan 30 2007, 18:12) *
Цитата(defunct @ Jan 30 2007, 22:06) *
protoss
Цитата
прекрасно понимают о чем говорят и что я имею ввиду.


Тогда, что с вашей точки зрения передается здесь:
Код
void fun(U8 *param, U16 size)
{
    ... работаем с массивом param
    вместо sizeof используем переданный size
}

U8 array1[100];

fun( array1, sizeof(array1) );

Здесь передается указатель, и его размер (указателя) в байтах

Размер указателя всегда один biggrin.gif
На 32-битной архитектуре он равен 4-м байтам, на 16-битной - двум. Без вариантов smile.gif smile.gif smile.gif Кроме случая far.

P.S. Размер указателя на указатель - тоже glare.gif
prottoss
Цитата(prottoss @ Jan 30 2007, 22:12) *
Здесь передается указатель, и его размер (указателя) в байтах
Сорри smile.gif размер массива smile.gif
defunct
Цитата(prottoss @ Jan 30 2007, 18:01) *
Цитата(prottoss @ Jan 30 2007, 22:12) *
Здесь передается указатель, и его размер (указателя) в байтах
Сорри smile.gif размер массива smile.gif

Верно. Указатель и размер.
Указатель в C это есть безразмерный массив (за исключением указателя на void)

Относительно моего примера.
Массив мы передали в функцию - нет он остался где-то снаружи.
Работать внутри функции с этим массивом можем - да. Как с массивом - да.
В чем же отличие от передачи структуры - в том, что структура передается через стек и будет локальной переменной внутри функции, т.е. все ее поля будут продублированы и при изменении ее полей внутри функции оригинал не изменится. После выхода из функции эта структура автоматически уничтожится (Вы уже в курсе, даже продемонстрировали asm листинги).

Массив при передаче в функцию через указатель никуда не копируется и работаем мы сразу с оригиналом. При передаче через указатель неудобство лишь одно - нельзя узнать размер массива, поэтому его (размер массива) требуется передавать отдельно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.