2012-05-07 3 views
0

Я пытаюсь работать с c-программой в своем разделе в Mac и, как выяснилось, большую часть способов сделать это, но не могу понять очень простую проблему.Умножение двух имен переменных на mac os

так у меня есть .h файл, в котором я декларировать все свои переменные и в моем .c файл я пытаюсь выполнить команду как

L2toL1 = (L2_transfer_time)*(L1_block_size); 

Однако я никогда не получить правильный ответ. Я печатаю переменные перед строкой выше, и они печатаются правильно, но ответ, когда они умножаются вместе, выключен. Итак, как я могу выполнить правильное умножение?

заголовочный файл выглядит

#define CONFIG_PARAM 16 
#define HIT 1 
#define MISS 0 
#define TRUE 1 
#define FALSE 0 

unsigned long long L2=0; 
unsigned long long L1=0; 

int L1_block_size=0; 
int L1_cache_size=0; 
int L1_assoc=0; 
int L1_hit_time=0; 
int L1_miss_time=0; 
int L2_block_size=0; 
int L2_cache_size=0; 
int L2_assoc=0; 
int L2_hit_time=0; 
extern int L2_miss_time=0; 
int L2_transfer_time=0; 
int L2_bus_width=0; 
int mem_sendaddr=0; 
int mem_ready=0; 
int mem_chunktime=0; 
int mem_chunksize=0; 
unsigned long long test; 

Файл .c затем работает следующий и читает в конкретных значениях из конфигурационного файла Ответа на печать ф заявление должно быть 195, но его, как 49567

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include "definitions.h" 

int main(int argc, char *argv[]) { 
    FILE *config_file, *trace; 
    unsigned int address, exec_info; 
    char check, trash[25], op; 
    int j, para; 
    int i=0; 

    if(argc >= 2) 
    config_file = fopen(argv[1],"r"); 
    else 
    config_file = fopen("config0.txt","r"); 

// Grabs desired cache parameters from the specified config files 
while(fscanf(config_file,"%s %d\n",trash,&para) == 2) { 
config[i] = para; 
i++;  
} 

// Close the config file 
fclose(config_file); 

// Puts Cache parameters from config file in desired variables 
InitializeParameters(); 

/* 
unsigned long long L2toL1; 
L2toL1 = (L2_miss_time)*(L1_block_size); 
printf("L2toL1 is: %Lu\n",L2toL1); 

} 

int InitializeParameters() { 
L1_cache_size = config[0]; 
L1_block_size = config[1]; 
L1_assoc = config[2]; 
L1_hit_time = config[3]; 
L1_miss_time = config[4]; 
L2_block_size = config[5]; 
L2_cache_size = config[6]; 
L2_assoc = config[7]; 
L2_hit_time = config[8]; 
L2_miss_time = config[9]; 
L2_transfer_time = config[10]; 
L2_bus_width = config[11]; 
mem_sendaddr=config[12]; 
mem_ready=config[13]; 
mem_chunktime=config[14]; 
mem_chunksize=config[15];  
} 

Спасибо за помощь

+0

Какие входные данные ?; и какие результаты вы получаете? –

+3

Просьба показать полный пример (включая полные определения всех переменных, операторов печати и используемых вами значений). –

+0

Каковы значения? Вы уверены, что переполнение не происходит? – Spidey

ответ

1

Вы, вероятно, получить странные цифры, потому что ваш результат не помещается на целевой переменной , Пример: вы умножаете два числа, которые настолько велики, что не подходят для места назначения памяти.

Например, если у вас есть этот кусок кода:

#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    int a, b, c; 
    a = 2000000000; 
    b = 2000000000; 
    c = a*b; 
    printf ("%d x %d = %d", a, b, c); 
    return 0; 
} 

Напечатает:

2000000000 x 2000000000 = -1651507200 

Сказав это, это не очень хорошая идея, чтобы объявить переменные в файлах заголовков.

+0

это не может быть, если числа умножаются на 32 и 6 – Sean

0

Вы используете %Lu в строке формата printf. Я думаю, L относится только к long double типам, а не long long int типам.

Вы должны использовать %llu так:

printf("L2toL1 is: %llu\n",L2toL1); 

Конечно, это зависит от того, что библиотека C вы используете: не все должным образом соответствуют стандартам, и ваши могут использовать что-то другое.