Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Как вернуть из функции структуру? (https://forum.antichat.xyz/showthread.php?t=103960)

herfleisch 31.01.2009 14:35

Как вернуть из функции структуру?
 
Собственно, вопрос по C/C++ - как вернуть из функции структуру? Пробовал в функции создать структуру, вернуть на неё указатель. В Debug-режиме работает. В реальности - нет. Какие есть идеи?

slesh 31.01.2009 14:48

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

Примерно так:
Код:

typedef struct _PARAMS {
 ULONG p1;
 ULONG p2;
 ULONG p3;
} PARAMS,* PPARAMS;


VOID proc1(PPARAMS p)
{
// работаешь как с указателем
p->p1=1;
p->p2=2;
p->p3=3;
}

VOID main(VOID)
{
 PARAMS param;

 proc1(&param);
 z=param.p1+param.p2+param.p3;
}


groundhog 31.01.2009 15:08

Всё верно, на вход в функцию передавай указатель на инициализированную структуру, внутри функции меняй её и в случае успеха возвращай флаг успеха...

herfleisch 31.01.2009 15:22

Да... вы правы... Спасибо всем за ответы.

herfleisch 31.01.2009 16:11

А если речь идёт о структуре, полями которой являются массивы типа char ???

groundhog 31.01.2009 16:20

herfleisch, ну а какая разница? ты же передаёшь уже инициализированную структуру... То есть даже поля сhar* будут инициализированы...

herfleisch 31.01.2009 16:27

Да... спасибо =) Было лень подумать =)

.Slip 31.01.2009 16:57

Так попроще думаю будет:
Код:

#include <iostream>
using namespace std;

struct TEST
{
        char* Var;
        char* Var2;
} Obj;

void pstruct(TEST &);

int main()
{
        pstruct(Obj);

        cout << Obj.Var << endl
                << Obj.Var2 << endl;
        return 0;
}

void pstruct(TEST &rObj)
{
        rObj.Var = "teeeest";
        rObj.Var2 = "mdaaaa";
}


xismyname 01.02.2009 19:29

Надо же,столько ответов,и ни один не ответил на вопрос "Как вернуть структуру из функции ?"

Как уже отмечалось,все локальные переменные распологаються в stack-e,после выполнении данной функции они удаляються/перезаписываються - поэтому придеться создать указатель на функцию и динамически занять место в памяти.

Пример :
Код:

#include <stdio.h>

/* Наша структура */
struct{
    unsigned char name[16];
    unsigned int  age;
}MyStruct;



/* функция которая возвращает указатель на структуру MyStruct */
struct MyStruct *MyFunc(void)
{

  /* Создаем указатель и аллокируем место в памяти */
  struct MyStruct *r_struct = (struct MyStruct*)malloc(sizeof(struct MyStruct));
 
  /* Если аллокация памяти прошла успешно - заполняем структуру и
      возвращаем указатель на данную структуру,в другом случаи
      возвращаем NULL.
  */
  if( r_struct != NULL )
  {
      r_struct->name[] = "MyName";
      r_struct->age    = 17;
      return r_struct;
  }
  else
  {
      return NULL;
  }
}
 


int main(void)
{

    /* Тут мы уже создаем только указатель на структуру,аллокировать
      память нам не приходиться так,как, она уже аллокирована
      функцией MyFunc() и будет доступно нам до конца программы,
      пока не освободим ее с помощью функции free()
    */
   
  struct MyStruct *r_getStruct = MyFunc();
   
    if( r_getStruct != NULL )
    {
        printf("Name : %s\n", r_getStruct->name);
        printf("Age  : %d\n", r_getStruct->age);
        free((void*)r_getStruct);
        return 0;
    }
    else
    {
        return -1;
    }
}

Чтобы все время не писать перед идентификатором структуры struct лучше создать как новый тип т.е. с помощью typedef .

awdrg 03.02.2009 17:48

все просто:

Код:

// простой код, передает в функцию две структуры
// и возвращает одну, с суммами значений введенных.
// By awdrg
#include <iostream>
using namespace std;

struct test
{
  int value_1;  //первое значение
  int value_2;  //второе значение
};

test func(test, test);  // в скобках ставь свои входные данные.
                        // обрати внимание, в начале прототипа стоит
                        // имя структуры, которая будет возвращаться
main()
{
  test one={10,20};  //инициализация
  test two ={30,40};  //инициализация
  test summ = func(one, two);  //инициализация с вызовом функции, возвращаемое
                                //значение имеет тип "test"
  cout << "value one = " << summ.value_1 << " value two = " << summ.value_2 << "\n";
  return 0;
}

test func(test first, test second) //принятие двух выбраных тобой элементов
                                  //в данном случае test и test
{
  test sum;
  sum.value_1 = first.value_1 + second.value_1;
  sum.value_2 = first.value_2 + second.value_2;
  return sum;  //sum являеться структурой "test"
}

возвращение через функцию, все как полагается


Время: 16:27