вопрос легкий, но все же...
порблема с передачей массива структур в функцию ...
дело такое :
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 , проблема с возвращением значения из функции...
Вот собственно все...
>вопрос легкий, но все же...Конечно, вот здесь:
>struct s_us*gets_us(struct s_us*, int){
> ...
> return s_us;
>}- объявляется возврат указателя на структуру, а возвращается - структура (в стеке?) - как говорят в Одессе: "Обещать жениться и жениться - это 2 большие разные вещи...", ... да ещё и путаница имён типа с именами переменных - это возможно, но хорошо не заканчивается...
>вот ... кричит , что :
>warning: return from incompatible pointer type , проблема с возвращением значения из функции...Кричит "warning" - но возвращать будет полную херню...
Мне вообще кажется , что пример использованный для описания данной проблемы является не корректным . Например не понятно , что такоеreturn s_us;
Или внутри функции была обьявлена переменная с именем s_us ( не плохо бы было знать ее тип ) или товарищ сделал Copy/Paste не из того места и на самом деле определение выглядит так :
struct s_us*gets_us(struct s_us* s_us, int a){
...
return s_us;
}Тогда проблема не в этом месте .
Структура и указатель на структуру - разные вещи.
Вот, как я считаю, правильный код (извините за некоторые возможные ошибки, я не проверял его)#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);
}
По-моему проблема о которой задан вопрос содержится в строке :....
s_usarr = gets_us(s_usarr,5);
...Хотя имя массива и является указателем ( на первый элемент ) , но это не значит что его позволяется переопределять . Иначе было бы не понятно , что делать с распределенной на этапе компиляции памятью .
На мой взгляд надо было бы написать следующее :
struct s_us s_usarr[20] , *s_ptr;
....
s_ptr = gets_us(s_usarr,5);