2012-03-30 2 views
-2

Можно создать дубликат:
passing array of structure as a function parameterКак передать массив структуры из одной функции в другую?

Каков наилучший способ передать один структурный массив из одной функции в другую?

Допустим, у меня есть

funcion1(){ 
    struct album_ { 
    int num_tracks; 
    struct tracks_ tracks; 
    int playlist_hits[]; 
    }; 
    typedef struct album_ album; 
    album all_album[50]; 
} 

function2(){ 
} 

Как бы я прохожу all_album[50]; в function2()?

+0

Но оно было создано в другой функции. –

ответ

1
void myFunc(album* A, int N) 
{ 
    int i; 
    for(i = 0; i < N; i++) 
     A[i].num_tracks = 0; 
} 

void main() 
{ 
    album MyAlbums[50]; 
    myFunc(MyAlbums, 50); 
} 
+0

вместо '50' в вызове' myFunc() 'вы можете использовать' sizeof MyAlbums/sizeof * MyAlbums' и избегать другого использования магической константы :) – pmg

+0

pmg прав, но только для массивов в стеке. sizeof() никогда не должен применяться к массивам malloc'd или new'd. –

2

структура, как и любой другой типа. Вы можете просто передать его, как то, как вы передаете целочисленный массив. Если вы объявляете (как и выше) глобальным, вам вообще не нужно проходить.

0

В качестве массива фиксированного размера или пары указателей и размеров.

struct tracks_ { 
}; 

struct album_ { 
    int num_tracks; 
    struct tracks_ tracks; 
    int playlist_hits[]; 
}; 
typedef struct album_ album; 
album all_album[50]; 

void foo(album all_album[50]) { 
//passes this way 
} 

void foo2(album* all_album, size_t size) { //or degrades to a pointer 
} 

int main() { 
    foo(all_album); 
    foo2(all_album, 50); 
} 
+1

'foo' не делает то, что, по вашему мнению, делает. В контексте объявления параметра функции 'T a [N]' и 'T a []' идентичны 'T * a'; в функции 'foo',' all_album' является указателем, а не массивом. –

0

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

void foo(album *a, size_t size) { ... } 

, к которому вы передать выражение массива и размер:

int main(void) 
{ 
    ... 
    album all_album [N]; 
    ... 
    foo(all_album , sizeof all_album/sizeof *all_album) 
    ... 
} 

исключением случаев, когда это операнд из sizeof или унарный & операторов, или строковым существо используемый для инициализации другого массива в объявлении, выражение типа «N-element array of T» будет заменено выражением типа «pointer to T», значением которого является адрес первого элемента массива.

IOW, когда вы пишете

foo(all_album, sizeof all_album/sizeof *all_album); 

происходит несколько вещей.

  1. Первый all_album выражение заменяется выражением указателя, значение которого &all_album[0]; поэтому тип a в определении для foo имеет тип album *.

  2. Выражение sizeof all_album оценивает общее количество байтов в массиве. Поскольку all_album является операндом оператора sizeof, это не преобразован в выражение указателя.

  3. Выражение sizeof *all_album вычисляет число байтов в одного объекта типа album. Так как это all_albumне операнда sizeof (The *all_album выражение является операнд), он сначала преобразуется в выражение типа «указатель на album».Оператор * применяется к этому выражению указателя, давая новое выражение типа album, которое оценивается sizeof.

  4. sizeof all_album/sizeof *all_album оценивается с присвоением элементов в массиве. Это значение передается как параметр size в определении foo.

Смежные вопросы