Struct Array в C ++ (Rad Studio 10.1 - приложение для Android) - PullRequest
0 голосов
/ 08 мая 2018

Я обычно широко использовал структурные массивы для массивов в C ++ для окон, с памятью, назначенной через new и delete в конструкторе и деструкторе соответственно.

Это мое первое приложение для Android.

Приложение вылетает, с тех пор как я сменил свой первый массив с простого определяется как float AccelZ [1000] в заголовочном файле используется как AccelZ [i]

в массив структур, определенный в заголовочном файле и с новыми и удаляемыми в событиях FormCreate и FormDestroy. и используется как AccelArray [i] -> Z

Не используются ли структурные массивы в Android? Но если бы это было так, то я бы ожидал ошибку компиляции.

Спасибо

Отредактировано сейчас с примером:

В заголовочном файле:

const int MAXTIMESTEPS = 20000;  
struct AccelerationRecord  
{  
    float Z;  
};  

Под общедоступным:

AccelerationRecord* Acceleration[MAXTIMESTEPS];

В файле .cpp под FormCreate. В Windows я бы поместил это в Конструкторе, но это не сработало здесь для приложения для Android (я новичок в приложениях для Android)

void __fastcall TTabbedwithNavigationForm::FormCreate(TObject *Sender)
{  
    for (int i; i < MAXTIMESTEPS; i++)  
      Acceleration[i] = new AccelerationRecord;  
>>snip other code    
}  

Под FormDestroy (используется, чтобы поместить это в деструктор в Windows App)

void __fastcall TTabbedwithNavigationForm::FormDestroy(TObject *Sender)  
{  
    for (int i; i < MAXTIMESTEPS; i++)  
      delete Acceleration[i];  
}  

позже в приложении, при первом использовании как

if (MotionSensor1->Sensor-
>AvailableProperties.Contains(TCustomMotionSensor::TProperty::AccelerationZ))  
{  
lbAccelerationZ->Text = lbAccelerationZ->Text.sprintf(L"Acceleration Z: %6.2f",MotionSensor1->Sensor->AccelerationZ+1);  
Counter += 1;  
Acceleration[Counter]->Z = MotionSensor1->Sensor->AccelerationZ+1;  
//crashes at this line in debug mode  
>> snip other code  
}  

1 Ответ

0 голосов
/ 09 мая 2018

прежде всего:

for (int i; i < MAXTIMESTEPS; i++)

должно быть

for (int i=0; i < MAXTIMESTEPS; i++)

с неинициализированным i вы можете получить доступ к массиву за пределами границ, вызывающих сбои. То же самое касается вашего:

Counter += 1;

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

секунда, я более привык к этому:

// "globals"
const int MAXTIMESTEPS = 20000; 
struct AccelerationRecord  
    {  
    float Z;  
    };  
AccelerationRecord* Acceleration=NULL;

// init
Acceleration = new AccelerationRecord[MAXTIMESTEPS];

// here do your stuff on AccelerationRecord[i]
AccelerationRecord[7].z=-1.5;

// exit
delete[] Acceleration;

single new/delete[] намного лучше, чем вызывать его для каждой записи по двум причинам. Во-первых, вы меньше напрягаете диспетчер памяти (меньше накладных расходов), а во-вторых, вы получаете непрерывный блок памяти и запоминаете только один указатель на один и тот же материал вместо 20000, использующего меньше памяти и обладающего более быстрым и линейным доступом ...

...