2016-06-17 15 views
1

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

1) У меня есть структура, определенная сказать так:

struct minos_model 
{ 
    int ifanis, ifdeck, npts, icb, cmb, noc; 
    double tref; 
    double r[MODEL_NPTS_MAX], rho[MODEL_NPTS_MAX], vpv[MODEL_NPTS_MAX],  vsv[MODEL_NPTS_MAX], 
    qk[MODEL_NPTS_MAX], qmu[MODEL_NPTS_MAX], vph[MODEL_NPTS_MAX],  vsh[MODEL_NPTS_MAX], eta[MODEL_NPTS_MAX]; 
    char model_name[MODEL_LINE_LEN]; 
}; 
typedef struct minos_model model_t; 

2) Я предрек некоторые структуры этой формы:

/* Declare structures */ 
model_t candidate_mod, current_mod, empty_mod; 

3) Затем я передаю им функцию, объявленную как что-то вроде этого:

void 
perturb_model(model_t *candidate_mod, model_t *current_mod, model_t *empty_mod) 
{ 
    candidate_mod = current_mod; // *THIS LINE* 
    <various other functions and whatnot> 
} 

4) Затем я вызываю функцию следующим образом:

perturb_model(&candidate_mod, &current_mod, &empty_mod); 
// arguments passed as pointers 

Таким образом, приведенная выше упрощенная версия того, что я сделал. Я пытаюсь (по строке ЭТА ЛИНИЯ на шаге 3), чтобы установить кандидат_mod на другую структуру (current_mod), я бы использовал цикл, но один, это кажется неэлегантным, два, иногда структура, которую я тоже устанавливаю равной (current_mod) содержит меньше значений (чем кандидат_mod), и поэтому я беспокоюсь о том, что избыточные значения из исходной структуры (кандидат_mod) останутся.

Следует также упомянуть, так как возможно, что функция определена в отдельном файле c, связанным в make-файле, поэтому, возможно, существует проблема с совместным использованием глобальных ... но я думаю, что передача указателя в качестве аргумента должна решить это?

Также, по моим исследованиям, возможно, использование extern может помочь, хотя я не могу понять, как после многих попыток.

Если бы кто-то мог объяснить лучший способ сделать это, я был бы чрезвычайно благодарен !! Я знаю, как сделать это тривиально в моем основном коде, но структуры должны быть назначены таким образом внутри функции.

Cheers.

+0

Игнорирование массивной детали и рассмотрение названия вопроса. Просто приравняйте их к 'structB = structA', пока вы не просто приравниваете указатели, и в этом случае это должно быть' * structB = * structA' –

ответ

3

Просто нажмите значение src в dest, не назначайте указатели ... Но ваша настоящая потребность не так ясна.

*candidate_mod = *current_mod; 
+0

Итак, если я помещаю * перед указателем (адрес переменная или структура), она вернет ее обратно к просто переменной или структуре, а не к ее адресу? – Alex

+0

Кроме того, означает ли это, что это изменит значение структуры в моей основной. Дело в том, что я не просто хочу изменить ценность структуры локально, но и глобально. Это будет так с вашим предложением? Извините, я пытаюсь научить себя, а иногда и подвожу. – Alex

+1

Да '* p' означает значение объекта, на которое указывает' p'. Когда вы передаете адрес объекта, созданного в main, функция меняет значение объекта по этому адресу. –

1

Вы передаёте адрес структуры. Когда вы говорите candidate_mod = current_mod; , вы назначаете адрес current_mod на candidate_mod, что является неправильным. Вы должны разыменовать эту структуру, используя код, подобный этому

*candidate_mod = *current_mod; 
+0

Хорошо, отлично, поэтому, если я поставил * перед указателем (адресом переменной или структуры), он вернет его обратно к просто переменной или структуре, а не к ее адресу? – Alex

+0

Кроме того, означает ли это, что это изменит значение структуры в моей основной. Дело в том, что я не просто хочу изменить ценность структуры локально, но и глобально. Это будет так с вашим предложением? Извините, я пытаюсь научить себя, а иногда и подвожу. – Alex

+0

* означает, что вы попадаете в адрес, на который вы указываете, и используете это значение. Имя указателя - это только адрес элемента, на который вы указываете, и когда вы помещаете * перед именем указателя, вы используете то, что на самом деле находится в том месте, на которое вы указываете. И да, когда вы передаете адрес, как вы сделали в качестве аргумента указателя, вы можете изменить значение в главном, но если вы не передадите его как указатель, вы не измените никакого значения на главный –

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

  • Нет связанных вопросов^_^