2015-03-20 2 views
-1

Получение таких ошибок, как stats.c:28:36: error: ‘factoryStats’ has no member named ‘candyConsumed’ factoryStatsArray[producer_number].candyConsumed++; То, что я хочу достичь, - это создать массив структур, а затем получить доступ к его членам. Это неправильный способ сделать это?C: Динамически распределенная структура массива

Пробовал использовать ->, но это не должно и не работает, поскольку я храню структуры, а не указатели на структуры.

#include "stats.h" 
#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int factoryNumber = 0; 
    int candyProduced = 0; 
    int candyConsumed = 0; 
    double minDelay = 0; 
    double avgDelay = 0; 
    double maxDelay = 0; 
} factoryStats; 

factoryStats *factoryStatsArray; 
int NUM_FACTORIES = 0; 

void stats_init (int num_producers) { 
    factoryStatsArray = malloc(sizeof(factoryStats) * num_producers); 
    NUM_FACTORIES = num_producers; 
} 
void stats_cleanup (void) { 
    free(factoryStatsArray); 
} 
void stats_record_produced (int factory_number) { 
    factoryStatsArray[factory_number].candyProduced++; 
} 
void stats_record_consumed (int producer_number, double delay_in_ms) { 
    factoryStatsArray[producer_number].candyConsumed++; 
    if (factoryStatsArray[producer_number].minDelay == 0) { 
     factoryStatsArray[producer_number].minDelay = delay_in_ms; 
    } else { 
     if (factoryStatsArray[producer_number].minDelay > delay_in_ms) { 
      factoryStatsArray[producer_number].minDelay = delay_in_ms; 
     } 
    } 
    if (factoryStatsArray[producer_number].maxDelay == 0) { 
     factoryStatsArray[producer_number].maxDelay = delay_in_ms; 
    } else { 
     if (factoryStatsArray[producer_number].maxDelay < delay_in_ms) { 
      factoryStatsArray[producer_number].maxDelay = delay_in_ms; 
     } 
    } 
    factoryStatsArray[producer_number].avgDelay+= delay_in_ms; 

} 
void stats_display(void) { 
    printf("%8s%10s%10s10s10s10s\n", "Factory#", "#Made", "#Eaten", "Min Delay[ms]", "Avg Delay[ms]", "Max Delay[ms]"); 
    for (int i = 0; i < NUM_FACTORIES; i++) { 
      printf("%8d%8d%8d%10.5f%10.5f%10.5f", 
        factoryStatsArray[i].factoryNumber, factoryStatsArray[i].candyProduced, 
        factoryStatsArray[i].candyConsumed, factoryStatsArray[i].minDelay, 
        factoryStatsArray[i].avgDelay/factoryStatsArray[i].candyConsumed, 
        factoryStatsArray[i].maxDelay); 

    } 
} 

ответ

0

Структуры не могут быть инициализированы таким образом. Удалите все эти = 0 в typedef struct { ... } factoryStats;. Затем он компилируется как в http://ideone.com/uMgDzE.

+0

@Aaron И только чтобы добавить к этому. Если вы хотите, чтобы данные структуры были инициализированы до нуля, вам нужно будет установить memset в 0 после malloc. В качестве альтернативы вы можете заменить malloc на calloc, который обнуляет выделенную память: calloc (num_producers, sizeof (factoryStats)). Кроме того, у вас есть потенциальная утечка памяти - если stats_init получает вызов более одного раза. Вам нужно проверить, является ли factoryStatsArray NULL или нет. Если не NULL необходимо освободить его перед malloc/calloc. – kaylum

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