Совершенно очевидно, что вы немного озадачены тем, как объединить значения в единую структуру, чтобы использовать все значения сразу.
В вашем коде.Вы присваиваете значение stInputs.NumofParam
- но другие значения не присваиваются.
Затем вы объявляете массив из 3 структур в ExpNum
, но затем необъяснимым образом назначаете только одну строку значений в каждой структуре?
По сути вашего вопроса, похоже, что вы пытаетесь заполнить одну структуру всеми значениями, чтобы вы могли передать эту структуру в myfunction
(что, как мы предполагаем, приводит к выводу всех значений вstruct)
Прежде чем смотреть на исправления, давайте рассмотрим некоторые общие проблемы кодирования.
Во-первых, не используйте магические числа в своем коде (кроме случаев, когда это абсолютно необходимо, напримерс модификатором scanf
ширина поля ).Ваш 3
является магическим числом .Вместо этого, если вам нужна константа, #define
один (или более) или используйте глобальный enum
, чтобы сделать то же самое.Таким образом, у вас есть единственное место в верхней части кода, чтобы изменить вещи, если это необходимо, и вам не нужно переходить через декларации или ограничения цикла, чтобы изменить вещи, например,
#include <stdio.h>
#define MAXV 3 /* if you need a constant, #define one (or more) */
typedef struct {
unsigned int NumofParam;
double ExperimentResults[MAXV];
double ValueofParamOne[MAXV];
double ValueofParamTwo[MAXV];
} EXP_CONDITION;
Далее, Cизбегает использования camelCase
или MixedCase
имен переменных в пользу всех строчных , сохраняя при этом прописных имен для использования с макросами и константами.Это вопрос стиля - так что это полностью ваше дело, но если вы не будете следовать ему, то в некоторых кругах вы можете получить неправильное первое впечатление.
Теперь перейдем к вашему коду.Во-первых (и особенно если вы будете циклически проходить по элементам в массиве) инициализирует ваши структуры со всеми нулями при объявлении.Это исключит возможность вызова неопределенного поведения при непреднамеренной попытке чтения из неинициализированного значения.Вы можете либо использовать именованный инициализатор для первого члена (все остальные будут установлены на ноль по умолчанию), либо вы можете использовать универсальный инициализатор (например, {0}
) для выполнениято же самое.Пример:
int main (void)
{
/* initialize your struct to all zero using a named initializer
* or the universal intializer {0}
*/
EXP_CONDITION stInputs = { .NumofParam = 0 };
EXP_CONDITION* pstInputs;
pstInputs = &stInputs;
...
EXP_CONDITION ExpNum[MAXV] = {{ .NumofParam = 0 }};
Теперь посмотрите на логику ваших заданий.Вы объявляете 3 элемента в массиве ExpNum
.Каждая структура имеет 3 массива по 3 значения в каждом, например,
double ExperimentResults[MAXV];
double ValueofParamOne[MAXV];
double ValueofParamTwo[MAXV];
Когда вы пытаетесь заполнить каждое из ExpNum[0]
ExpNum[1]
и ExpNum[2]
- вы заполняете только один элемент, например
/*assign values to Experiment 1*/
ExpNum[0].ValueofParamOne[0]=200;
ExpNum[0].ValueofParamTwo[0]=400;
ExpNum[0].ExperimentResults[0]=1000;
/*assign values to Experiment 2*/
ExpNum[1].ValueofParamOne[1]=210;
ExpNum[1].ValueofParamTwo[1]=440;
ExpNum[1].ExperimentResults[1]=2000;
...
Чтобы полностью заполнить одну структуру, вам потребуется
/*assign values to Experiment 1*/
ExpNum[0].ValueofParamOne[0]=200;
ExpNum[0].ValueofParamTwo[0]=400;
ExpNum[0].ExperimentResults[0]=1000;
ExpNum[0].ValueofParamOne[1]=210;
ExpNum[0].ValueofParamTwo[1]=440;
ExpNum[0].ExperimentResults[1]=2000;
ExpNum[0].ValueofParamOne[2]=220;
ExpNum[0].ValueofParamTwo[2]=480;
ExpNum[0].ExperimentResults[2]=3000;
Теперь давайте посмотрим на myfunction
, который, как мы предполагаем, просто выводит значения, хранящиеся в каждой структуре (это только дляпример):
void myfunction (EXP_CONDITION *exp)
{
printf ("\nNumofParam: %u\n", exp->NumofParam);
for (int i = 0; i < MAXV; i++)
printf (" %7.1lf %7.1lf %7.1lf\n", exp->ExperimentResults[i],
exp->ValueofParamOne[i], exp->ValueofParamTwo[i]);
putchar ('\n'); /* tidy up with newline */
}
Подумайте, что будет печататься, если мы назовем myfunction (pstInputs)
?Что напечатает, если мы позвоним myfunction (&ExpNum[0])
?Или myfunction (&ExpNum[1])
Подсказки:
Initial stInputs struct
NumofParam: 2
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
Content of each of ExpNum structs
NumofParam: 0
1000.0 200.0 400.0
0.0 0.0 0.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
2000.0 210.0 440.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
0.0 0.0 0.0
3000.0 220.0 480.0
Я могу ошибаться, но логически, похоже, вы намеревались провести все эксперименты внутри своей структуры stInputs
, а не разбрасывать их как единое целое.строка каждого в вашем ExpNum
массиве.Прелесть кодирования и структур заключается в том, что вы можете легко перемешать данные, чтобы поместить их в одно место, чтобы вы могли правильно управлять данными.Простой цикл по массиву ExpNum
и копирование всех данных в структуру stInputs
в нужном месте, например,
/* now put all values in your stInputs struct like it appears
* you intended to do?
*/
for (int i = 0; i < MAXV; i++) {
pstInputs->ExperimentResults[i] = ExpNum[i].ExperimentResults[i];
pstInputs->ValueofParamOne[i] = ExpNum[i].ValueofParamOne[i];
pstInputs->ValueofParamTwo[i] = ExpNum[i].ValueofParamTwo[i];
}
Теперь, когда вы вызываете myfunction (pstInputs)
, вы получаете все свои данные, например,
Output of the completely filled stInputs struct
NumofParam: 2
1000.0 200.0 400.0
2000.0 210.0 440.0
3000.0 220.0 480.0
Собрав все части вместе, ваш последний пример может выглядеть примерно так:
#include <stdio.h>
#define MAXV 3 /* if you need a constant, #define one (or more) */
typedef struct {
unsigned int NumofParam;
double ExperimentResults[MAXV];
double ValueofParamOne[MAXV];
double ValueofParamTwo[MAXV];
} EXP_CONDITION;
void myfunction (EXP_CONDITION *exp)
{
printf ("\nNumofParam: %u\n", exp->NumofParam);
for (int i = 0; i < MAXV; i++)
printf (" %7.1lf %7.1lf %7.1lf\n", exp->ExperimentResults[i],
exp->ValueofParamOne[i], exp->ValueofParamTwo[i]);
putchar ('\n'); /* tidy up with newline */
}
int main (void)
{
/* initialize your struct to all zero using a named initializer
* or the universal intializer {0}
*/
EXP_CONDITION stInputs = { .NumofParam = 0 };
EXP_CONDITION* pstInputs;
pstInputs = &stInputs;
pstInputs->NumofParam = 2U;
EXP_CONDITION ExpNum[MAXV] = {{ .NumofParam = 0 }};
/*assign values to Experiment 1*/
ExpNum[0].ValueofParamOne[0]=200;
ExpNum[0].ValueofParamTwo[0]=400;
ExpNum[0].ExperimentResults[0]=1000;
/*assign values to Experiment 2*/
ExpNum[1].ValueofParamOne[1]=210;
ExpNum[1].ValueofParamTwo[1]=440;
ExpNum[1].ExperimentResults[1]=2000;
/*assign values to Experiment 3*/
ExpNum[2].ValueofParamOne[2]=220;
ExpNum[2].ValueofParamTwo[2]=480;
ExpNum[2].ExperimentResults[2]=3000;
/* output your first stInputs struct */
puts ("Initial stInputs struct");
myfunction (&stInputs);
/* output values in each of your ExpNum array of struct
* (but note, you only assign one-row in each struct)
*/
puts ("Content of each of ExpNum structs");
for (int i = 0; i < MAXV; i++)
myfunction (&ExpNum[i]);
/* now put all values in your stInputs struct like it appears
* you intended to do?
*/
for (int i = 0; i < MAXV; i++) {
pstInputs->ExperimentResults[i] = ExpNum[i].ExperimentResults[i];
pstInputs->ValueofParamOne[i] = ExpNum[i].ValueofParamOne[i];
pstInputs->ValueofParamTwo[i] = ExpNum[i].ValueofParamTwo[i];
}
/* output the completely filled stInputs struct */
puts ("Output of the completely filled stInputs struct");
myfunction (pstInputs);
return 0;
}
Полный пример Использование / Вывод
$ ./bin/expstruct
Initial stInputs struct
NumofParam: 2
0.0 0.0 0.0
0.0 0.0 0.0
0.0 0.0 0.0
Content of each of ExpNum structs
NumofParam: 0
1000.0 200.0 400.0
0.0 0.0 0.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
2000.0 210.0 440.0
0.0 0.0 0.0
NumofParam: 0
0.0 0.0 0.0
0.0 0.0 0.0
3000.0 220.0 480.0
Output of the completely filled stInputs struct
NumofParam: 2
1000.0 200.0 400.0
2000.0 210.0 440.0
3000.0 220.0 480.0
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.Если я неверно истолковал ваш вопрос, просто оставьте комментарий или отредактируйте свой вопрос и дайте мне знать.