0

Mac パーティションで ac プログラムを動作させようとしていますが、ほとんどの方法は理解できましたが、非常に単純な問題がわかりません。

だから私はすべての変数を宣言する.hファイルを持っており、.cファイルで次のようなコマンドを実行しようとしています

L2toL1 = (L2_transfer_time)*(L1_block_size);

しかし、私は正しい答えを得ることはありません。上記の行の前に変数を出力し、それらは正しく出力されますが、乗算された場合の答えはかなりずれています。では、どうすれば正しい乗算を達成できますか?

.h ファイルは次のようになります。

#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 ファイルは次のように実行され、構成ファイルから特定の値を読み取ります。print f ステートメントへの回答は 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];    
}

助けてくれてありがとう

4

2 に答える 2

1

結果が宛先変数に適合しないため、おそらく奇妙な数値が得られます。例: 大きすぎて保存先のメモリ ロケーションに収まらない 2 つの数値を乗算しています。

例、次のコードがある場合:

#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

そうは言っても、ヘッダー ファイルで変数を宣言するのは得策ではありません。

于 2012-05-07T18:20:34.590 に答える
0

%Luprintf フォーマット文字列で使用しています。タイプではなく、タイプにLのみ適用されると思います。long doublelong long int

%llu次のように使用する必要があります。

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

もちろん、使用している C ライブラリによって異なります。すべてが適切に標準に準拠しているわけではなく、別のものを使用している可能性があります。

于 2012-05-08T11:49:00.583 に答える