Как узнать, что объекта не существует

gonzales
Offline
Зарегистрирован: 13.07.2015

Имею следующую картину

struct TDevice {
  byte Type;
  byte Device_ID;
};

struct TGate {
  String Key;
  String Model;
  String Sid;
  byte MiDeviceCount = 0;
  TDevice* Device[MAX_DEVICES];
};

соответственно в какой-то момент создается экземпляр TGate и внутри него создаются экземпляры TDevice.

Но может сложить ситуация, что экземпляр TGate есть, а экземпляров TDevice внутри нет. Естественно, обращение к несуществующему объекту приводит к зависанию, как мне отработать такое исключение?

Я думал, что достаточно будет сделать так

if (Gate[i]->Device[j] != NULL) {

//девайс существует

}

else {

//девайса нет

}

Но почему-то, несмотря на то, что я заведомо знаю, что Device[j] не существует, условие возвращает Истину.

vlad072
Offline
Зарегистрирован: 01.08.2017

В 11 строке напишите:

TDevice* Device[MAX_DEVICES] = NULL;

Тогда при создании очередной переменной типа TGate поле Device  в ней будет автоматически инициироваться нулём.

gonzales
Offline
Зарегистрирован: 13.07.2015

Не компилится.

array must be initialized with a brace-enclosed initializer

gonzales
Offline
Зарегистрирован: 13.07.2015

Но натолкнуло на мысль

Gate[GateNum] = new TGate;
      for (int i=0;i<MAX_DEVICES;i++){
       Gate[GateNum]->Device[i] = NULL; 
      }

при создании нового Gate занулять все девайсы руками. Так сработало, но не понятно, почему без этого не пашет, и что там с памятью по итогу получается.

vlad072
Offline
Зарегистрирован: 01.08.2017

Так а что должно сработать? При выделении памяти для переменной типа TGate в этой памяти может быть что угодно, поля то не инициировал никто.

gonzales
Offline
Зарегистрирован: 13.07.2015

Ну то есть такая конструкция верная

Gate[GateNum] = new TGate;
      for (int i=0;i<MAX_DEVICES;i++){
       Gate[GateNum]->Device[i] = NULL; 
      }

все поля проинициалиизрованы, но в памяти ничего лишнего не болтается, правильно?

vlad072
Offline
Зарегистрирован: 01.08.2017

Ну вроде да.

rkit
Offline
Зарегистрирован: 23.11.2016

TDevice* Device[MAX_DEVICES] = {0}

В описании структуры. И всё.

gonzales
Offline
Зарегистрирован: 13.07.2015

rkit пишет:

TDevice* Device[MAX_DEVICES] = {0}

В описании структуры. И всё.

Ну да, логично, это же массив

TDevice* Device[MAX_DEVICES] = {NULL};

Всем большое спасибо!

Век живи, век учись

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Код, как всегда (ЕРСТ!!!), приведён не полностью, потому, может, там всё и нормально, но меня крайне смутила вот эта фраза:

gonzales пишет:
Имею следующую картину

struct TDevice {
  byte Type;
  byte Device_ID;
};

struct TGate {
  String Key;
  String Model;
  String Sid;
  byte MiDeviceCount = 0;
  TDevice* Device[MAX_DEVICES];
};

соответственно в какой-то момент создается экземпляр TGate и внутри него создаются экземпляры TDevice.

Надеюсь, Вы понимаете, что в данном огрызке кода никакие экземпляры TDevice не создаются?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А вот ту по подробнее Евгений, если не затруднит. Полагаю в объявлении что-то не так, но сильно сомневаюсь в своём умозаключении. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

BOOM пишет:

А вот ту по подробнее Евгений, если не затруднит. Полагаю в объявлении что-то не так, 

Всё так. Объявлен массив указателей. Вот они (указатели) и создаются. Никакие объекты не создаются - кто их будет создавать?