Страница 1 из 1

Нетрадиционный доступ к массиву

Добавлено: 08 ноя 2012, 19:28
tmp
Коллеги!
Есть массив вот такого структурного вида и разнообразного контента:

Код: Выделить всё

   
struct{
 struct{ 
  char eng[MaxEngNum]; 
  bool IMUaccelX,IMUaccelY,IMUaccelZ;
  bool IMUrotX,IMUrotY,IMUrotZ;
  char GPS; 
 }failed;
 {
  int other_var;
 }many_other_struct_here;
}my_big_struct;
я хочу работать с ним как с обычным отрезком памяти.
как получить доступ к каждому элементу приведенному к char, начиная от его начала?

Поясняю:

Код: Выделить всё

   
    long lvar1=0;
    int i;
    char ch;

//последовательно суммирую все элементы массива что бы выявить, есть ли там хоть чтото отличное от нуля:

    for(i=0;i<sizeof(my_big_struct.failed);i++)
    {

// здесь должна быть строка которая берет char от указанного смещения, от начала массива
           ch=((char *)my_big_struct.failed)[i];
 //примерно что нить такое - вопрос... Что именно? голова полностью запуталась в этих указателях уже...

// потом обычное суммирование каждого байта
     lvar1+=ch;

    }

//а на выходе будет примерно так 
    if(lvar1!=0) WhatWeSend.failures=true;

Re: Нетрадиционный доступ к массиву

Добавлено: 09 ноя 2012, 22:38
Romeo
Напрочь перепутаны понятия структуры и объекта этой структуры. Выглядеть всё должно примерно так:

Код: Выделить всё

struct my_big_struct{
 struct failed_struct{
  char eng[MaxEngNum];
  bool IMUaccelX,IMUaccelY,IMUaccelZ;
  bool IMUrotX,IMUrotY,IMUrotZ;
  char GPS;
 } failed;

  int other_var;

  <many_other_struct_h>
} my_big_object;

Код: Выделить всё

    long lvar1=0;
    int i;
    char ch;

    for(i=0 ;i < sizeof(my_big_struct::failed_struct); ++i)
    {
        ch=((char *)my_big_object.failed)[i];
        lvar1 += ch;
    }

Re: Нетрадиционный доступ к массиву

Добавлено: 22 ноя 2012, 13:36
tmp
Благодарю за наводку!
Ваша к сожалению, не сработала, а вот так вполне устроило компилятор, да и результатом меня:

Код: Выделить всё

long lvar1=0;
unsigned int i;

//BaroStatic - в данном случае это адрес нулевого элемента в субмассиве, сам субмассив компилятору не понравился.

for(i=sizeof(my.failed);i>0;i--) lvar1+=(char)(&my.failed.BaroStatic)[i]; //что нить отличается от нуля?
if(lvar1!=0) WhatWeSend.failures=true;