prottoss 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? typedef struct { UCHAR array[100]; } array_as_param; ... UCHAR array1[100]; ... void fun(array_as_param param) { UCHAR *ptr = (UCHAR *)¶m; for(UCHAR i = 0; i < 10; i++) *ptr++ = 0; } ... void main(void) { fun(*(array_as_param *)array1); .... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость mihask 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Примерчик можно, сам проэкт сдох чёрт знает когда, поэтому коммерческой ценности непредставляет (и соответственно недаделан). Правда он под семейство MCU51(Keil2), но для понятия сути вещей сгодится. PS: ногами сильно непинать, делалось всё на скорую руку, хотя по датам можно понять оч медленно (изначально было ясно что прект загнётся). Спасибо, обязательно посмотрю :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
el34 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба 2Abakt оч. рекомендую поглядеть "Ted Jensen's Tutorial on Pointers and Arrays in C" http://pw2.netcom.com/~tjensen/ptr/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 51 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? ... void main(void) { fun(*(array_as_param *)array1); .... } Здесь передается не массив, а структура: void fun(array_as_param param), где array_as_param - это структура (как видно выше) А код этот некрасивый, как и почти любой другой код, где используется ручное преобразование типов. Гораздо лучше, прозрачнее, логичнее и безопаснее было бы написать: aray_as_param s = array1; fun(s); Вопрос стоял о том, как передать массив по значению в качестве аргумента. А не о том, как переправить значения массива в функцию. Т.ч., как говорилось, массив всегда в функцию передается через указатель. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? ... Здесь передается не массив, а структура: void fun(array_as_param param), где array_as_param - это структура (как видно выше) Здесь в качестве параметра передается ИМЕННО МАССИВ :) , НО выдаем мы его за структуру :) А код этот некрасивый, как и почти любой другой код, где используется ручное преобразование типов. Гораздо лучше, прозрачнее, логичнее и безопаснее было бы написать: aray_as_param s = array1; fun(s); Вы хоть сами то читаете и проверяете то что пишите??? Эта строчка никогда работать не будет. Ну а так, вообще, красиво написанно :) Может быть Вы имели ввиду этоaray_as_param *s = (aray_as_param *)array1; fun(*s); Вопрос стоял о том, как передать массив по значению в качестве аргумента. Ответ получен - МОЖНО Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 51 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Здесь передается не массив, а структура: void fun(array_as_param param), где array_as_param - это структура (как видно выше) Здесь в качестве параметра передается ИМЕННО МАССИВ :) , НО выдаем мы его за структуру :) Еще раз. Функция: void fun(array_as_param param), array_as_param - это структура, значит в функцию передается структура. У Вас формируется временный объект (в стеке) типа структура, который инициализируется значениями из массива. И передается структура. И внутри функции мы видим и тоже структуру. То, что Вы "выломали руки" компилятору своими насильными преобразованиями типов, ситуации не меняет. Это все, кстати, очень bad style и чревато прекрасными глюками при выравнивании. Про переносимость я вообще молчу. Яркий пример как никогда не надо писать код. Уж извините, но это так. А код этот некрасивый, как и почти любой другой код, где используется ручное преобразование типов. Гораздо лучше, прозрачнее, логичнее и безопаснее было бы написать: aray_as_param s = array1; fun(s); Вы хоть сами то читаете и проверяете то что пишите??? Эта строчка никогда работать не будет. Ну а так, вообще, красиво написанно :) Может быть Вы имели ввиду это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 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Покажите как? Как передать массив по значению (в качестве аргумента) в функцию? Я показал, КАК МОЖНО ПЕРЕДАТЬ МАССИВ ПО ЗНАЧЕНИЮ, то бишь, В КАЧЕСТВЕ АРГУМЕНТА. Я не говорю, что я так делаю, я лишь показал то, что Вы просили: массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Abakt 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба 2Abakt оч. рекомендую поглядеть "Ted Jensen's Tutorial on Pointers and Arrays in C" http://pw2.netcom.com/~tjensen/ptr/ Огромное спасибо! Читаю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
el34 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Abakt>Огромное спасибо! Читаю. ну разумеется спасибо Ted !!!! рад, мне он оч. помог... думаю в си - самое вкусное это указатели....(IMHO).... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dryadae 0 29 января, 2007 Опубликовано 29 января, 2007 (изменено) · Жалоба Передавать структуры в функцию - неправильно; стек не резиновый. Хорошая практика - malloc + typecast + указатель. Или просто указатель, если речь идёт о статике. Изменено 29 января, 2007 пользователем dryadae Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба Передавать структуры в функцию - неправильно; стек не резиновый. Хорошая практика - malloc + typecast + указатель. Или просто указатель, если речь идёт о статике. Конечно НЕПРАВИЛЬНО. :) НО - спросили КАК - я показал :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет :) Таки нет :). При передаче предмет передачи назывался структурой. Если заниматься схоластикой, то я и простой int могу массивом битов назвать :), хотя он на самом деле структура содержащая биты :) :) :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 29 января, 2007 Опубликовано 29 января, 2007 · Жалоба массив array1 был передан в функцию в качестве аргумента - так? Или не так? Не надо объяснять - скажите - да или нет :)Таки нет :) . При передаче предмет передачи назывался структурой. На этот счет есть кароший русский поговорка, цитирую: "На заборе ХYZ написанно, а там дрова лежат" :) . Была задача, передать массив в функцию, как аргумент - передали Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Была задача, передать массив в функцию, как аргумент - передали То что вы засунули внутрь функции void fun(array_as_param param).. , массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 30 января, 2007 Опубликовано 30 января, 2007 · Жалоба Была задача, передать массив в функцию, как аргумент - передали То что вы засунули внутрь функции void fun(array_as_param param).. , массивом назвать нельзя... Проверить легко (обращение внутри функции): param[0] = 0; даст ошибку, а это значит, что не массив был передан в функцию. Это ровным счетом ничего не значит, потому что я могу сделать приведение к нужному мне типу. В конце концов, программу пишу я, и только я точно знаю что у меня внутри функции, а что с наружи. И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться