Указатели на структуры в си

Тема в разделе "WASM.BEGINNERS", создана пользователем featurelles, 19 июн 2009.

  1. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Прошу прощения за вопрос не связанный с сис программингом.
    Надеюсь получить тут быстрый ответ, и тогда можно удалять тему.
    У меня возникли затруднения с кодом на си ( видимо сказывается маленький опыт ).
    Вопрос вот в чём)
    определяю некую структуру назовём её test_struct пусть будут в ней элементы, char name и int len

    динамически выделяю память для хранения адресов динамических структур.
    int *pointer_map;
    pointer_map = malloc( N*sizeof(int) ); // выделяем память для хранения адресов структур

    затем динамически выделяю память для этой структуры ( N раз ).
    struct test_struct *p_struct; //указатель на структуру
    p_struct = malloc(sizeof(test_struct));

    записываю указатель на тока-что выделенную структуру в 4 байта по адресу pointer_map
    *pointer_map = p_struct; и так в цикле для N структур)

    Теперь я думаю примерно понятно что сделано.
    Теперь дальше)

    есть функция..назову её my_function
    в неё надо передать записанный адрес динамически выделенной структуры test_struct, записанный в *pointer_map
    делаю примерно так
    вызов функции my_function( *pointer_map );

    Код (Text):
    1. int my_function( int *p )
    2. {
    3.    p; // содержит адрес динамического массива.
    4.  
    5. }
    Мне нужно обратиться к элементам name и len динамически выделенной структуры test_struct (адрес которой токачто был передан функции my_function )



    Как это сделать?...даже не знаю сколько времени уже на это убил.
     
  2. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    преобразование типов юзай
     
  3. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    bendme
    Вот тут маленькая проблема, юзал.... много разных синтактических фокусов опробовал. Но на верный не попал, что и сподвигло меня, открыть эту тему. Посчитал, что так будет быстрее справится с проблемой.

    Если не сложно, на примере my_function , pointer_map и test_struct приведите рабочий пример.
     
  4. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    фокусы в студию
     
  5. featurelles

    featurelles New Member

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

    Код (Text):
    1. int my_function( int *p )
    2. {
    3.    p; // содержит адрес динамического массива.
    4. struct test_struct *p_struct; //указатель на структуру
    5.         *p_struct = p;  //   ошибка: несовместимые типы в присваивании
    6. }
     
  6. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    Код (Text):
    1. typedef struct t_struct
    2. {
    3.      ....
    4. } test_struct, *ptest_struct;
    5.  
    6. int my_function( int *p )
    7. {
    8.       ptest_struct p_struct = NULL;
    9.       p_struct = (ptest_struct)p;
    10. }
    только бред имхо :)
     
  7. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    megaaa
    Возможно и бред) но тогда как бы ты сделал?
     
  8. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    struct test_struct
    {
    int len;
    char * name;
    };

    void f1(int * Pointer)
    {
    test_struct * P = (test_struct *)Pointer;
    P->len=3445;
    }
    void f2(){
    test_struct * Ptest = new test_struct[10];
    int * Pointer= new int;
    Ptest[0].len=3;
    Ptest[5].name= new char[100];
    Pointer=(int *)&Ptest[5];
    f1(Pointer);
    }
     
  9. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    featurelles
    нет, я в плане того что понять не могу зачем это надо :)
    вы бы задачу конкретнее изложили
     
  10. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    нафиг тебе это?:
    int *pointer_map;
    pointer_map = malloc( N*sizeof(int) ); // выделяем память для хранения адресов структур

    когда вот это есть?
    struct test_struct *p_struct; //указатель на структуру
    p_struct = malloc(sizeof(test_struct));

    чет ты не разобрался совсем
     
  11. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    megaaa
    кста опробовал такой код, у меня выдаёт
    ошибка: ‘p_struct’ не описан (первое использование в этой функции)
    ошибка: (Сообщение о неописанном идентификаторе выдается один раз
    ошибка: для каждой функции, в которой он используется.)
    ошибка: expected ‘;’ before ‘p’
    скомпилить не получается ((

    ошибка: ‘p_struct’ не описан (первое использование в этой функции) ... = ptest_struct p_struct = NULL;
    причём ptest_struct объёвлено и по идее компилиться должно

    ошибка: expected ‘;’ before ‘p’ обычно выдаётся когда ";" забываю поставить).. но в этом случаи код такой
    p_struct = (ptest_struct)p;




    Это мне нужно, чтобы в дальнейшем сделать функцию, которая будет в цикле, по прибавлению к текущему адресу 4-х, получать адреса нужных структур и в дальнейшем модифицировать их, и получать оттуда некие данные (которые нужно будет очень часто считывать и записывать).
    Полагаю так будет работать быстрее..но не уверен в этом)


    bendme
    щас Ваш код посмотрю.
     
  12. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    блин редактирования нет, не внимательно твой первый пост прочитал, зачем их вобще хранить?задача какая?
    Если я правильно понял, то лучше сделать одно или двух связный список, либо обращаться к структуре как массиву
     
  13. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    странно, у тебя какой компилятор?
     
  14. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    megaaa
    gcc
     
  15. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Сейчас свой код проверяю... ( может причина была вместо p_struct = malloc(sizeof(test_struct)); использовать pointer_map = malloc( N*sizeof(int) ) )... хотя, возможно и вправду, я просто не допёр.
     
  16. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    изврат какой-то
     
  17. featurelles

    featurelles New Member

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

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    Кстати, идея была такая. Разместить последовательно в памяти адреса новых созданных структур ( которые создаются в разные промежутки времени ) чтоб осуществлять к ним доступ через *pointer_map . Тип int был выбран, так как занимает 4 или 8 байт(зависит от архитектуры) в которых какрас хватит места, чтоб указать адресс новой структуры данных.
    ( но теперь понимаю, что надо изменить *pointer_map на указатель на структуры данных ) в таком случаи.. компилятор перестанет ругаться.
     
  19. bendme

    bendme New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    179
    Смотри, у тя есть структура test_struct.
    Создаешь массив этих структур например так:
    test_struct structs[10];

    Допустим, тебе надо передать этот массив функции f1 из функции f2:

    void f1(test_struct * P)
    {
    P[3].len=6;
    }

    void f2()
    {
    test_struct structs[10];
    structs->len=3;
    f1(structs);
    }

    Вот и всё, у тебя в функцию передается адрес начала массива, можешь работать с любым элементом.
     
  20. featurelles

    featurelles New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    562
    И совсем забыл,
    Спасибо БОЛЬШОЕ ВСЕМ за уделенное мне время, и за оказанную тем самым помощь =)