Массив float в качестве аргумента функции

Модератор: Модераторы разделов

BratSinot
Сообщения: 812
ОС: Slackware64

Массив float в качестве аргумента функции

Сообщение BratSinot »

Доброго времени суток!

Вообщем есть функция в которой аргументом является указатель на переменную типа float. В моем случае это массив. Так вот, массив символов(строку) можно передать как:
func("передача");

А можно-ли как-нибудь передать массив float? Что-то вроде этого:
func({1.0f,1.0f,1.0f,0.5f});
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Массив float в качестве аргумента функции

Сообщение serzh-z »

void fn(float a[]);

float a[5] = {0.4, 0.0, 0.5, 4.6, 4.5};
fn(a);
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Массив float в качестве аргумента функции

Сообщение BratSinot »

serzh-z писал(а):
23.12.2010 00:14
void fn(float a[]);

float a[5] = {0.4, 0.0, 0.5, 4.6, 4.5};
fn(a);

Передать без переменной.
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Массив float в качестве аргумента функции

Сообщение serzh-z »

BratSinot писал(а):
31.12.2010 21:55
Передать без переменной.
Нет.
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: Массив float в качестве аргумента функции

Сообщение agentprog »

длина массива в таких аргументах никак не передается. для этого надо либо передать ее дополнительным параметром, либо некоторым ограничительным элементом массива. в строках это '\0'. для массива float, наверно удобнее передавать длину:
void f(int length, float *array);
...
float a[5] = {0.4, 0.0, 0.5, 4.6, 4.5};
f(5, a);
No problems - just solutions!
Спасибо сказали:
frp
Сообщения: 1445
ОС: Debian Squeeze

Re: Массив float в качестве аргумента функции

Сообщение frp »

BratSinot писал(а):
31.12.2010 21:55
Передать без переменной.

Желательно бы сначала указать, какой ЯП применяется (C или C++).

В плюсах можно реализовать собственный тип для этого, синтаксис будет совсем не такой, но можно получить что-то вроде этого:

Код: Выделить всё

f(mv<float>(4/*размер*/).e(0.3f).e(0.4f).e(1.1f).e(3.f));

Чтобы работало с функциями C, можно реализовать функции для преобразования его в C-массив, а чтобы работало с C++ - функции преобразования в std::vector.

Если C - копайте в сторону макросов.

PS. Нужно ли так выпендриваться? Чем вам мешает лишняя переменная? Все возможные методы сделать это без переменных - мягко говоря, немного не труЪ.
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Массив float в качестве аргумента функции

Сообщение BratSinot »

frp писал(а):
01.01.2011 10:37
PS. Нужно ли так выпендриваться? Чем вам мешает лишняя переменная? Все возможные методы сделать это без переменных - мягко говоря, немного не труЪ.

Просто подумал что возможно как со строками, так и с другими массивами. Оказалось нет.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Массив float в качестве аргумента функции

Сообщение drBatty »

BratSinot писал(а):
01.01.2011 11:25
Просто подумал что возможно как со строками, так и с другими массивами. Оказалось нет.

почем нет?
в строках вы передаёте длину последним элементом массива, символом nul, что мешает передавать длинну также и для float? 0.0 может встречаться в данных? ну есть NaN. (хотя и не переносимо конечно).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Массив float в качестве аргумента функции

Сообщение BratSinot »

drBatty писал(а):
03.01.2011 04:55
BratSinot писал(а):
01.01.2011 11:25
Просто подумал что возможно как со строками, так и с другими массивами. Оказалось нет.

почем нет?
в строках вы передаёте длину последним элементом массива, символом nul, что мешает передавать длинну также и для float? 0.0 может встречаться в данных? ну есть NaN. (хотя и не переносимо конечно).

Ну так я и спрашиваю как так можно.
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Массив float в качестве аргумента функции

Сообщение deadhead »

drBatty писал(а):
03.01.2011 04:55
в строках вы передаёте длину последним элементом массива, символом nul, что мешает передавать длинну также и для float? 0.0 может встречаться в данных? ну есть NaN. (хотя и не переносимо конечно).
а можно и как в паскалевских строках - первым элементом длину массива...
BratSinot писал(а):
03.01.2011 11:33
Ну так я и спрашиваю как так можно.
но с некоторым ограничением
BratSinot писал(а):
31.12.2010 21:55
Передать без переменной.
на что собственно вы уже получили ответ ;-)
[x] close
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Массив float в качестве аргумента функции

Сообщение NickLion »

В новом стандарте C++ (который ещё не вышел, но пощупать уже можно) есть такая вещь как списки инициализации. С их помощью возможно передать массив без именованной переменной. Но пока это ещё не стандарт. Передавать можно сразу какой-нибудь std::vector, поэтому проблем с определением длины не будет. В чистых сях такого нет и не собираются добавлять вроде бы.

PS эта фича в GCC начиная с версии 4.4 (для включения нового стандарта нужна опция -std=c++0x)
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Массив float в качестве аргумента функции

Сообщение BratSinot »

Да что-то я сглупил, я про C. Плюс пример желательно.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Массив float в качестве аргумента функции

Сообщение NickLion »

Пример для C++? Подчеркиваю, это пока не стандарт:

Код: Выделить всё

#include <vector>
#include <cstdio>

int func( const std::vector<int>& vector );

int main()
{
    int sum = func( { 1, 2, 3 } );
    printf( "%d\n", sum );
    return 0;
}

int func( const std::vector<int>& vector )
{
    int sum = 0;
    for( auto i = vector.begin(); i != vector.end(); i++ ) {
        //printf( "%d\n", *i );
        sum += *i;
    }
    return sum;
}

компилить:

Код: Выделить всё

g++ test.cpp -o test -std=c++0x

ну, ессно, вместо test.cpp реально имя файла.
В GCC 4.6 можно использовать range based for:

Код: Выделить всё

for( auto i : vector ) {
    sum += i;
}
Спасибо сказали:
BratSinot
Сообщения: 812
ОС: Slackware64

Re: Массив float в качестве аргумента функции

Сообщение BratSinot »

Подчеркиваю, это пока не стандарт:

C++0x это стандарт.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5423
ОС: Gentoo

Re: Массив float в качестве аргумента функции

Сообщение /dev/random »

BratSinot писал(а):
03.01.2011 17:36
C++0x это стандарт.

Пока ещё нет. Только черновик стандарта.
Спасибо сказали: