Перейти к содержанию
    

в чем прелесть указателей ?

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

 

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);

....

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость mihask
Примерчик можно, сам проэкт сдох чёрт знает когда, поэтому коммерческой ценности непредставляет (и соответственно недаделан).

Правда он под семейство MCU51(Keil2), но для понятия сути вещей сгодится.

 

 

PS:

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

 

Спасибо, обязательно посмотрю :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

...

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

....

}

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

 

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

 

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

 

aray_as_param s = array1; fun(s);

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

...

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

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);

Вопрос стоял о том, как передать массив по значению в качестве аргумента.
Ответ получен - МОЖНО

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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);

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

 

 

Вопрос стоял о том, как передать массив по значению в качестве аргумента.
Ответ получен - МОЖНО

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2Abakt оч. рекомендую поглядеть

"Ted Jensen's Tutorial on Pointers and Arrays in C"

http://pw2.netcom.com/~tjensen/ptr/

 

Огромное спасибо! Читаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Abakt>Огромное спасибо! Читаю.

ну разумеется спасибо Ted !!!!

рад, мне он оч. помог... думаю в си - самое вкусное это

указатели....(IMHO)....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем dryadae

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Передавать структуры в функцию - неправильно; стек не резиновый. Хорошая практика - malloc + typecast + указатель. Или просто указатель, если речь идёт о статике.
Конечно НЕПРАВИЛЬНО. :) НО - спросили КАК - я показал :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Таки нет :). При передаче предмет передачи назывался структурой.

Если заниматься схоластикой, то я и простой int могу массивом битов назвать :), хотя он на самом деле

структура содержащая биты :) :) :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

То что вы засунули внутрь функции

void fun(array_as_param param).. ,

массивом назвать нельзя...

Проверить легко (обращение внутри функции):

 

param[0] = 0;

даст ошибку, а это значит, что не массив был передан в функцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

То что вы засунули внутрь функции

void fun(array_as_param param).. ,

массивом назвать нельзя...

Проверить легко (обращение внутри функции):

param[0] = 0;

даст ошибку, а это значит, что не массив был передан в функцию.

Это ровным счетом ничего не значит, потому что я могу сделать приведение к нужному мне типу. В конце концов, программу пишу я, и только я точно знаю что у меня внутри функции, а что с наружи. И если мне вздумалось передать массив как аргумент, то я из кожи вылезу но сделаю это :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...