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

 
 
> Возврат структуры из функции, косяк Кернигана-Ричи
ViKo
сообщение Feb 9 2015, 07:04
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Перечитывая книжку классиков по программированию на языке С, обнаружил, что они возвращают из функции целую структуру. Конкретно, структуру из двух координат точки. Как это (возможно)?
У Шилдта этот вопрос вежливо замалчивается...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Feb 9 2015, 08:52
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Ничего не понимаю. То, что передается в функцию, не имеет отношения к тому, что выдается. Именно так показано в примерах в книге K&R. Давайте ограничимся возвратом.
Указатель на локальную переменную выдавать не будем. Будем выдавать указатель на глобальную структуру. Хотя, зачем его выдавать, можно просто флаг готовности результата выдать.
Если можно выдать структуру, то почему нельзя выдать аналогичным образом массив?
Go to the top of the page
 
+Quote Post
SM
сообщение Feb 9 2015, 09:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(ViKo @ Feb 9 2015, 11:52) *
Если можно выдать структуру, то почему нельзя выдать аналогичным образом массив?


Можно. Для этого он должен быть внутри структуры, которая может быть из одного массива.

А аналогичным образом нельзя потому, что массив есть указатель на кусок предвыделенной на этапе компиляции памяти. А структура - есть сам набор данных, а не указатель на него. Поэтому "return <массив>" - ошибочен, так как получается требование возврата указателя, возможно на локальный буфер, время жизни которого кончается с выходом из ф-ции. А "return <структура>" - корректно, так как это требования возврата самих данных, хранящихся в структуре, а не указателя на структуру. Поэтому присваивания и возвраты массивов изначально не предусмотрены, а структур - пожалуйста.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 9 2015, 09:09
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(SM @ Feb 9 2015, 12:00) *
А аналогичным образом нельзя потому, что массив есть указатель на кусок предвыделенной на этапе компиляции памяти. А структура - есть сам набор данных, а не указатель на него. Поэтому "return <массив>" - ошибочен, так как получается требование возврата указателя, возможно на локальный буфер, время жизни которого кончается с выходом из ф-ции. А "return <структура>" - корректно, так как это требования возврата самих данных, хранящихся в структуре, а не указателя на структуру. Поэтому присваивания и возвраты массивов изначально не предусмотрены, а структур - пожалуйста.

Кто же им (K&R) мешал сделать структуры и массивы одинаковыми в смысле обращения к ним - или адрес, или агрегатный тип данных?
Допустим, получили результат функции - структуру. Единственное, что приходит на ум - сохранить ее в своей (локальной, глобальной) переменной - структуре. И потом использовать ее отдельные члены. К чему вся эта чехарда?

Цитата(andrew_b @ Feb 9 2015, 12:05) *
Вас же не смущает возврат, например, целого числа. Почему вас смущает возврат структуры?

Число или указатель передается одним регистром.
Go to the top of the page
 
+Quote Post
andrew_b
сообщение Feb 9 2015, 09:13
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757



Цитата(ViKo @ Feb 9 2015, 12:09) *
Число или указатель передается одним регистром.
А если число "шире", чем регистр. Например, long long int? Или вообще double?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ViKo   Возврат структуры из функции   Feb 9 2015, 07:04
- - Grizzzly   Цитата(ViKo @ Feb 9 2015, 10:04) Как это ...   Feb 9 2015, 07:26
|- - jcxz   Цитата(Grizzzly @ Feb 9 2015, 13:26) Комп...   Feb 9 2015, 12:09
|- - SM   Цитата(jcxz @ Feb 9 2015, 15:09) Не смотр...   Feb 9 2015, 12:41
||- - Grizzzly   Цитата(SM @ Feb 9 2015, 15:41) а вот фраг...   Feb 9 2015, 12:45
|- - Grizzzly   Цитата(jcxz @ Feb 9 2015, 15:09) Не смотр...   Feb 9 2015, 12:42
|- - SM   Цитата(Grizzzly @ Feb 9 2015, 15:42) Возм...   Feb 9 2015, 12:43
- - ViKo   Тогда это должно называться возврат указателя на с...   Feb 9 2015, 07:45
|- - Bear_ku   Цитата(ViKo @ Feb 9 2015, 12:45) Тогда эт...   Feb 9 2015, 08:52
- - Bear_ku   А вы дерзкий! Я бы не решился возвращать из фу...   Feb 9 2015, 08:15
|- - SM   Цитата(Bear_ku @ Feb 9 2015, 11:15) А вы ...   Feb 9 2015, 08:29
|- - ar__systems   Цитата(SM @ Feb 9 2015, 03:29) А никто та...   Mar 13 2015, 15:17
|- - XVR   Цитата(ar__systems @ Mar 13 2015, 18:17) ...   Mar 16 2015, 12:21
|- - SM   Цитата(ViKo @ Feb 9 2015, 12:08) Единстве...   Feb 9 2015, 09:11
|- - SSerge   Цитата(ViKo @ Feb 9 2015, 16:09) Кто же и...   Feb 9 2015, 09:33
- - andrew_b   Вас же не смущает возврат, например, целого числа....   Feb 9 2015, 09:05
- - ViKo   Будем считать что я осознал и раскаялся... (хотя р...   Feb 9 2015, 09:27
- - SM   Цитата(ViKo @ Feb 9 2015, 12:27) Я же не ...   Feb 9 2015, 09:34


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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