Fellas, why is this happening, especially sometimes but not other times?
Here, I run the program three times, getting the exact same correct output. On the fourth, it outputs broken numbers. The function prnStats what’s being executed.
Fellas, why is this happening, especially sometimes but not other times?
Here, I run the program three times, getting the exact same correct output. On the fourth, it outputs broken numbers. The function prnStats what’s being executed.
Thanks for the suggestion! I managed to squish the program down into 105 lines. This is my MRE.
#include<stdlib.h> #include<confuse.h> struct entry { int Day; long int Date; float C; float F; float P; float L; }; int DiaryNum; struct entry *Diary; char DiaryPath[] = "/home/lofenyy/.config/Calorimeter/Diary"; cfg_opt_t entry_opts[] = { CFG_INT("Date", 0, CFGF_NONE), CFG_INT("Day", 0, CFGF_NONE), CFG_FLOAT("C", 0, CFGF_NONE), CFG_FLOAT("F", 0, CFGF_NONE), CFG_FLOAT("P", 0, CFGF_NONE), CFG_FLOAT("L", 0, CFGF_NONE), CFG_END() }; cfg_opt_t entry_base_opts[] = { CFG_SEC("Entry", entry_opts, CFGF_MULTI), CFG_END() }; int lodEntry() { //Initialization cfg_t *cfg; cfg_t *cfg_entry; cfg = cfg_init(entry_base_opts, CFGF_NONE); //Open our file and check for errors if(cfg_parse(cfg, DiaryPath) == CFG_PARSE_ERROR) printf("Err!\n"); //Allocate enough memory for our internal diary DiaryNum = cfg_size(cfg, "Entry"); Diary = malloc(DiaryNum * sizeof(struct entry)); //For every entry in our external diary for(int C = 0;C < cfg_size(cfg, "Entry");C++) { //Copy our entries to our internal diary cfg_entry = cfg_getnsec(cfg, "Entry", C); Diary[C].Date = cfg_getint(cfg_entry, "Date"); Diary[C].Day = cfg_getint(cfg_entry, "Day"); Diary[C].C = cfg_getfloat(cfg_entry, "C"); Diary[C].F = cfg_getfloat(cfg_entry, "F"); Diary[C].P = cfg_getfloat(cfg_entry, "P"); Diary[C].L = cfg_getfloat(cfg_entry, "L"); } cfg_free(cfg); } double getEntryCalories(int C) { //4 calories per carb and protein. 9 per lipid. return 4*(Diary[C].C+Diary[C].P)+9*(Diary[C].L); } int prnStats() { float C,F,P,L,Calories = 0; int day0 = Diary[0].Day; int day1 = Diary[DiaryNum -1].Day; int days = (day1 - day0) +1; //For every diary entry for(int i = 0;i < DiaryNum;i++) { //Count up our nutrients C = C + Diary[i].C; F = F + Diary[i].F; P = P + Diary[i].P; L = L + Diary[i].L; Calories = Calories + getEntryCalories(i); } //Print them out printf("Average Calories: %2.2f\n", (float)(Calories/days)); printf("Average Carbs: %2.2f\n", (float)(C/days)); printf("Average Fibre: %2.2f\n", (float)(F/days)); printf("Average Proteins: %2.2f\n", (float)(P/days)); printf("Average Lipids: %2.2f\n", (float)(L/days)); } int main(int argc, char *argv[]) { // Load our internal food diary from our external food diary // print out our statistics lodEntry(); prnStats(); }
This is the contents of Diary
Entry { Date = 1679542784 Day = 0 C = 6.000000 F = 5.000000 P = 4.000000 L = 3.000000 } Entry { Date = 1679546112 Day = 0 C = 60.000000 F = 50.000000 P = 20.000000 L = 1.000000 } Entry { Date = 1679547008 Day = 0 C = 4.000000 F = 4.000000 P = 4.000000 L = 4.000000 } Entry { Date = 1679547136 Day = 1 C = 4.000000 F = 4.000000 P = 4.000000 L = 4.000000 } Entry { Date = 1679547136 Day = 5 C = 60.000000 F = 50.000000 P = 20.000000 L = 1.000000 }