|
|
  |
в чем прелесть указателей ? |
|
|
|
Jan 29 2007, 13:46
|
Частый гость
 
Группа: Validating
Сообщений: 80
Регистрация: 7-12-05
Пользователь №: 11 905

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

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); Вопрос стоял о том, как передать массив по значению в качестве аргумента. А не о том, как переправить значения массива в функцию. Т.ч., как говорилось, массив всегда в функцию передается через указатель.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 29 2007, 16:02
|

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

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)  Здесь в качестве параметра передается ИМЕННО МАССИВ  , НО выдаем мы его за структуру  Еще раз. Функция: 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)  Вы хоть сами то читаете и проверяете то что пишите??? Эта строчка никогда работать не будет. Ну а так, вообще, красиво написанно  Может быть Вы имели ввиду это Код 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)  Вопрос стоял о том, как передать массив по значению в качестве аргумента. Ответ получен - МОЖНО По аргументу реально передан не массив, а структура, что и есть верный ответ. С тем же, что есть способ передать значения массива в функцию, никто не спорил изначально. И даже показано более читабельное и безопасное решение.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jan 29 2007, 22:27
|
Участник

Группа: Новичок
Сообщений: 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/ Огромное спасибо! Читаю.
|
|
|
|
|
Jan 30 2007, 00:46
|

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

|
Цитата Была задача, передать массив в функцию, как аргумент - передали То что вы засунули внутрь функции void fun(array_as_param param).. , массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию.
|
|
|
|
|
Jan 30 2007, 01:15
|

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

|
Цитата(defunct @ Jan 30 2007, 04:46)  Цитата Была задача, передать массив в функцию, как аргумент - передали То что вы засунули внутрь функции void fun(array_as_param param).. , массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Это ровным счетом ничего не значит, потому что я могу сделать приведение к нужному мне типу. В конце концов, программу пишу я, и только я точно знаю что у меня внутри функции, а что с наружи. И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это
--------------------
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|