我正在做项目的一部分,这与直接映射的缓存有关。在下面的代码中,我为缓存元素创建了一个结构:
typedef struct node{
int *tagBits;
int *setBits;
int *blockOff;
} cacheNode;
我想在每个元素中存储相应的块偏移位,设置位和标记位。
例如,给定的内存地址的二进制是:000000000000000000001001110011001001001110101000100。我希望前两位是块偏移,后两位是设置位,其后是其余的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);
}
我的问题是,当我从结构中打印出两个整数数组时,它为set和blockOff给出了“ 00”。答案对于blockOff是正确的,但未设置,设置应为'01'。有什么提示吗?
最佳答案
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);