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

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


Гуру
******

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



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

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

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

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

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

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

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

Функция принимает в качестве аргумента структуру, но я, правильно его приготовив, скормил его функции, всего то smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 30 2007, 16:55
Сообщение #62


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 17:13
Сообщение #63


Гуру
******

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



Цитата(Сергей Борщ @ Jan 30 2007, 20:55) *
Цитата(prottoss @ Jan 30 2007, 11:29) *

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

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


--------------------
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 30 2007, 18:06
Сообщение #64


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



protoss
Цитата
прекрасно понимают о чем говорят и что я имею ввиду.


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

U8 array1[100];

fun( array1, sizeof(array1) );
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 18:12
Сообщение #65


Гуру
******

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



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


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

U8 array1[100];

fun( array1, sizeof(array1) );

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


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


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

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



Цитата(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
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 19:01
Сообщение #67


Гуру
******

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



Цитата(prottoss @ Jan 30 2007, 22:12) *
Здесь передается указатель, и его размер (указателя) в байтах
Сорри smile.gif размер массива smile.gif


--------------------
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 31 2007, 02:17
Сообщение #68


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

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

Массив при передаче в функцию через указатель никуда не копируется и работаем мы сразу с оригиналом. При передаче через указатель неудобство лишь одно - нельзя узнать размер массива, поэтому его (размер массива) требуется передавать отдельно.
Go to the top of the page
 
+Quote Post

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

 


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


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