我正在研究我的项目的一部分,这与直接映射的缓存有关。在下文中,我为缓存元素创建了一个结构:
typedef struct node{
int *tagBits;
int *setBits;
int *blockOff;
} cacheNode;
我想在每个元素中存储相应的块偏移位,设置位和标记位。
例如,给定的存储器地址的二进制是:000000000000000000001001110010110011110101000100。我希望前两位是块偏移,接下来的两位是设置位,后面剩下的44是标记。结果应该是blockOff = 00,setBit = 01 tag = rest。参数:blockOff,setBits和tagBits表示多少位属于二进制位(blockOff = 2,set = 2和tag = 44)。这是我到目前为止所尝试的:
void directMap(cacheNode** cache,int blockOff, int setBits, int
tagBits,int* binary)
{
int tagDec, blockDec, setDec, i= 0;
cacheNode* element = (cacheNode*)malloc(sizeof(cacheNode));
element->blockOff = (int*)malloc(blockOff * sizeof(int));
element->setBits = (int*)malloc(setBits * sizeof(int));
element->tagBits = (int*)malloc(tagBits * sizeof(int));
for(i = 0; i< 48; i++){
if(i = 0 && i < blockOff){
element->blocOff[i] = binary[i];
}
else if(i = (blockOff) && i < (blockOff + setBits)){
element->setBits[i] = binary[i];
}
}
printString(element->blockOff,blockOff);
printString(element->setBits,setBits);
}
我的问题是,当我从我的结构中打印出两个整数数组时,它给了我&#39; 00&#39; for set和blockOff。对于blockOff,答案是正确的但未设置,设置应为&#39; 01&#39;。任何提示为什么?
答案 0 :(得分:0)
for(i = 0; i< 48; i++){
if(i = 0 && i < blockOff){
// Does not executes when above `if()` is true when `blockOff` is positive.
else if(i = (blockOff) && i < (blockOff + setBits)){
使用i
肯定是错误的。 if(i = 0 && i < blockOff)
不断重新分配i
。 =
是作业。 ==
用于比较。
更改为
for(i = 0; i< 48; i++){
if(i == 0 && i < blockOff){
else if(i == (blockOff) && i < (blockOff + setBits)){
这也意味着并非所有警告都已启用。节省时间,启用所有编译器警告。
可能存在其他问题。
提示:避免malloc
编码错误。简化并分配给被引用的对象。
// element->blockOff = (int*)malloc(blockOff * sizeof(int));
element->blockOff = malloc(sizeof *(element->blockOff) * blockOff);