Как распечатать элементы структур, содержащихся в массиве

Существует множество вещей, которые вызывают erroer с компиляцией вашего кода.

  1. Прежде всего, эта конструкция Operand::castInt8 не имеет смысла для компилятора, поскольку Operand не является классом / структурой, а шаблоном класса. Чтобы получить указатель на функцию, вам нужен конкретный тип, а не его шаблон. Поэтому что-то вроде этого было бы более разумным Operand<int>::castInt8, например.
  2. Тип bool castInt8(void) не является bool (*)(void), как кажется. Нестатические функции-члены имеют более сложные типы. В вашем случае это будет bool (Operand<sometype>::*)(void).
  3. . Последнее: компилятор не знает, что шаблон Operand имеет член castInt8 перед определением. Поэтому вы должны переупорядочить его следующим образом:
    template <typename T>
    class Operand : public IOperand {
        ...
        bool    castInt8(void) {...}
    }
    
    t_typeInfo typeInfo[] =
    {
        {0, &Operand<sometype>::castInt8},
    };
    

Объединив все это, он будет выглядеть так:

template <typename T> class Operand;

typedef struct  s_typeInfo
{
    int     enum_nb;
    bool    (Operand<int>::*fct_cast)(void);
}               t_typeInfo;


template <typename T>
class Operand {
    public:
    bool    castInt8(void) {}
};


t_typeInfo typeInfo[] =
{
    {0, &Operand<int>::castInt8},
};
0
задан youngwarlock 19 January 2019 в 16:03
поделиться

1 ответ

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct s
{
    char *value;
} S;

S list[2];

void function( )
{
    char val1[] = "val1";
    char val2[] = "val2";
    //Note that you are creating a copy of "val1" here which can be avoided by changing it to char *val1 = "val1";

    list[0].value = malloc(strlen(val1)+1); //allocate space for val1 + NUL-terminator
    strcpy(list[0].value, val1); //copy string
    list[1].value = malloc(strlen(val2)+1);
    strcpy(list[1].value, val2);

    //You could also use the function strdup which allocates memory and duplicates the string
    //list[0].value = strdup(val1);

    printf("%s\n", list[1].value); //prints val2
}

int main(int argc, char** argv)
{
    function();
    printf("%s", list[1].value);

    free(list[0].value); //Don't forget to free.
    free(list[1].value);
    return 0;
}
0
ответ дан Osiris 19 January 2019 в 16:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: