2012-04-24 2 views
1

У меня есть функция с прототипом:Passing структура со списком структур функционировать

void procedureForEachWave(struct barge *Barge, struct settings *Settings, struct wave *Wave) 

В другой функции у меня есть другая структура под названием threadData, который я использую для передачи информации функций, которые выполняются на несколько потоков, и один из элементов этой структуры является список struct wave, поэтому короткий пробную этот код идет:

struct threadData data; 
data.waveList = (struct wave*) malloc(sizeof(struct wave)*nrOfWaves); 

Я использую это в другой функции, где я в основном первый отправить указатель на данные структуры, и затем внутри этой функции ion функция «procedureForEachWave» вызывается в таком виде:

procedureForEachWave(data->Barge, data->Settings, &data->waveList[i]); 

Это работает нормально. Тем не менее, я также хочу провести анализ, в котором я использую только одну волну, а это означает, что список содержит только один элемент, поэтому мне не нужно вызывать первую функцию. Я только хочу:

procedureForEachWave(Barge, Settings, &data.waveList[0]); 

но это не работает. Зачем? и как мне заставить его работать? Чтобы уточнить, данные теперь объявлены как переменная, а не указатель, а Barge и Settings уже являются указателями. WaveList объявлен как это:

data.waveList = (struct wave*) malloc(sizeof(struct wave)); 
+1

Что вы подразумеваете под "не работает"? Вы получаете ошибку компиляции или ошибку времени выполнения или это дает вам результаты времени выполнения, которых вы не ожидаете? Если компилятор/компоновщик совместим, отправьте точное сообщение об ошибке. – Mahesh

+0

Я не могу понять это даже после нескольких чтений. Pls рассматривает перефразирование Qn в простых терминах –

+0

Не работает - вы имеете в виду, что он не компилируется или не работает, как вы предполагаете во время выполнения? –

ответ

0

ничего не зная о том, что происходит внутри procedureForEachWave, трудно (если не невозможно), чтобы сказать, что эта проблема.

Однако, похоже, что data используется по-разному между вызовом, который работает, и тем, который этого не делает. Если они используют один и тот же номер data, вызов должен быть одинаковым (подставляя 0 для i). Если они отличаются друг от друга, предоставьте определение этого другого data.

0

Рассмотрим фрагмент кода:

extern void wave_function(struct wave *); 
struct wave value  = { ... }; 
struct wave array[10] = { { ... } }; 

wave_function(&value); 
wave_function(array); 
wave_function(&array[5]); 

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

extern void alt_wave_function(struct wave *, size_t); 

alt_wave_function(&value, 1); 
alt_wave_function(array, 10); 
alt_wave_function(&array[5], 3); 

Обратите внимание, что если размер передается с указателем &value был больше 1, вы попадаете в неопределенное поведение. Два других вызова являются полностью законными: третий, тем не менее, эффективно передает подстроку из трех строк массива функции.

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

void wave_function(struct wave *ptr) 
{ 
} 

void wave_function(struct wave ptr[]) 
{ 
} 

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

void wave_function(struct wave array[static 4]) 
{ 
} 

Это обозначение означает, что абонент должен гарантировать, что есть по крайней мере 4 элементы в массиве, переданные этой версии wave_function.

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