используется неинициализированным в этой функции [-Wuninitialized] - PullRequest
0 голосов
/ 24 мая 2019

Я делаю симуляцию кеша памяти на C ++, и после большого количества кодирования я получаю эту ошибку:

g++ main.cpp blocoMemoria.cpp endereco.cpp instrucao.cpp mmu.cpp maquina.cpp -o joubert.o -g -Wall

main.cpp: In function ‘int main(int, const char**)’:

main.cpp:18:29: warning: ‘ram’ is used uninitialized in this function [-Wuninitialized]
BlocoMemoria *ram = gerarBM(ram, tamanhoRam);
                  ~~~~~~~^~~~~~~~~~~~~~~~~

main.cpp:19:32: warning: ‘cache1’ is used uninitialized in this function [-Wuninitialized]
BlocoMemoria *cache1 = gerarBM(cache1, tamanhoCache1);
                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~

main.cpp:20:32: warning: ‘cache2’ is used uninitialized in this function [-Wuninitialized]
BlocoMemoria *cache2 = gerarBM(cache2, tamanhoCache2);
                     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~

main.cpp:26:66: warning: ‘memoriaInstrucoes’ is used uninitialized in this function [-Wuninitialized]

Instrucao *memoriaInstrucoes = montarInstrucoesProgramaAleatorio(memoriaInstrucoes, tamanhoPrograma, qdePalavrasBloco, tamanhoRam);

Это моя главная:

#include <iostream>
#include <bits/stdc++.h>
#include "endereco.hpp"
#include "instrucao.hpp"
#include "blocoMemoria.hpp"
#include "mmu.hpp"
#include "maquina.hpp"

using namespace std;

int main(int argc, char const *argv[]){
    int tamanhoRam= 1000;
    int tamanhoCache1 = 8;
    int tamanhoCache2 = 16;
    int tamanhoPrograma = 1000;
    int qdePalavrasBloco = 4;

    BlocoMemoria *ram = gerarBM(ram, tamanhoRam);
    BlocoMemoria *cache1 = gerarBM(cache1, tamanhoCache1);
    BlocoMemoria *cache2 = gerarBM(cache2, tamanhoCache2);

    montarRam(ram, tamanhoRam, qdePalavrasBloco);
    montarCacheVazia(tamanhoCache1, cache1);
    montarCacheVazia(tamanhoCache2, cache2);

    Instrucao *memoriaInstrucoes = montarInstrucoesProgramaAleatorio(memoriaInstrucoes, tamanhoPrograma, qdePalavrasBloco, tamanhoRam);

    maquina(memoriaInstrucoes, ram, cache1, cache2);
    deleteBM(cache2);
    deleteBM(cache1);
    deleteBM(ram);
    deleteInst(memoriaInstrucoes);
    cout<<"terminou\n";

    return 0;
}

Это мой blocoMemoria.cpp:

#include "blocoMemoria.hpp"
using namespace std;
struct blocoMemoria{
        int *palavras = new int[4];
        int endBloco = -1;
        bool atualizado = false;
        int custo = 0;
        int cacheHit = 0;
};

BlocoMemoria* gerarBM(BlocoMemoria* b, int q){
    b=new BlocoMemoria[q];
    return b;
}
BlocoMemoria *posToPoint(BlocoMemoria *z, int k){
    BlocoMemoria *aux=&z[k];
    return aux;
}

void deleteBM(BlocoMemoria *a){
    delete a;
}

void juntarBM(BlocoMemoria *a, BlocoMemoria *b, int i){
    if(i==1){
        setPalavras(a, getPalavras(b));
        setEndBloco(a, getEndBloco(b));
        setAtualizado(a, isAtualizado(b));
        setCusto(a, getCusto(b));
        setCacheHit(a, getCacheHit(b));
    }

    else{
        setPalavras(&a[i], getPalavras(b));
        setEndBloco(&a[i], getEndBloco(b));
        setAtualizado(&a[i], isAtualizado(b));
        setCusto(&a[i], getCusto(b));
        setCacheHit(&a[i], getCacheHit(b));
    }
}

int getCusto(BlocoMemoria *c) {
    return c->custo;
}

void setCusto(BlocoMemoria *c, int custo) {
    c->custo = custo;
}

int* getPalavras(BlocoMemoria *c) {
        return c->palavras;
}

int* getPalavras(BlocoMemoria *c, int i) {
        return c[i].palavras;
}

void setPalavras(BlocoMemoria* c,int *palavras) {
    c->palavras = palavras;
}

int getEndBloco(BlocoMemoria *c) {
    return c->endBloco;
}

void setEndBloco(BlocoMemoria *c, int endBloco) {
    c->endBloco = endBloco;
}

bool isAtualizado(BlocoMemoria *c) {
    return c->atualizado;
}

void setAtualizado(BlocoMemoria *c) {
    c->atualizado = !c->atualizado;
}
void setAtualizado(BlocoMemoria *c, bool d) {
    c->atualizado = d;
}

int getCacheHit(BlocoMemoria *c) {
    return c->cacheHit;
}

void setCacheHit(BlocoMemoria *c, int cacheHit) {
    c->cacheHit = cacheHit;
}

Я немного новичок, поэтому я понятия не имею, почему это происходит, если я возвращаю правильный указатель на:

BlocoMemoria* gerarBM()

Я пытался просто объявить их в основном как BlocoMemoria * ram = новая BlocoMemoria []; но компилятору это не очень нравится.

причина, по которой мне нужно это исправить, заключается в том, что в основной программе не выполняются никакие операции.

компилируется без -Wall

делаю это часами, и я становлюсь отчаянным и не знаю, даю ли я хоть необходимую информацию, если вам что-то нужно, просто дайте мне знать и плохо отредактируйте это, спасибо.

1 Ответ

1 голос
/ 24 мая 2019

Эта строка является проблемой:

BlocoMemoria *ram = gerarBM(ram, tamanhoRam);

Вы используете ram справа от того же выражения, в котором вы его определяете.

Вместо этого вы можете изменить gerarBM следующим образом:

BlocoMemoria* gerarBM(int q){
    return new BlocoMemoria[q];
}

и назовите это как:

BlocoMemoria* ram = gerarBM(tamanhoRam);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...