Простенький вопрос по СИ

Тема в разделе "WASM.BEGINNERS", создана пользователем featurelles, 5 ноя 2010.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Добрый день, столкнулся с маленькой проблемой...с непониманием синтаксиса так сказать.


    У меня есть накая функция
    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 */
    .....
    }
    }


    Надеюсь вопрос ясен) Жду помощи.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Заведите enum - тип структур и предавайте его.
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Придумал более простое объяснение вопроса.

    Вот например.
    int func ( void *STRUCT_PTR, int STRUCT_TYPE )
    {
    /* Мне нужно чтоб в этой функции структура STRUCT_PTR стала структурой типа STRUCT_TYPE */


    }
     
  4. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Booster
    Можно пример? =)
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    featurelles
    Размер у вас есть, смещение по которому находится ELEMENT как понимаю тоже известно.

    Код (Text):
    1. char* ptr;
    2. abstract_struct*_ptr = (abstract_struct*)ptr;
    3. _ptr->ELEMENT=value;
    4. ptr += size;
     
  6. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    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 в одной и в другой структуре, имеют одинаковые типы.

    Вот как этого добиться? ))
     
  7. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    вам нужно в цикле передавать структуры.
    структура->element.size=value;
    примерно так...
    здесь указатель обновляеться...
     
  8. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    первым полем структуры пусть будет размер структуры
    еще можно посмотреть в сторону rtti
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Никак, в Си нет динамической типизации.
     
  10. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    not1
    punxer
    Спасибо за ответы.

    Booster
    А как дела в с++ с этим обстоят?
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    featurelles
    Так же как и в Си. Максимум можно сделать шаблон или их аналог в Си - макрос. То что Вы хотите, менять тип переменой в рантайме это динамическая типизация.
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Managed C++
     
  13. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Booster
    Для общего развития.... в каких языках это поддерживается?
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
  15. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
  16. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Всем спасибо за ответы)
    Вопрос снят.
     
  17. Monogen

    Monogen New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2008
    Сообщения:
    90
    Если надо передать структуру в функцию и тип структуры не определен, можно попробовать такой вариант.
    Вариант не универсальный: он работает только если известно, какие структуры могут передаваться.