powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача массивов в функции
23 сообщений из 73, страница 3 из 3
Передача массивов в функции
    #38541444
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Код: plaintext
1.
Указатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.


Тут идет речь про такое:
Код: plaintext
1.
2.
3.
int a, b;
a = get_a(); // возвращается одно значение
get_a_b(&a, &b); // возвращается несколько значений через аргументы-указатели
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541446
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЕсли я не ошибаюсь, то K&R пишут что указатели в частности предназначены для возврата нескольких значений из функции.

Старница 98. Строчки 1-2.
K&RУказатели в качестве аргументов обычно используются в функциях, которые должны возвращать более одного значения.


Да, если хочется вернуть более одного значения из функции, можно воспользоваться указателями. Например деление с остатком:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
void div( int a, int b, int *quotient, int *reminder) {
   *quotient = a / b;
   *reminder = a - (b* (*quotient) );
}

int main (...) {
   int x, y;
   int q, r;

   x = 10; y = 3;
   div(x, y, &q, &r);
   printf("%d = %d*%d+%d\n", x, y, q, r);
   return 0;
}
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541469
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ребята, это не возврат из функции чего-то. Это - модификация параметров, переданных по ссылке. давайте не будем путать понятия, даже если у Кернигана так написано.

В С вообще нельзя вернуть из функции несколько значений. одно или 0.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541492
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv давайте не будем путать понятия, даже если у Кернигана так написано.

Простите, но если именовать книгу одной фамилией, то скорее :"если у Ритчи так написано", авторство языка принадлежит ему(и Кену Томпсону ). Может быть Вы хотели сказать что в определение слова "возврат из функции" авторы вложили более широкий смысл ?

И что мы понимаем под возвратом значений из функции ? Я не знаю чёткого определения. f e:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int array[10]=smth_func();//вот эта функция по вашему возвращает значение
int* Parray=array;//либо ...=&array[0];
void smth_func_2(int* a)
{
for(int i=0;i<10;i++)
     *(a+i)=i;
}

smth_func_2(Parray);//а вот эта функция по вашему не возвращает значение



Вы бы сделали аналогичные комментарии к этим двум функциям ?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541552
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
void smth_func_2(int* a)
{
for(int i=0;i<10;i++)
     *(a+i)=i;
}
smth_func_2(Parray);//а вот эта функция по вашему не возвращает значение

естественно функция smth_func_2 не возвращает значение, ведь тип возвращаемого значения у неё void .
Другое дело, что она модифицирует свой входной параметр. Это называется побочным эффектом , а не возвращением значения.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541566
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы назвал это косвенный возврат значений, или ссылочный возврат значений. Нужно подумать, как лучше. В широком смысле этого слова функция возвращает значения, но неявно. Где первоисточник этого словосочетания "побочный эффект" ?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541597
Господа, опомнитесь, начали за C++, а кончаете за Ричи. Охота вернуть несколько значений - см. std::tuple tie make_tuple, правда в коде это все равно выродится скорее всего в заполнение функцией буфера по переданному ей адресу.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541655
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury. Где первоисточник этого словосочетания "побочный эффект" ?
там где определяется "чистая функция"
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541736
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ бы назвал это косвенный возврат значений, или ссылочный возврат значений. Нужно подумать, как лучше. В широком смысле этого слова функция возвращает значения, но неявно. Где первоисточник этого словосочетания "побочный эффект" ?

Функция --она на то и функция, чтобы возвращать. Вотэто она и возвращает. Явно.
А всё остальное -- это побочные эффекты.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541740
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZiv давайте не будем путать понятия, даже если у Кернигана так написано.

Простите, но если именовать книгу одной фамилией, то скорее :"если у Ритчи так написано", авторство языка принадлежит ему(и Кену Томпсону ). Может быть Вы хотели сказать что в определение слова "возврат из функции" авторы вложили более широкий смысл ?

И что мы понимаем под возвратом значений из функции ? Я не знаю чёткого определения. f e:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
int array[10]=smth_func();//вот эта функция по вашему возвращает значение
int* Parray=array;//либо ...=&array[0];
void smth_func_2(int* a)
{
for(int i=0;i<10;i++)
     *(a+i)=i;
}

smth_func_2(Parray);//а вот эта функция по вашему не возвращает значение



Вы бы сделали аналогичные комментарии к этим двум функциям ?


Да. Первая -- возвращает, вторая -- нет.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541781
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryГде первоисточник этого словосочетания "побочный эффект" ?Я ссылку дал, чукча не-читатель?
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541791
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
не вырывайте из контекста, пожалуйста. я написал:
SВообще, насколько я понял, объявление массива, например:
int a[10]

значит, что вы объявили int* a(K&R пишут что имя массива является указательным выражением-страница 100), и это указательное выражение, хранит в себе адрес начала массива, и далее мы говорим, что одно значение будет занимать 4 байта(в зависимости от архитектуры), и гарантировано таких значений будет 10(впрочем с этим я не уверен, может он их все будет индексировать и считывать значения с 4 байт).


Про гарантированных 40 байт я написал.



Вот ведь блин... Вырываю я...

Ничего я не вырываю, вот весь этот абзац и является полным бредом.
"имя массива является указательным выражением" --- имя массива в виде выражения, а не выражение объявления переменной типа массива.
Разницу чувствуешь ? Это два разных совсем выражения.

Код: plaintext
1.
int a[10];



объявляет массив из 10 элементов типа int, с именем 'a'.
Это значит:
выделяется 10*sizeof(int) последовательно идущих байт в области памяти, соответствующей данному классу памяти.

в соответствующий словарь имён заносится имя 'a'

в памать размещается значение согласно инициализатору (тут инициализатора нет, поэтому зависит от класса памяти)

Код: plaintext
1.
int *b = a;



объявляет указатель на int, с именем 'b'.
Это значит:

выделяется sizeof(int*) - 4 или 8 байт.

в соответствующий словарь имён заносится имя 'b'

в указатель заносится адрес первого элемента массива 'a'

И вот только тут (!!) срабатывает то самое, о чём ты пытался нам донести -- компилятор видит выражение, содержащее символ названия массива и преобразует это выражение в указатель на первый элемент этого массива.
Еще раз, боле у указателей и массивов нет ничего общего.
(А, не, ещё есть дурацкая нотация параметров функций-указателей в виде массива без указанной размерности, с которой начался топик, об этом -- отдельно).

SashaMercuryMasterZivпропущено...

это только кажется. а когда кажется, надо креститься, тогда нечисть сгинет...

А разве не вымышленное ? Абстракция, накрученная. В K&R до 102 страницы я не встретил чёткого определения массива, и возможно это неопределяемое понятие в C, как и понятие множества в математике. Не буду приводить ссылки на функан, википедии вам хватит link_for_MasterZiv

и, ВЫ снова вырываете из контекста.Вы разорвали мою фразу я написал,

SПотому, как мне кажется, массив это такое вымышленное понятие, несколько искусственное, вообще ошибка, если кто-то говорит о них, без указателей, нужно начинать объяснение с указателей, и как частный случай их использования рассказывать про массивы




Хочется ответить словами "поэта":
"Ты суслика не видишь ? А суслик есть!"
Так и тут. А определение массива я думаю ты легко найдёшь в стандарте языка (С, С++).

SashaMercuryОдно из трёх утверждений вам понравилось ?Уже неплохо.
не одно и то же. Указатель понятие фундаментальное в фон-неймановской архитектуре, а массив абстракция

Указатель и массив -- в данном случае понятия языка программирования . В архитектуре есть адреса памяти и слова и байты памяти.
И далеко не во всех языках программирования есть указатели и ссылки. Да и массивы тоже
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541875
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a


че за бред? int* 4 байта, int [10] - 40.
есть разница?


Код: plaintext
1.
int a[10]



значит, что вы объявили int* a
Код: plaintext
1.
int* a = new int[10]:



Только память будет выделена возможно по разному
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38541883
Фотография Macks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivИ далеко не во всех языках программирования есть указатели и ссылки. Да и массивы тоже


Язык Элочки Людоедки.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542036
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Macks
Код: plaintext
1.
int a[10];


значит, что вы объявили int* a
Код: plaintext
1.
int* a = new int[10]:

нет, не значит. Это разные конструкции. В том числе и потому, что память ОБЯЗАТЕЛЬНО будет выделена по разному.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542049
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MacksMasterZivВообще, насколько я понял, объявление массива, например:
Код: plaintext
1.
int a[10]


значит, что вы объявили int* a


че за бред? int* 4 байта, int [10] - 40.
есть разница?


Код: plaintext
1.
int a[10]



значит, что вы объявили int* a
Код: plaintext
1.
int* a = new int[10]:



Только память будет выделена возможно по разному

О, ещё один ...

Ладно, переубеждать не буду, живите, до первого собеседования...
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542129
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдо первого собеседования...
там мож про деструкторы расскажут....
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542987
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,
вам нужно быть несколько более уравновешенным. если у вас какие-то проблемы в личной жизни, или на работе, не стоит своё чёрное настроение переводить сюда.

+Изопропил

первоисточник я встретил сегодня в K&R, старница 56, глава 2.12 Старшинство и порядок вычислений.

Администраторы форума, я прошу вас обратить внимание на хамство egorych, его не стоит банить конечно, но обратить внимание, мне кажется, стоит

Модератор: Обратили, обратили, не беспокойся. Лучше бы ты сам на него меньше внимания обращал.

egorychЯ ссылку дал, чукча не-читатель?

ваша ссылка не первоисточник.

И описания в K&R и на том сайте различны, я больше доверяю K&R.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38542992
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychестественно функция smth_func_2 не возвращает значение, ведь тип возвращаемого значения у неё void .
Другое дело, что она модифицирует свой входной параметр. Это называется побочным эффектом , а не возвращением значения.
MasterZivФункция --она на то и функция, чтобы возвращать. Вотэто она и возвращает. Явно.
А всё остальное -- это побочные эффекты.
Вот вы докопались.
Вы не видите что-ли разницу между алгоритмом и реализацией на языке программирования?

Если я напишу программу которая выводит на экран картинку, то в языке С/С++ она тоже не выводит картинку, а вызывает функции, присваивает, читает переменные и т.д. Нету вывода картинок в С.
Но если подняться на более высокий уровень, то все это вместе реализует алгоритм "вывод картинки".

В исходной цитате К/Р речь идет о возврате нескольких значений алгоритмом, а не о возврате значений как синтаксической конструкции С. И о том, что на С, такой возврат обычно реализован через модификацию значений через аргументы-указатели.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543019
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

я думаю что в данном случае вы правы. Но первоначально мне так не казалось.

а по поводу побочного эффекта, не вижу смысла продолжать дискуссию. Мне понравилось слово "явно", значит моя мысль хотя бы немного, но имеет право на жизнь.
И действительно, возможно у нас несколько разная грань между алгоритмом и программным кодом, в связи с этим разное понимание общих вопросов.

Я стал понимать больше и шире, спасибо.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543087
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВот вы докопались.я то думал, он разобраться хочет, а он, видишь ли, ябеда оказался ))
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543277
Фотография Сергей Силкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИ обязательно прочти Таненбаума!Абсолютно согласен. Уже официально признано классикой ИТ.

Кстати, его книги свободно гуляют по Сети, так что их абсолютно без проблем можно найти и скачать совершенно бесплатно на множестве серверов. (Не сочтите за труд – поищите сами.)

Если будут предлагать заплатить деньги или ввести номер телефона для скачивания – не соглашайтесь, ищите бесплатный ресурс с книгами, каковых есть множество.

Если для проверки, что вы не робот, потребуется ввести ответ на какой-нибудь простой вопрос – это можно сделать, это совершенно бесплатно и совсем не трудно.
...
Рейтинг: 0 / 0
Передача массивов в функции
    #38543298
Фотография Сергей Силкин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виноват, предыдущее сообщение не в той ветке опубликовал. Но, поскольку сообщение общего характера, а автор обеих веток один и тот же человек – думаю, он поймёт, к чему это. Другие товарищи, думаю, тоже сообразят – грамотные же люди…
...
Рейтинг: 0 / 0
23 сообщений из 73, страница 3 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Передача массивов в функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]