Процедуры и функции

Alex_Andr1
Offline
Зарегистрирован: 28.01.2019

День добрый!

Есть непонятки с основами языка "си". На форуме и в разделе "Программирование" ответа не нашёл.

Мне нужна функция (или процедура), которая возвращает несколько значений, а не одно.

Или выход только один - создавать глобальные переменные и использовать их в функции void()  ?

b707
Онлайн
Зарегистрирован: 26.05.2017

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

если требуется возвращать не одно значение - на 90% - проблема в архитектуре программы. 

Alex_Andr1
Offline
Зарегистрирован: 28.01.2019

Понял. СПАСИБО!

А ещё говорят, что "си" лудше Паскаля". Извиняюсь за спам. :))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

а шо, таки в паскале научились много значений из функции возвращать?

Alex_Andr1
Offline
Зарегистрирован: 28.01.2019

Извиняюсь. Не хотел никоко обидеть. В Паскале есть процедуры, в которых можно задать сколь угодно аргументов и получить несколько значений. Например procedure my(a,b : Integer; var c,d,e : byte)

Друзья, всем спасибо за оперативный ответ! Быстро помогли разоббратья с моей проблемой. Спасибо.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

в С++ тоже есть.  аналог паскалевких var переменных - указатели

Alex_Andr1
Offline
Зарегистрирован: 28.01.2019

DetSimen пишет:

в С++ тоже есть.  аналог паскалевких var переменных - указатели

А в Arduino IDE этого, я так понимаю, нет?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

всё есть, полный комплект искаропки. 

Alex_Andr1
Offline
Зарегистрирован: 28.01.2019

b707 пишет:

Наиболее употребительный - возвращать ссылку на структуру, массив или класс, в котором уже передавать нужные данные

Пролетели мимо глаз слова "возвращать ссылку на структуру". Теперь всё ясно.  Спасибо разъяснили всё.

Дальше уже сам разберусь.

PS. Я был не прав со своей шуточкой. Теперь выгляжу глупо. :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Alex_Andr1 пишет:

Мне нужна функция (или процедура), которая возвращает 

Процедура не может ничего возвращать по определению. Она вызывается только для побочного эффекта.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Во блин!!! А в ассемблере я через стек 100500 параметров возвращал )))
На PC правда стек растет вниз и одним сегментом 64к

Schwarz78
Offline
Зарегистрирован: 19.01.2019

Alex_Andr1 пишет:

День добрый!

Есть непонятки с основами языка "си". На форуме и в разделе "Программирование" ответа не нашёл.

Мне нужна функция (или процедура), которая возвращает несколько значений, а не одно.

Или выход только один - создавать глобальные переменные и использовать их в функции void()  ?

Есть ещё такие звери, как ссылки, меня тут как раз просветили в: http://arduino.ru/forum/obshchii/ssylki-s.

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

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Schwarz78 пишет:

Есть ещё такие звери, как ссылки, меня тут как раз просветили в: http://arduino.ru/forum/obshchii/ssylki-s.

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

Не, ну это не кошерно. Так и до глобальных переменных можно дойти, а они - зло. Ибо в достаточно большой программе легко можно их поменять, а где и не понятно...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

mykaida пишет:

Не, ну это не кошерно. Так и до глобальных переменных можно дойти, а они - зло. Ибо в достаточно большой программе легко можно их поменять, а где и не понятно...

это когда на пенсии, а по молодости ничего 3,6 килобайта машинного кода и ни одной ошибки

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Schwarz78 пишет:

Есть ещё такие звери, как ссылки,

Нету.

ТС ведь говорил про 

Alex_Andr1 пишет:

язык "си"

А там нету ссылок :(

 
sadman41
Offline
Зарегистрирован: 19.10.2016

ЕвгенийП пишет:

Alex_Andr1 пишет:

язык "си"

А там нету ссылок :(

Дискуссионный момент! В том "си", в котором есть функция void(), вполне могут завестись и ссылки.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ua6em пишет:

Во блин!!! А в ассемблере я через стек 100500 параметров возвращал )))

И что, в стек помещалось?

Цитата:

На PC правда стек растет вниз и одним сегментом 64к

Либо Вы воспринимаете "PC" слишком буквально, либо путаете "IBM PC" и "MS DOS".

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

ua6em пишет:

Во блин!!! А в ассемблере я через стек 100500 параметров возвращал )))

И что, в стек помещалось?

Цитата:

На PC правда стек растет вниз и одним сегментом 64к

Либо Вы воспринимаете "PC" слишком буквально, либо путаете "IBM PC" и "MS DOS".

всё что было необходимо...еще DR-DOS ...TR-DOS...Альфа-ДОС ...под СP/M-86 ничего не писал, а было еще что-то от ДОС? а забыл был же еще SCO UNIX )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Дискуссионный момент! В том "си", в котором есть функция void(), вполне могут завестись и ссылки.

Никаких дискуссий! Самодеятельность компилятора - это самодеятельность компилятора, там хоть camefrom может быть, а что есть или чего нет в языке - см. действующий (2018 года) стандарт Си. Ссылку на документ я давал в "песочнице". Нету там ссылок :(

sadman41
Offline
Зарегистрирован: 19.10.2016

До канпиляторя человек еще не дошел. void() у него в основах основ числится. Так что я предполагаю, что его язык выпал из параллельной реальности.

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

это когда на пенсии, а по молодости ничего 3,6 килобайта машинного кода и ни одной ошибки

То что они ещё никак себя не проявили, не значит что их нет.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

ua6em пишет:

это когда на пенсии, а по молодости ничего 3,6 килобайта машинного кода и ни одной ошибки

То что они ещё никак себя не проявили, не значит что их нет.)

их там нет, писалось на ассемблере  с абсолютным пониманием до байта, что это такое и зачем оно нужно, если бы были за десяток лет эксплуатации вылезло...
Умом понимаю, что этого не может быть, но доказать обратное не получилось...
Проверялись все регистры микропроцессора на уровне исполнения каждой машинной команды...
Если что и могло вылезти, то только в контроллере ПДП, работа велась с ним...
Но тут "сын за отца не отвечает"...

PS ради интереса смотрел в кодах BIOS аналогичные функции - реализовано практически один в один на уровне машинных команд...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

их там нет

И сколько там этих ихтамнетов? Одному Богу известно!

Есть фундаментальный закон который стар, как само программирование. Его никто не отменял и никогда не отменит:  "every last bug you found is actually the penultimate". 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

их там нет

И сколько там этих ихтамнетов? Одному Богу известно!

Есть фундаментальный закон который стар, как само программирование. Его никто не отменял и никогда не отменит:  "every last bug you found is actually the penultimate". 

Да я закон знаю и, даже приму, что может одна и есть, ранее не нашлась, а теперь это никому и не нужно )))
 

sadman41
Offline
Зарегистрирован: 19.10.2016

В студию сверкающий бриллиант в 3.6Кб! Пусть слабоумные ардуинщики поучатся... чему там можно поучиться с этого кода?

Green
Offline
Зарегистрирован: 01.10.2015

Так с бирюлика, небось, ещё гриф секретности не снят...

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

ua6em пишет:
всё что было необходимо...еще DR-DOS ...TR-DOS...Альфа-ДОС ...под СP/M-86 ничего не писал, а было еще что-то от ДОС? а забыл был же еще SCO UNIX )))

Про полуось и НетВарь наверное помните ещё ;-)... ностальгия блин!
ua6em пишет:

Green пишет:

ua6em пишет:

это когда на пенсии, а по молодости ничего 3,6 килобайта машинного кода и ни одной ошибки

То что они ещё никак себя не проявили, не значит что их нет.)

их там нет, писалось на ассемблере  с абсолютным пониманием до байта, что это такое и зачем оно нужно, если бы были за десяток лет эксплуатации вылезло...
Умом понимаю, что этого не может быть, но доказать обратное не получилось...
Проверялись все регистры микропроцессора на уровне исполнения каждой машинной команды...
Если что и могло вылезти, то только в контроллере ПДП, работа велась с ним...
Но тут "сын за отца не отвечает"...
PS ради интереса смотрел в кодах BIOS аналогичные функции - реализовано практически один в один на уровне машинных команд...

А чему там коду ломаться? Он как калашников.
Когда зажат жесткими рамками нехватки ресурсов, пересчитываешь биты и экономишь на всём, начинается искусство программирования.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Алексей. пишет:

А чему там коду ломаться? Он как калашников.
Когда зажат жесткими рамками нехватки ресурсов, пересчитываешь биты и экономишь на всём, начинается искусство программирования.

Это да, помню мой спор с ведущим в то время (ЦН) программистом САО РАН Алексеевым, о том, что я его IBM выведу из строя (сожгу микросхемы периферии) кодом их 2-х десятков машинных команд и, понадобится мне для этого обычный debug из комплекта DOS, уверял меня, что это не возможно, но спорить побоялся )))
Кстати, он в эпоху ваучеризации возглавлял ЧИФ Альпари, где была развёрнута сеть под нетварью

И да, тут код просили, поинтересуюсь - Вы разработчик программы FDA???

sadman41
Offline
Зарегистрирован: 19.10.2016

О, да... помню я эти рассказы про вирусы, которые винты заставляют внутре серверов биться в истерике, разшибая всё вокруг вдребезги.

Какие там еще городские легенды не вытащены на белый свет из пронафталиненных сундуков?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

О, да... помню я эти рассказы про вирусы, которые винты заставляют внутре серверов биться в истерике, разшибая всё вокруг вдребезги.

Какие там еще городские легенды не вытащены на белый свет из пронафталиненных сундуков?

тогда Вы наверное и безобидный WINCIH помните?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Какие там еще городские легенды не вытащены на белый свет из пронафталиненных сундуков?

Луч, направленный на стенку кинескопа с соответсвующим замыканием и пиро-шоу.

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

ua6em пишет:

Алексей. пишет:

А чему там коду ломаться? Он как калашников.
Когда зажат жесткими рамками нехватки ресурсов, пересчитываешь биты и экономишь на всём, начинается искусство программирования.

Это да, помню мой спор с ведущим в то время (ЦН) программистом САО РАН Алексеевым, о том, что я его IBM выведу из строя (сожгу микросхемы периферии) кодом их 2-х десятков машинных команд и, понадобится мне для этого обычный debug из комплекта DOS, уверял меня, что это не возможно, но спорить побоялся )))
Кстати, он в эпоху ваучеризации возглавлял ЧИФ Альпари, где была развёрнута сеть под нетварью

И да, тут код просили, поинтересуюсь - Вы разработчик программы FDA???

Не, про FDA даже не знаю что это, просто живу долго, вот и накрывает иногда, а как ваш ник вижу, сразу в голове ЦеЩа ЦеЩа...

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

тогда Вы наверное и безобидный WINCIH помните?

Я и OneHalf помню - что с того? Уверяю вас, что это не самая страшная угроза - вот хрупкие женщины, которые успешно втыкали LPT-кабель, предварительно его перевернув или они же, продавливавшие пальцем внутрь кнопку "Stop" на матричных эпсонах... Они были самым страшным бедствием. От всяких там дископтимизаторов, запущенных юзером, потом дернувшим за выключалку тоже натерпелся. Всё пытаюсь вспомнить название тулзы, которая на 286-х поднимала разделы, но не получается. Нечасто приходилось.

А вирусы... Бэкапы никто не отменял - и сейчас можно от шифровальщика хапнуть по полной программе.

Прогоревших же наскрозь матплат я с тридцаток и пятидесяток [IBM Model 30, 50] не видел. С XT особо дела не имел. 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

sadman41 пишет:

Я и OneHalf помню - что с того? Уверяю вас, что это не самая страшная угроза - вот хрупкие женщины, которые успешно втыкали LPT-кабель, предварительно его перевернув или они же, продавливавшие пальцем внутрь кнопку "Stop" на матричных эпсонах... Они были самым страшным бедствием.

;))))

ОФФТОП: просто анекдот в тему этого поста.

На испытаниях в школу милиции был проведен тест интеллекта:

Нужно было быстро расставить предметы, круглые, квадратные и треугольные по соответствующим отверстиям.

Кандидаты разделились на две, примерно равные группы:

 - совершенно тупые,

 - очень сильные!

b707
Онлайн
Зарегистрирован: 26.05.2017

Если вам всегда удается вставить штекер УСБ с первой попытки - вы или очень везучий, или просто сильный...

Alex_Andr1
Offline
Зарегистрирован: 28.01.2019

Ничего себе вы полемику развели! :)

А я всего лишь хотел узнать как две переменные разного типа в одной функции обработать.  :)  Я конечно не программист поэтому и вопрос возможно для некоторых показался дурацким, особенно когда я упамянул про глобальные переменные.  Но это была ирония.

А по поводу сильных. Как то у меня один знакомый лет 10 назад переезжал. Ну и при переезде у него в компьютере выпал шлейф из  жесткого диска. Я ему по телефону обяснил, что шлейф легко вставляется. Не обязательно компьютерщика вызывать на дом. Там есть ключ и ошибиться просто невозможно... Знакомый был слесарем и оказался сильным. :)

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

b707 пишет:

Если вам всегда удается вставить штекер УСБ с первой попытки - вы или очень везучий, или просто сильный...

Ничего смешного, были такие дисководы для 5-ти дюйм. дискет, так один мой знакомый, хирург по специальности, подключал трапециевидный разъем питания к дисководу наоборот. Как ты смог, спрашиваю. Отвечает: просто немножко нажал и всё.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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