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

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


Гуру
******

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



Цитата(dxp @ Jan 29 2007, 16:57) *
Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?


Код
typedef struct
{
   UCHAR array[100];

} array_as_param;

...

UCHAR array1[100];

...

void fun(array_as_param param)
{
   UCHAR *ptr = (UCHAR *)&param;
    for(UCHAR i = 0; i < 10; i++)
       *ptr++ = 0;
}

...

void main(void)
{
   fun(*(array_as_param *)array1);

....

}


--------------------
Go to the top of the page
 
+Quote Post
mihask
сообщение Jan 29 2007, 13:46
Сообщение #17


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

Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905



Цитата(unichorn @ Jan 29 2007, 16:10) *
Примерчик можно, сам проэкт сдох чёрт знает когда, поэтому коммерческой ценности непредставляет (и соответственно недаделан).
Правда он под семейство MCU51(Keil2), но для понятия сути вещей сгодится.


PS:
ногами сильно непинать, делалось всё на скорую руку, хотя по датам можно понять оч медленно (изначально было ясно что прект загнётся).


Спасибо, обязательно посмотрю smile.gif
Go to the top of the page
 
+Quote Post
el34
сообщение Jan 29 2007, 14:15
Сообщение #18


инженер
****

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



2Abakt оч. рекомендую поглядеть
"Ted Jensen's Tutorial on Pointers and Arrays in C"
http://pw2.netcom.com/~tjensen/ptr/


--------------------
........поужинали вяленой рыбой, кот лежал рядом, молчали.......
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 29 2007, 15:36
Сообщение #19


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(prottoss @ Jan 29 2007, 16:13) *
Цитата(dxp @ Jan 29 2007, 16:57) *
Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?


Код
...

void main(void)
{
   fun(*(array_as_param *)array1);

....

}


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

void fun(array_as_param param), где array_as_param - это структура (как видно выше)

А код этот некрасивый, как и почти любой другой код, где используется ручное преобразование типов. Гораздо лучше, прозрачнее, логичнее и безопаснее было бы написать:

aray_as_param s = array1; fun(s);

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 29 2007, 16:02
Сообщение #20


Гуру
******

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



Цитата(dxp @ Jan 29 2007, 19:36) *
Цитата(prottoss @ Jan 29 2007, 16:13) *

Цитата(dxp @ Jan 29 2007, 16:57) *
Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?

Код
...


Здесь передается не массив, а структура:
void fun(array_as_param param), где array_as_param - это структура (как видно выше)
Здесь в качестве параметра передается ИМЕННО МАССИВ smile.gif , НО выдаем мы его за структуру smile.gif
Цитата(dxp @ Jan 29 2007, 19:36) *
А код этот некрасивый, как и почти любой другой код, где используется ручное преобразование типов. Гораздо лучше, прозрачнее, логичнее и безопаснее было бы написать:
aray_as_param s = array1; fun(s);
Вы хоть сами то читаете и проверяете то что пишите??? Эта строчка никогда работать не будет. Ну а так, вообще, красиво написанно smile.gif Может быть Вы имели ввиду это
Код
aray_as_param *s = (aray_as_param *)array1; fun(*s);

Цитата(dxp @ Jan 29 2007, 19:36) *
Вопрос стоял о том, как передать массив по значению в качестве аргумента.
Ответ получен - МОЖНО


--------------------
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 29 2007, 18:13
Сообщение #21


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(dxp @ Jan 29 2007, 19:36) *
Здесь передается не массив, а структура:
void fun(array_as_param param), где array_as_param - это структура (как видно выше)


Цитата(prottoss @ Jan 29 2007, 19:02) *
Здесь в качестве параметра передается ИМЕННО МАССИВ smile.gif , НО выдаем мы его за структуру smile.gif

Еще раз. Функция: void fun(array_as_param param), array_as_param - это структура, значит в функцию передается структура. У Вас формируется временный объект (в стеке) типа структура, который инициализируется значениями из массива. И передается структура. И внутри функции мы видим и тоже структуру. То, что Вы "выломали руки" компилятору своими насильными преобразованиями типов, ситуации не меняет. Это все, кстати, очень bad style и чревато прекрасными глюками при выравнивании. Про переносимость я вообще молчу. Яркий пример как никогда не надо писать код. Уж извините, но это так.

Цитата(dxp @ Jan 29 2007, 19:36) *
А код этот некрасивый, как и почти любой другой код, где используется ручное преобразование типов. Гораздо лучше, прозрачнее, логичнее и безопаснее было бы написать:
aray_as_param s = array1; fun(s);

Цитата(prottoss @ Jan 29 2007, 19:02) *
Вы хоть сами то читаете и проверяете то что пишите??? Эта строчка никогда работать не будет. Ну а так, вообще, красиво написанно smile.gif Может быть Вы имели ввиду это
Код
aray_as_param *s = (aray_as_param *)array1; fun(*s);

Нет, я имел в виду вот что:
Код
const int C_Size = 100;
struct array_as_param
{
    array_as_param(const char* const a)
    {
        for(int i = 0; i < C_Size; i++) array[i] = a[i];
    }

    char array[C_Size];
};

array_as_param s = array1; fun(s);

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


Цитата(prottoss @ Jan 29 2007, 19:02) *
Цитата(dxp @ Jan 29 2007, 19:36) *
Вопрос стоял о том, как передать массив по значению в качестве аргумента.
Ответ получен - МОЖНО

По аргументу реально передан не массив, а структура, что и есть верный ответ. С тем же, что есть способ передать значения массива в функцию, никто не спорил изначально. И даже показано более читабельное и безопасное решение.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 29 2007, 20:22
Сообщение #22


Гуру
******

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



Цитата(dxp @ Jan 29 2007, 16:57) *
Покажите как? Как передать массив по значению (в качестве аргумента) в функцию?
Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили:

массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Abakt
сообщение Jan 29 2007, 22:27
Сообщение #23


Участник
*

Группа: Новичок
Сообщений: 73
Регистрация: 10-01-07
Пользователь №: 24 292



Цитата(el34 @ Jan 29 2007, 14:15) *
2Abakt оч. рекомендую поглядеть
"Ted Jensen's Tutorial on Pointers and Arrays in C"
http://pw2.netcom.com/~tjensen/ptr/


Огромное спасибо! Читаю.
Go to the top of the page
 
+Quote Post
el34
сообщение Jan 29 2007, 22:49
Сообщение #24


инженер
****

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



Abakt>Огромное спасибо! Читаю.
ну разумеется спасибо Ted !!!!
рад, мне он оч. помог... думаю в си - самое вкусное это
указатели....(IMHO)....


--------------------
........поужинали вяленой рыбой, кот лежал рядом, молчали.......
Go to the top of the page
 
+Quote Post
dryadae
сообщение Jan 29 2007, 22:54
Сообщение #25


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

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



Передавать структуры в функцию - неправильно; стек не резиновый. Хорошая практика - malloc + typecast + указатель. Или просто указатель, если речь идёт о статике.

Сообщение отредактировал dryadae - Jan 29 2007, 22:55
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 29 2007, 23:04
Сообщение #26


Гуру
******

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



Цитата(dryadae @ Jan 30 2007, 02:54) *
Передавать структуры в функцию - неправильно; стек не резиновый. Хорошая практика - malloc + typecast + указатель. Или просто указатель, если речь идёт о статике.
Конечно НЕПРАВИЛЬНО. smile.gif НО - спросили КАК - я показал smile.gif


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 29 2007, 23:20
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(prottoss @ Jan 29 2007, 19:22) *
массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет smile.gif

Таки нет smile.gif. При передаче предмет передачи назывался структурой.
Если заниматься схоластикой, то я и простой int могу массивом битов назвать smile.gif, хотя он на самом деле
структура содержащая биты smile.gif smile.gif smile.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 29 2007, 23:51
Сообщение #28


Гуру
******

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



Цитата(zltigo @ Jan 30 2007, 03:20) *
Цитата(prottoss @ Jan 29 2007, 19:22) *

массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет smile.gif
Таки нет smile.gif . При передаче предмет передачи назывался структурой.
На этот счет есть кароший русский поговорка, цитирую: "На заборе ХYZ написанно, а там дрова лежат" smile.gif . Была задача, передать массив в функцию, как аргумент - передали


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


кекс
******

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



Цитата
Была задача, передать массив в функцию, как аргумент - передали

То что вы засунули внутрь функции
void fun(array_as_param param).. ,
массивом назвать нельзя...
Проверить легко (обращение внутри функции):

param[0] = 0;
даст ошибку, а это значит, что не массив был передан в функцию.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 30 2007, 01:15
Сообщение #30


Гуру
******

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



Цитата(defunct @ Jan 30 2007, 04:46) *
Цитата
Была задача, передать массив в функцию, как аргумент - передали

То что вы засунули внутрь функции
void fun(array_as_param param).. ,
массивом назвать нельзя...
Проверить легко (обращение внутри функции):
param[0] = 0;
даст ошибку, а это значит, что не массив был передан в функцию.
Это ровным счетом ничего не значит, потому что я могу сделать приведение к нужному мне типу. В конце концов, программу пишу я, и только я точно знаю что у меня внутри функции, а что с наружи. И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это smile.gif


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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