Программирование на C странной структуры - PullRequest
3 голосов
/ 22 сентября 2010

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

   /*
 * main.c
 *
 *  Created on: Sep 16, 2010
 *      Author: TJ
 */
#include <stdlib.h>
#include <stdio.h>
typedef struct {
int tag;
int valid;
int LRU;
int offset;
}directoryBlock;

typedef struct{
int setNumber;
directoryBlock blocks[];
}cacheSet;

typedef struct{
int cacheNumber;
cacheSet *sets[];
}cache;

cache* makeCache(cache *makeMe,int numberOfSets, int blocksPerSet);


int main(void)
{
    int i = 0;
    //cache * temp = makeCache(10,200);
    i = 0;
    int j = 0;
    cache *instructions = malloc(sizeof(cache) + sizeof(cacheSet*));
    cache *data = malloc(sizeof(cache) + sizeof(cacheSet*));
    makeCache(instructions,20,300);
    makeCache(data,20,300);
    for(j=0;j < 20;j++)
            {
                for(i = 0; i < 300;i++)
                {
                    printf("Data From Set %d Block %d, Valid %d, Tag %d, LRU %d, Offset %d\n",j,i
                            ,instructions->sets[j]->blocks[i].valid,instructions->sets[j]->blocks[i].tag
                            ,instructions->sets[j]->blocks[i].LRU,instructions->sets[j]->blocks[i].offset);
                }
            }

    return 0;

}

cache* makeCache(cache *makeMe,int numberOfSets,int blocksPerSet)
{
    int i = 0;
    int j = 0;
    for(j=0; j < numberOfSets;j++)
    {

        cacheSet *newSet = malloc(sizeof(cacheSet) + sizeof(directoryBlock)*blocksPerSet);
        for(i = 0; i < blocksPerSet; i++)
        {
            directoryBlock temp;
            temp.LRU = i*j;
            temp.tag = i*j;
            temp.offset = i*j;
            temp.valid = i;
            newSet->blocks[i] = temp;
        }
        makeMe->sets[j] = newSet;
    }



    return makeMe;
}

Ответы [ 2 ]

3 голосов
/ 22 сентября 2010

Вы не выделяете место для массива cacheSet, у вас есть 20 cacheSets, поэтому попробуйте это с добавлением "20 *" в ваши строки:

cache *instructions = malloc(sizeof(cache) + 20 *sizeof(cacheSet*));
cache *data = malloc(sizeof(cache) + 20 * sizeof(cacheSet*));
0 голосов
/ 22 сентября 2010

В вашей основной функции вы выделяете память для кеша.Поскольку у вас есть функция, предназначенная для создания кэша, она должна выделять память.Эта функция имеет параметры для определения общего объема памяти.Если вы делаете это отдельно, вы повторяете эту информацию и требуете от себя точно помнить, как распределять память.Если функция makeCache сделает это за вас, это сохранит боль позже.Просто убедитесь, что ваша документация отмечает, что функция makeCache выделяет память.

Ваша кеш-память неверна, но не так, как указывалось ранее.Просто sizeof (кеш) - это правильный размер.Это освободит место для int и cacheSet **.Затем вы должны выделить память для массива cacheSet в каждом кеше.Затем вы должны выделить память для каждого каталогаBlock в каждом cacheSet в кэше .... котята, кошки, мешки и жены ...

Так что все ваши выделения должны быть просто Thing *t sizof(Thing);

В псевдокоде:

cache *c = malloc(sizeof(cache))
for 0 to number of cacheSets:
  cacheSet *s = malloc(sizeof(cacheSet))
  for 0 to number of blocks:
    block *b = malloc(sizeof(block))
    //fill in data

JD

...