Добрый день, столкнулся с маленькой проблемой...с непониманием синтаксиса так сказать. У меня есть накая функция test_func( char *buff, unsigned int buff_size, НЕ_ОПРЕДЕЛЁННАЯ_СТРУКТУРА a, unsigned int РАЗМЕР_НЕ_ОПРЕДЕЛЁННОЙ_СТРУКТУРЫ, short c, long d ); buff - буфер в который записаны структуры, buff_size - размер данных в буфере. НЕ_ОПРЕДЕЛЁННАЯ_СТРУКТУРА - это значит, что мне надо в эту функцию передавать совершенно разные структуры, и их вид мне особо не известен. (причём это скорее всего будет массив структур, ..массив переменной длинны..и в аргументе функции не должно указываться количество структур.) РАЗМЕР_НЕ_ОПРЕДЕЛЁННОЙ_СТРУКТУРЫ - размер, передаваемой структуры. Собственно в теле функции, мне нужно передвигаться по buff точнее по структурам которые в него записаны. Например вот тело функции. test_func( char *buff, unsigned int buff_size, НЕ_ОПРЕДЕЛЁННАЯ_СТРУКТУРА a, unsigned int РАЗМЕР_НЕ_ОПРЕДЕЛЁННОЙ_СТРУКТУРЫ, short c, long d ) { int i = 0; char *ptr = // Указатель на неопределённую структуру unsigned int struct_count = buff_size/ РАЗМЕР_НЕ_ОПРЕДЕЛЁННОЙ_СТРУКТУРЫ; ptr = buff; for(i=0; i <struct_count; i++) { /* Тут мне нужно произвести запись данных в структуры допустим в структурах(во всех различнах структурах) есть элемент ELEMENT и мне надо записать туда какоето значение */ ptr->ELEMENT = 9; // например записываем 9........... Собственно как сделать это действие, так чтоб компилятор понимал, что ptr это указатель "на какуюто структуру , какогото типа" /* также как сделать, правильно, чтоб при инкрименте указателя ptr++ ,ptr указывал на следующую структуру записанную в buff */ ..... } } Надеюсь вопрос ясен) Жду помощи.
Придумал более простое объяснение вопроса. Вот например. int func ( void *STRUCT_PTR, int STRUCT_TYPE ) { /* Мне нужно чтоб в этой функции структура STRUCT_PTR стала структурой типа STRUCT_TYPE */ }
featurelles Размер у вас есть, смещение по которому находится ELEMENT как понимаю тоже известно. Код (Text): char* ptr; abstract_struct*_ptr = (abstract_struct*)ptr; _ptr->ELEMENT=value; ptr += size;
Booster Спасибо за ответ. Хоть это и не совсем то , что было нужно. (я уже разобрался со своей проблемой, так что можно на вопрос забить, но всёже хочется разобраться....) Вот представим есть несколько структур struct st_1 { char text_1[500]; int ELEMENT; char text _2[100]; ..... } struct st_2 { char text[100]; int ELEMENT; .... } и есть функция. в которую передаётся указатель на некий массив байт... func( char *buff, int type_struct ); а в теле данной функции, вот такое { *ptr; // Надо чтоб он в зависимости от type_struct стал, либо struct st_2 *ptr , либо struct st_1 *ptr /* чтоб далее было, либо так */ struct st_2 *ptr = (struct st_2 *)buff; /* либо так */ struct st_1 *ptr = (struct st_1 *)buff; /* Чтоб при присваивании значения ELEMENT */ /* было так */ ptr->ELEMENT = 9; // ptr указатель на struct st_1 /* либо так */ ptr->ELEMENT = 9; // ptr указатель на struct st_2 } Это мы рассматриваем простой пример, где ELEMENT в одной и в другой структуре, имеют одинаковые типы. Вот как этого добиться? ))
вам нужно в цикле передавать структуры. структура->element.size=value; примерно так... здесь указатель обновляеться...
featurelles Так же как и в Си. Максимум можно сделать шаблон или их аналог в Си - макрос. То что Вы хотите, менять тип переменой в рантайме это динамическая типизация.
Если надо передать структуру в функцию и тип структуры не определен, можно попробовать такой вариант. Вариант не универсальный: он работает только если известно, какие структуры могут передаваться.