Проблема инициализации динамического массива C - PullRequest
0 голосов
/ 16 ноября 2010

У меня проблема с инициализацией массива структур в моей C-программе. Вот функция, где она инициализируется:

void InitializeBPStructures() {
    SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
}

Counter_Count - целочисленная глобальная переменная, а SatCounterTable объявлен ранее в исходном файле C как

static struct SatCounterTableEntry* SatCounterTable;

и, если это уместно, это мой SatCounterTable struct

struct SatCounterTableEntry {
    enum SatCounter_State Predict_State;
    md_addr_t tag;
};

md_addr_t - это просто метка для unsigned int, соответствующего адресу памяти

Проблема в том, что когда я пытаюсь скомпилировать, я получаю следующую ошибку

sim-safe.c:129: error: expected expression before ‘=’ token

И инициализация массива в моем IntitializeBPStructures() в строке 129. Я не уверен, почему эта строка является проблемой. Есть идеи?

EDIT:

Вот несколько дополнительных строк кода вокруг функции

    struct SatCounterTableEntry
{
    enum SatCounter_State Predict_State;
    md_addr_t tag;
};

/* simulated registers */
static struct regs_t regs;

/* simulated memory */
static struct mem_t *mem = NULL;

/* track number of refs */
static counter_t sim_num_refs = 0;

/* maximum number of inst's to execute */
static unsigned int max_insts;

static struct SatCounterTableEntry* SatCounterTable;

void InitializeBPStructures()
{
    SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
}

void BranchPredict(md_addr_t PC, md_addr_t nextPC, enum Branch_Result result)
{
    if (result == N)
        sim_num_mispred_static++;
    if (result != (myrand() % 2))
        sim_num_mispred_random++;

        sim_num_br++;

}

Ответы [ 5 ]

2 голосов
/ 16 ноября 2010

Вам не хватает точки с запятой в строке 126.


Редактировать: новая идея

Возможно, у вас есть #define с дополнительными =?

#define Counter_Count = 42; /* WRONG */
#define Counter_Count = 42  /* WRONG */
#define Counter_Count 42;   /* WRONG, but it works some time */
#define Counter_Count 42    /* CORRECT */
1 голос
/ 16 ноября 2010
SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count); 

тьфу.Сделайте мне одолжение и перепишите это как

SatCounterTable = malloc(sizeof *SatCounterTable * Counter_Count);

Вам действительно не нужно разыгрывать результат malloc();это не было необходимо с тех пор, как был принят C89.И использование sizeof для объекта, который выделяется, а не для типа, может спасти вас от изжоги (если ничего больше, это спасет некоторые нажатия клавиш)

Текст ошибки предполагает, что что-то не было определено должным образом до этого вызова;по какой-то причине он не распознает SatCounterTable.Я думаю, что PMG на правильном пути.Вы должны пропустить точку с запятой или фигурные скобки или что-то до этого вызова.

1 голос
/ 16 ноября 2010

SatCounterTable объявлен ранее в исходном файле C как

static struct SatCounterTableEntry* SatCounterTable;

Это объявление сделано в области видимости файла или в другой функции? Если последнее, то SatCounterTable имя не будет видно внутри InitializeBPStructures().

0 голосов
/ 16 ноября 2010

Я скомпилировал этот код:

#include <stdlib.h>

typedef unsigned int md_addr_t;
typedef unsigned int counter_t;

int myrand() { return 0; }

struct SatCounterTableEntry
{
    enum SatCounter_State Predict_State;
    md_addr_t tag;
};

static unsigned int Counter_Count;
static unsigned int sim_num_mispred_static;
static unsigned int sim_num_mispred_random;
static unsigned int sim_num_br;
static const unsigned int N = 0;

/* simulated registers */
static struct regs_t {} regs;

/* simulated memory */
static struct mem_t *mem = NULL;

/* track number of refs */
static counter_t sim_num_refs = 0;

/* maximum number of inst's to execute */
static unsigned int max_insts;

static struct SatCounterTableEntry* SatCounterTable;

void InitializeBPStructures()
{
    SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count);
}

void BranchPredict(md_addr_t PC, md_addr_t nextPC, enum Branch_Result result)
{
    if (result == N)
        sim_num_mispred_static++;
    if (result != (myrand() % 2))
        sim_num_mispred_random++;

        sim_num_br++;

}

int main() {
}

У вас должны быть ошибки в других местах вашего кода.Я упоминал, насколько невероятно отвратителен этот дизайн?Вы действительно должны использовать объекты для этого.

0 голосов
/ 16 ноября 2010

Компилятор C, который вы используете, имеет некоторые основания полагать, что SatCounterTable не является lvalue или первичным выражением.Учитывая, как названы ваши переменные (я бы добавил, что это сбивает с толку), возможно ли, что вы определили переменную в более близком объеме также с именем SatCounterTable, так что SatCounterTable не является присваиваемым выражением?

Редактировать: я быТакже серьезно подумайте над ответом pmg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...