2016-10-27 3 views
0

Пожалуйста, см. Ниже приведенный фрагмент. Как мы можем получить доступ к descrptn от struct sample, используя struct storage?Доступ к структуре typedef внутри другой структуры typedef

typedef struct { 
char hex; 
char descrptn[50]; 
}TypeText; 

typedef struct { 
int val; 
TypeText test[10]; 
}TypePara; 

static const TypeText sample[]={ 
{0x00, "Low"}, 
{0x7F, "Mid"}, 
{0xFF, "HIgh"}, 
}; 

const TypePara storage[]= { 
    {0, sample}, 
    {1, sample} 
}; 
+1

Ни 'storage' ни 'sample' не является структурой. Оба являются массивами. –

+2

Но в любом случае ваш код недействителен и не компилируется, поэтому единственные возможные ответы на поставленный вопрос - это варианты «вы этого не делаете». –

+0

Вместо улучшения вопроса вы добавили один нерелевантный тег и один устаревший тег. –

ответ

0

На самом деле я нашел свое решение, таким способом:

 typedef struct { 
      int age; 
      int RollNo; 
      int Rank; 
      char Name[10]; 
     }TypeStudent; 

     typedef struct { 
      char class_name[20]; 
      TypeStudent *Students; 
     }TypeClass; 

     int main() 
     { 

      const TypeStudent Stu_Details[] = { 
      { 3, 1, 18, "Mahesh"}, 
      { 3, 1, 7, "Kumar"} 
      }; 

       const TypeClass Class_Details[]= { 
      { "Class 10",  Stu_Details}, //two students details 
      { "Class 8",    0} //no student details attached 
      }; 

      printf("\r\nTest: %d",Class_Details[0].Students->Rank); 
      printf("\r\nTest: %d",(Class_Details[0].Students+1)->Rank); 

      return 0; 
     } 
0
storage[index].test[index].descrptn 

Должно работать.

+0

Не будет работать, потому что код OP недействителен для начала. Ничто не работает с ним. –

+0

@ Джона Боллинджера. Я сделал предположение, что ОП просто давал (довольно бедный) пример. Полагаю, поэтому нельзя предполагать. – theKunz

+0

Если структуры были правильно инициализированы, ваш синтаксис идеально подходит и отвечает на основной вопрос. – ryyker

1

Если вы хотите использовать шестнадцатеричные значения, вы должны иметь unsigned char или uint_8, а не char (0xff отрицательный). Также я предполагаю, что вы хотите только TypeText в каждом TypePara, а не массив, но это должно помочь исправить ваш код.

#include <stdio.h> 

typedef struct { 
    unsigned char hex; 
    char descrptn[50]; 
} TypeText; 

typedef struct { 
    int val; 
    TypeText *test; 
} TypePara; 

static TypeText sample[]={ 

{0x00, "Low"}, 
{0x7F, "Mid"}, 
{0xFF, "HIgh"} 

}; 

TypePara storage[]= { 
    {0, &sample[0]}, 
    {1, &sample[1]} 
}; 


int main() 
{ 
    printf("%s\n", storage[0].test->descrptn); 
    return 0; 
} 
+1

Индекс для 'test'? – nullpointer

+2

Это не компилируется для меня, и не кажется, что он должен. –

+0

Мой плохой, я работал с чем-то другим с C++ 11, я исправил его. – cpatricio

2

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

Во-первых, есть некоторые ошибки синтаксиса и неправильные предположения, которые необходимо решить.

1) - Примечание: Поскольку вы инициализация элемента константного выражения в 0xFF, даже если его ориентация в инициализаторе должна идентифицировать его как signed char, в зависимости от компилятора и его настроек, то можно предположить, unsigned char и предупреждать о переполнении. (Это именно то, что происходит в моей системе). Поскольку значение фактически выровнено с signed char, во время выполнения переполнение не должно происходить.
2) - У вас есть массив struct. Хотя простой массив можно инициализировать с помощью переменной (Variable Length Array концепция была действительна с C99.), A struct может быть инициализирован только с постоянными значениями. Поскольку ваш код пытается инициализировать структуру (sample) с переменной, она не должна компилироваться.
3) - Форма инициализатора структуры должна соответствовать форме инициализации структуры, включая положение и тип инициализатора. Поскольку TypePara является составной структурой (структурой, содержащей член структуры), ее инициализатор должен учитывать это. Ваш инициализатор для const TypePara storage[] ={...} не сформирован правильно.

Первые два элемента должны быть четко обозначены для вас с сообщениями времени компиляции. Убедитесь, что ваш компилятор установлен для их просмотра.

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

Каждый из них описан ниже, в синтаксисе и комментариях.

Используя свои struct определения, со следующими указанными изменениями, вы можете получить доступ к descrptn как это: (Ниже приводится полный и компилируется адаптация оригинального поста)

typedef struct { //Note:            
char hex;   //Initializer for TypeText shaped like this:   
char descrptn[50]; //hex   description  
}TypeText;   //{0x01,  "one"}; 

typedef struct { //Note: TypePara is a struct containing an array of struct 
int val;   //Initializer for each instance of TypePara shaped like this: 
TypeText test[10]; //val TypeText[0] TypeText[1]  TypeText[9] 
}TypePara;   //{1, {0x01, "one"},{0x02, "two"}...{0x0A, "Ten"}}; 

static const TypeText sample[]={ 

    {0x00, "Low"}, 
    {0x49, "Mid"}, 
    //{0xFF, "HIgh"} //commented and replaced to 
    {0x7F, "High"} //prevent possible overflow condition 
}; 

//const TypePara storage[]= { 
// {0, sample}, //error, "sample is not a compile time constant 
// {1, sample} 
//}; 

//Note: illustrates shape only. Values are otherwise meaningless 
const TypePara storage[] = { 
    { 0,{{0x00, "zero"},{0x01, "one"},{0x02, "two"},{0x03, "three"},{0x04, "four"},{0x05, "five"},{0x06, "six"},{0x07, "seven"},{0x08, "eight"},{0x09, "nine"}}}, 
    { 1,{{0x01, "zero"},{0x11, "one"},{0x12, "two"},{0x13, "three"},{0x14, "four"},{0x15, "five"},{0x16, "six"},{0x17, "seven"},{0x18, "eight"},{0x19, "nine"}}}, 
    { 2,{{0x02, "zero"},{0x21, "one"},{0x22, "two"},{0x23, "three"},{0x24, "four"},{0x25, "five"},{0x26, "six"},{0x27, "seven"},{0x28, "eight"},{0x29, "nine"}}}, 
    { 3,{{0x03, "zero"},{0x31, "one"},{0x32, "two"},{0x33, "three"},{0x34, "four"},{0x35, "five"},{0x36, "six"},{0x37, "seven"},{0x38, "eight"},{0x39, "nine"}}}, 
    { 4,{{0x04, "zero"},{0x41, "one"},{0x42, "two"},{0x43, "three"},{0x44, "four"},{0x45, "five"},{0x46, "six"},{0x47, "seven"},{0x48, "eight"},{0x49, "nine"}}} 
}; 


int main(void) 
{ 
    //Accessing descrptn 
    printf("descrptn is %s\n", storage[0].test[0].descrptn); 
    printf("descrptn is %s\n", storage[0].test[1].descrptn); 
    printf("descrptn is %s\n", storage[0].test[2].descrptn); 
    printf("descrptn is %s\n", storage[0].test[3].descrptn); 
    //... 
    //This can continue as you have 5 storage elements 
    //defined, each of those containing 10 test elements. 

    return 0; 
} 
+0

Ницца - я не заметил недостающих инициализаторов. Может потребоваться дополнительное '{...}' вокруг вложенного 'struct' init, чтобы оно было строго соответствующим? –

+0

@WeatherVane - У меня не было никаких предупреждений, но согласитесь, если ничего больше, то читаемость. – ryyker

+0

... и освещает проблему. Недавно я опубликовал ответ, который не хватало их, он собрал для меня, но ОП жаловался, что этого не произошло. –

1

В инициализации storage массива , тип sample - это "указатель на константу типаText". Таким образом, чтобы сделать эту работу по инициализации, вам понадобится указатель на const Typetext в структуре TypePara. Таким образом, определение TypePara структуры должно выглядеть следующим образом

typedef struct 
{ 
    int value; 
    const TypeText *array; 
} 
TypePara; 

Вот полный пример:

#include <stdio.h> 

typedef struct 
{ 
    unsigned char hex; 
    char description[50]; 
} 
TypeText; 

typedef struct 
{ 
    int value; 
    const TypeText *array; 
} 
TypePara; 

static const TypeText sample[]= 
{ 
    { 0x00, "Low" }, 
    { 0x7F, "Mid" }, 
    { 0xFF, "High" } 
}; 

const TypePara storage[]= 
{ 
    { 0, sample }, 
    { 1, sample } 
}; 

int main(void) 
{ 
    for (int i = 0; i < 2; i++) 
    { 
     printf("storage with value %d:\n", storage[i].value); 
     for (int j = 0; j < 3; j++) 
      printf(" hex=%02x description='%s'\n", storage[i].array[j].hex, storage[i].array[j].description); 
     printf("\n"); 
    } 
} 
+0

Чтобы было ясно: это делает элементы 'storage' содержат * указатели на * массив' sample', а не массив 'sample'. Это важное различие. –

+0

@JohnBollinger Действительно, как вы указали, есть бесконечные возможности. Я принял подход к тому, чтобы выполнить две инициализации, как, путем настройки определений структуры. ryyker придерживался противоположного подхода к использованию определений структуры как есть и при необходимости корректировал инициализацию. Я оставляю это для ОП, какой подход подходит его потребностям. – user3386109

+0

Да, то, что вы представляете, действительно, и одна из наиболее вероятных альтернатив тому, что фактически хочет ОП. Я заимствую вашу формулировку, потому что я считаю, что особенно важно быть точным с кем-то (то есть с OP), который, по-видимому, немного нечеткий в некоторых основных понятиях. –

Смежные вопросы