C: указатели на массив структуры в функции - PullRequest
0 голосов
/ 23 октября 2019

Я хочу создать функцию, которая будет включать или отключать некоторые части функций с условиями. Я создал структуру, которая содержит 4 члена (перечислимые типы, uint8 catNumber, char Name, bool flag).

typedef struct MYSTRUCT
{
 enum modes;
 uint8 catNumber;
 char name;
 bool flag;
 }mystruct;

Enum содержит:

typedef emum MODES {mode1, mode2, mode3}modes;

Итак, после создания шаблона структуры я объявил переменную массива типа структуры. т.е. структурировать переменную mystruct [3]. И я инициализировал каждого члена mystruct.

mystruct  Variable[3] = 
{
[0] ={.modes=mode1,
.catNumber=1,.name = “catA”,
.flag=false},

[1] = {.modes =mode2,
.catNumber=2,.name = “catB”,
.flag=false},

[2] = {.modes =mode3,
.catNumber=3,.name = “catC”,
.flag=false},
};

Таким образом, пользователь должен ввести номер категории и флаг true / false, чтобы включить или отключить часть функции, то есть разные категории из struct и withВ каждом соответствующем режиме выведите имя режима, чтобы убедиться, что оно включено. Таким образом, задача заключается в том, что пользователь может включить одну или несколько категорий. Например,Пользователь вводит: 1 2 верно. Что включает обе категории 1 и 2.

Может кто-нибудь подсказать мне, как мне выполнить эту задачу? И возможно ли не передавать весь тип данных структуры в качестве аргумента func. Я просто хочу объявить указатели в качестве аргумента для указания элементов массива структуры в main ().

1 Ответ

0 голосов
/ 23 октября 2019

Существует два основных способа отправки массива переменной длины из одной функции в другую. Один из вариантов - указать массив (в основном указатель на его первый элемент) и количество элементов. Другой вариант - определить специальный завершающий элемент. Как строки в C - они заканчиваются специальным символом с кодом 0. Вот мой код, основанный на вашем коде и некоторых исправлениях.

#include <stdio.h>
#include <stdint.h>

typedef enum MODES {mode1, mode2, mode3, modeTerminus} modes;

typedef struct MYSTRUCT
{
    enum MODES modes;
    int8_t catNumber;
    const char * name; //As we intend to store a string here, a simple 'char name' is insufficient
    bool flag;
} mystruct;

mystruct Variable[] =
{
    [0] ={
        .modes=mode1,
        .catNumber=1,.name = "catA",
        .flag=false
    },

    [1] = {
        .modes =mode2,
        .catNumber=2,.name = "catB",
        .flag=false
    },

    [2] = {
        .modes =mode3,
        .catNumber=3,.name = "catC",
        .flag=false
    },
    [3] = {
        .modes =modeTerminus
    },
};
void theDataProcessor1(mystruct* theList)
{
   for (const mystruct* theItem=theList; theItem->modes!=modeTerminus; theItem++)
      printf("theDataProcessor1: modes=%d catNumber=%d name=%s flag=%d\n",
              theItem->modes,
              theItem->catNumber,
              theItem->name,
              theItem->flag
            );
}
void theDataProcessor2(mystruct* theList, int Count)
{
    for (int i=0; i<Count; i++)
      printf("theDataProcessor2: modes=%d catNumber=%d name=%s flag=%d\n",
              theList[i].modes,
              theList[i].catNumber,
              theList[i].name,
              theList[i].flag
            );
}
int main()
{
    theDataProcessor1(Variable);
    theDataProcessor2(Variable, 3);
    return 0;
}
...