Определить и вернуть структуру в c - PullRequest
3 голосов
/ 10 июня 2010

Я пытаюсь преобразовать некоторый код из Javascript в c.Функция создает массив (который всегда имеет фиксированное количество элементов), а затем возвращает массив.Я узнал, что в c не так просто вернуть массив, поэтому я бы хотел вернуть его в виде структуры.Мой c не так уж и велик, поэтому я хотел бы проверить, что возвращение структуры - это то, что нужно делать в этой ситуации, и что я делаю это правильно.Спасибо.

typedef struct {
    double x;
    double y;
    double z;
} Xyz;

Xyz xyzPlusOne(Xyz addOne) { 

    Xyz xyz;
    xyz.x = addOne.x + 1;
    xyz.y = addOne.y + 1;
    xyz.z = addOne.z + 1;

    return xyz;
}

Ответы [ 4 ]

8 голосов
/ 10 июня 2010

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

Xyz s;
s = XyzPlusOne( s );

, в этом случае выбыло бы лучше передать структуру в качестве указателя и просто сказать:

Xyz s;
XyzPlusOne( & s );

С другой стороны, если вы хотите что-то вроде этого:

Xyz s1, s2;
...,
s2 = XyzPlusOne( s1 );

, тогда возвращение значения имеет смысл.

3 голосов
/ 10 июня 2010

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

Xyz xyzPlusOne(const Xyz* addOne) { 

    Xyz xyz;
    xyz.x = addOne->x + 1;
    xyz.y = addOne->y + 1;
    xyz.z = addOne->z + 1;

    return xyz;
}

ИлиВы можете передать обычный указатель на структуру, изменить ее в функции и ничего не возвращать (если вам не нужно сохранять исходную структуру нетронутой):

void xyzPlusOne(Xyz* addOne) { 
    addOne->x++;
    addOne->y++;
    addOne->z++;
}
2 голосов
/ 10 июня 2010

Вот еще один подход, который просто изменяет исходный массив:

void xyzPlusOne(Xyz *addOne)
{ 
    if (addOne != NULL)
    {
        addOne->x++;
        addOne->y++;
        addOne->z++;
    }
}

вызывать как: xyzPlusOne (& array);

2 голосов
/ 10 июня 2010

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

...