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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Возврат нескольких аргументов
John851
сообщение Jul 6 2010, 17:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



Добрый вечер,

забыл как возвращать сразу несколько аргументов из процедуры...

я пробовал что то типа

void func (char &arg1, char &arg2) {
.....
arg1=val1;
arg2=val2;
}

но компилятор такого не принял...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 6 2010, 17:38
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(John851 @ Jul 6 2010, 22:25) *
void func (char *arg1, char *arg2) {
.....
*arg1=val1;
*arg2=val2;
}



--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
John851
сообщение Jul 6 2010, 17:49
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



так я тоже делал, токо вот потом не смог разобраться в ворнингах... вообщем я в эту функцию на место arg1 и arg2 подаю элементы массива типа char, а он мне в воринигах пишет ../SLAVE.c:110: warning: passing argument 2 of 'start_single' makes pointer from integer without a cast и так для каждого аргумента.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 6 2010, 17:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (John851 @ Jul 6 2010, 20:49) *
вообщем...

... буквари читать надо,ну хоть по минимуму. Ну хоть чуть-чуть sad.gif.
QUOTE
подаю элементы массива типа char, а он мне...

естественно. Указатели требуется передавать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
John851
сообщение Jul 6 2010, 18:05
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



эм дак вот и обращаюсь сюда за знаниями, все только и могут посылать в буквари.. Я передаю в качестве аргументов элементы массива типа char, как мне известно - имя массива со смещением это и есть указатель - ок пробуем, пишет: ../SLAVE.c:110: warning: passing argument 2 of 'start_single' makes pointer from integer without a cast - о чем здесь речь? пробую преобразовать указатели к типу char: (char *) mas[0] - ок пробуем, пишет: ../SLAVE.c:110: warning: cast to pointer from integer of different size. Вы бы не могли пояснить что происходит

Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jul 6 2010, 18:07
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(John851 @ Jul 6 2010, 22:49) *
так я тоже делал, токо вот потом не смог разобраться в ворнингах... вообщем я в эту функцию на место arg1 и arg2 подаю элементы массива типа char, а он мне в воринигах пишет ../SLAVE.c:110: warning: passing argument 2 of 'start_single' makes pointer from integer without a cast и так для каждого аргумента.

А вот при вызове делать так
func (&xxx[x], &xxx[x]);

Сообщение отредактировал GetSmart - Jul 6 2010, 18:08


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 6 2010, 18:09
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (John851 @ Jul 6 2010, 21:05) *
эм дак вот и обращаюсь сюда за знаниями, все только и могут посылать в буквари..

Это обязательно, а то даже объяснить, что делаете, не можете. Тогда-уж вместо изложения своими словами привели-бы, так сказать, первоисточник.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
John851
сообщение Jul 6 2010, 18:10
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



Цитата
А вот при вызове делать так
func (&xxx[x], &xxx[x]);


К сожалению мне тут не поможет оператор взятия адреса от адреса
Go to the top of the page
 
+Quote Post
John851
сообщение Jul 6 2010, 18:11
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-05-09
Пользователь №: 48 549



Цитата
Это обязательно. Базис для общения, а то даже объяснить, что делаете, не можете. Тогда-уж вместо изложения своими словами привели-бы, так сказать, первоисточник.

что вы хотите услышать? я же четко проблему объяснил, если кому то влом ответить или почитать я не виноват..
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jul 6 2010, 21:12
Сообщение #10


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Цитата(John851 @ Jul 6 2010, 22:10) *
К сожалению мне тут не поможет оператор взятия адреса от адреса

Что значит "оператор взятия адреса от адреса"?

char array[x] - массив элементов типа char.
array[x] - возвращает не указатель, а именно тип элемента массива - просто char.

Соответственно, вызов функции с параметрами - char *arg1 должен выглядеть так:
func(&array[x], &array[y]);

Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 7 2010, 01:17
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(John851 @ Jul 7 2010, 00:05) *
как мне известно - имя массива со смещением это и есть указатель
Неверно. Только само имя массива может служить адресом. Имя массива с указанием индекса (смещения) как аргумент функции это передача значения элемента массива. Если вы хотите передать его (элемента массива) адрес через указатель, то нужно дополнить операцией извлечения адреса. Потому, что при индексации компилятором учитывается размер элементов массива и способ доступа к ним.
Прототип функции должен выглядеть как
Код
void foo (char *ptr1, char *ptr2);

Вызов функции
Код
foo (&mas[4], &mas[8]);

А вот следующие две записи действительно дают идентичный результат
Код
foo (mas, &mas[10]);

Код
foo (&mas[0], &mas[10]);

При несовпадении типов указателей и необходимости приведения их типов нужно делать это явным образом
Код
foo ((char *)&mas[0], (char *)&mas[8]);

Если же, например, требуется обработать элементы массива другого типа (например, побайтовая обработка массива 32-х разрядных чисел), то так
Код
foo (&((char *)mas32)[0], &((char *)mas32)[8]);

В последнем случае индекс указывает на смещение в байтах, т.к. указатель предварительно к "байтовому" типу char приведен. Слово "байтовому" взято в кавычки по причине того, что в соответствии со стандартом СИ нет однозначной привязки типа char к байту (8-бит).
Так что zltigo вполне справедливо отсылает вас к букварю wink.gif
Go to the top of the page
 
+Quote Post
haker_fox
сообщение Jul 7 2010, 02:37
Сообщение #12


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



QUOTE (John851 @ Jul 7 2010, 03:11) *
что вы хотите услышать? я же четко проблему объяснил, если кому то влом ответить или почитать я не виноват..

"Влом" прочитать Вам, а ни кому-то, Вам нужны знания, а ни кому-то. На этом форуме принят более дружелюбный тон общения, не нарушайте его, пожалуйста!


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
dxp
сообщение Jul 7 2010, 02:38
Сообщение #13


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(John851 @ Jul 7 2010, 00:25) *
void func (char &arg1, char &arg2) {
.....
arg1=val1;
arg2=val2;
}

но компилятор такого не принял...

Включите режим С++, и компилятор все примет. Это будет передача по ссылке. Синтаксически все ровно так же, как и при передаче по значению, но реально передается ссылка, и значения arg1, arg2 будут после вызова функции соответствовать тому, что им было присвоено внутри функции. И не надо тут никаких разыменовываний и возни с адресами. Только надо помнить, что ссылки - это плюсовые фичи, в голом С их нет. Ну, и не лишне про них почитать, дабы иметь представление, что это такое, как работает и с чем едят. smile.gif

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 7 2010, 14:36
Сообщение #14


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(John851 @ Jul 6 2010, 21:25) *
забыл как возвращать сразу несколько аргументов из процедуры...
Не смешивайте тёплое с мягким.
Функция может вернуть только один "аргумент" и точка. Но зато он может быть и структурой...
А передать в функцию можно N аргументов, в том числе и по указателю.

Для ликбеза: функция получает аргументы (зависит от них), а возвращает она значение, а никак не аргумент.

Цитата(dxp @ Jul 7 2010, 06:38) *
Включите режим С++

Рано ему такие слова слышать:-)


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 7 2010, 14:40
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (demiurg_spb @ Jul 7 2010, 17:36) *
А передать в функцию можно N аргументов, в том числе и по указателю.

Не правильный термин sad.gif - просто передать указатели.
QUOTE
Рано ему такие слова слышать:-)

Абсолютно солидарен.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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