2010-11-16 2 views
0

У меня возникла проблема с инициализацией массива структур в моей программе на C. Вот функция, где она инициализируется:Проблема инициализации динамического массива 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++; 

} 
+1

Вы также используете WAY слишком много глобальных переменных. Этот материал полностью устарел. – Puppy

+0

Ошибка может не отображаться на линии 129. Возможно, вы пропустите что-то рядом с этой линией. – arifwn

+0

У вас есть другой тип, называемый 'SatCounterTable'? Он должен быть распознан компилятором как выражение, поскольку он является (глобальной) переменной. –

ответ

2

Вы пропускаете точку с запятой в строке 126.


Edit: новая идея

Возможно, у вас есть #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 */ 
+0

Я не могу найти где-нибудь, где я пропущу точку с запятой, и если я прокомментирую эту строку, программа eprogram прекрасно компилируется. Если раньше мне не хватало точку с запятой, компилятор будет жаловаться, не так ли? – Megatron

+1

Вот оно, спасибо. Извините, я действительно не программирую на C часто heh – Megatron

+0

Рад, что я мог бы помочь. Повеселись! – pmg

0

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

Редактировать: Я бы также серьезно рассмотрел ответ PMg.

1

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

static struct SatCounterTableEntry* SatCounterTable; 

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

+0

Это файл области – Megatron

1
SatCounterTable = (struct SatCounterTableEntry *)malloc(sizeof(struct SatCounterTableEntry) * Counter_Count); 

Ugh. Сделай мне одолжение и переписать, что, как

SatCounterTable = malloc(sizeof *SatCounterTable * Counter_Count); 

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

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

+0

Спасибо за подсказку. – Megatron

0

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

#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

Я не могу. Это для назначения компьютерной дуги, и мы должны использовать симулятор SimpleScalar, который является C. Это также единственный исходный файл, который я могу изменить. pmg имел правильный ответ, хотя у меня был знак = в #define – Megatron

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