URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1759
[ Назад ]

Исходное сообщение
"массив структур как параметр функции"

Отправлено grserg , 11-Июн-03 00:33 
вопрос легкий, но все же...
порблема с передачей массива структур в функцию ...
дело такое :
struct s_us {
     char *s_name;
     int s_num;
      ...
}
      ...
struct s_us*gets_us(struct s_us*, int){
      ...
      return s_us;
}

void main(){
    struct s_us s_usarr[20];
    ....
    s_usarr = gets_us(s_usarr,5);
    ...
}

вот ... кричит , что :
warning: return from incompatible pointer type ,  проблема с возвращением значения из функции...
Вот собственно все...


Содержание

Сообщения в этом обсуждении
"массив структур как параметр функции"
Отправлено Olej , 11-Июн-03 11:47 
>вопрос легкий, но все же...

Конечно, вот здесь:

>struct s_us*gets_us(struct s_us*, int){
>      ...
>      return s_us;
>}

- объявляется возврат указателя на структуру, а возвращается - структура (в стеке?) - как говорят в Одессе: "Обещать жениться и жениться - это 2 большие разные вещи...", ... да ещё и путаница имён типа с именами переменных - это возможно, но хорошо не заканчивается...

>вот ... кричит , что :
>warning: return from incompatible pointer type ,  проблема с возвращением значения из функции...

Кричит "warning" - но возвращать будет полную херню...



"массив структур как параметр функции"
Отправлено yegor , 15-Июн-03 20:25 
Мне вообще кажется , что пример использованный для описания данной проблемы является не корректным . Например не понятно , что такое

return s_us;

Или внутри функции была обьявлена переменная с именем s_us ( не плохо бы было знать ее тип ) или товарищ сделал Copy/Paste не из того места и на самом деле определение выглядит так :

struct s_us*gets_us(struct s_us* s_us, int a){
      ...
      return s_us;
}

Тогда проблема не в этом месте .


"массив структур как параметр функции"
Отправлено Vladislav Lazarenko , 11-Июн-03 13:00 
Структура и указатель на структуру - разные вещи.
Вот, как я считаю, правильный код (извините за некоторые возможные ошибки, я не проверял его)

#include <stdlib.h>
#include <string.h>

struct st {
    int    st_int;
    double    st_double;
};

struct st* init_st(struct st *mst)
{
    if (!mst && !(mst = (struct st *)malloc(sizeof(struct st))))
        return (NULL);

    (void)memset(mst, 0, sizeof(struct st));
}

int main(void)
{
    struct st test;
    struct st *pointer;

    pointer = init_st(&test);
}

либо так:

int main(void)
{
    struct st *test = init_st(NULL);
}


"массив структур как параметр функции"
Отправлено yegor , 15-Июн-03 19:58 
По-моему проблема о которой задан вопрос содержится в строке :

....
    s_usarr = gets_us(s_usarr,5);
...

Хотя имя массива и является указателем ( на первый элемент ) , но это не значит что его позволяется переопределять . Иначе было бы не понятно , что делать с распределенной на этапе компиляции памятью .

На мой взгляд надо было бы написать следующее :


    struct s_us s_usarr[20] , *s_ptr;
    ....
    s_ptr = gets_us(s_usarr,5);