#c #struct #crash #member
#c #структура #сбой #Участник
Вопрос:
Что бы я ни делал, кажется, что я могу получить доступ к x, даже если он реализован почти так же, как y. Я не уверен, что это какая-то проблема с доступом к памяти. Программа завершает работу при первом обращении к x без ошибок компиляции или предупреждений. Этап вызова в процессоре работает нормально, если x там нет. Любая помощь будет замечательной.
ESys.h
#pragma once
namespace ESYS
{
struct InterconnectI
{
int y;
std::vector<uint8_t>amp; Ip;
std::vector<uint8_t>amp; Ir;
InterconnectI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; r);
~InterconnectI(){};
void hi(int n);
};
struct CPUI
{
int x;
CPUI();
~CPUI(){};
void step(InterconnectI* i);
};
struct SystemI
{
CPUI* CPU;
InterconnectI* Interconnect;
SystemI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; r);
void Step();
};
}
ESys.cpp
#include "stdafx.h"
#include "ESys.h"
namespace ESYS
{
InterconnectI::InterconnectI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; r) : Ip(p), Ir(r)
{
y = 0;
}
void InterconnectI::hi(int n)
{
std::cout << "Interconnect " << n << std::endl;
}
CPUI::CPUI()
{
x = 5;
}
void CPUI::step(InterconnectI* i)
{
std::cout << "Step CPU -> " x; //Accessing doesn't work...
i->hi(x); //Passing doesn't work...
}
SystemI::SystemI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; r)
{
CPUI* CPU = new CPUI();
InterconnectI* Interconnect = new InterconnectI(p, r);
}
void SystemI::Step()
{
CPU->step(Interconnect);
}
}
Main.cpp
#include "stdafx.h"
#include "ESys.h"
std::vector<uint8_t> pDat;
std::vector<uint8_t> rDat;
int main(int argc, const char *argv[])
{
ESYS::SystemI ESystem(pDat, rDat);
ESystem.Interconnect->y = 11;
for (;;)
{
ESystem.Step();
}
return 0;
}
Ответ №1:
Проблема здесь:
SystemI::SystemI(std::vector<uint8_t>amp; p, std::vector<uint8_t>amp; r)
{
CPUI* CPU = new CPUI();
InterconnectI* Interconnect = new InterconnectI(p, r);
}
Результаты new
присваиваются локальным переменным CPU
и Interconnect
. Элементы данных SystemI::CPU
и SystemI::Interconnect
остаются неинициализированными.
Комментарии:
1. Как я могу их инициализировать? Я перепробовал все, что нашел по этому вопросу, но, должно быть, я чего-то не хватает.
2. Вы можете просто удалить определения локальной переменной:
CPU = new CPUI(); Interconnect = new InterconnectI(p, r);
. Хотя, лучше рассмотреть возможность использования интеллектуальных указателей