ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Как вернуть из функции структуру?
  #1  
Старый 31.01.2009, 14:35
herfleisch
Участник форума
Регистрация: 07.01.2009
Сообщений: 237
Провел на форуме:
745649

Репутация: 97
Отправить сообщение для herfleisch с помощью ICQ
По умолчанию Как вернуть из функции структуру?

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

  #2  
Старый 31.01.2009, 14:48
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

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

Примерно так:
Код:
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;
}

Последний раз редактировалось slesh; 31.01.2009 в 14:54..
 
Ответить с цитированием

  #3  
Старый 31.01.2009, 15:08
groundhog
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме:
2238549

Репутация: 1318


Отправить сообщение для groundhog с помощью ICQ
По умолчанию

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

  #4  
Старый 31.01.2009, 15:22
herfleisch
Участник форума
Регистрация: 07.01.2009
Сообщений: 237
Провел на форуме:
745649

Репутация: 97
Отправить сообщение для herfleisch с помощью ICQ
По умолчанию

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

  #5  
Старый 31.01.2009, 16:11
herfleisch
Участник форума
Регистрация: 07.01.2009
Сообщений: 237
Провел на форуме:
745649

Репутация: 97
Отправить сообщение для herfleisch с помощью ICQ
По умолчанию

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

  #6  
Старый 31.01.2009, 16:20
groundhog
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме:
2238549

Репутация: 1318


Отправить сообщение для groundhog с помощью ICQ
По умолчанию

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

  #7  
Старый 31.01.2009, 16:27
herfleisch
Участник форума
Регистрация: 07.01.2009
Сообщений: 237
Провел на форуме:
745649

Репутация: 97
Отправить сообщение для herfleisch с помощью ICQ
По умолчанию

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

  #8  
Старый 31.01.2009, 16:57
.Slip
Leaders of Antichat - Level 4
Регистрация: 16.01.2006
Сообщений: 1,966
Провел на форуме:
21768337

Репутация: 3486


По умолчанию

Так попроще думаю будет:
Код:
#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";
}
__________________
..

Последний раз редактировалось .Slip; 31.01.2009 в 17:17..
 
Ответить с цитированием

  #9  
Старый 01.02.2009, 19:29
xismyname
Познающий
Регистрация: 07.09.2008
Сообщений: 79
Провел на форуме:
272452

Репутация: 10
По умолчанию

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

Как уже отмечалось,все локальные переменные распологаються в 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 .
 
Ответить с цитированием

  #10  
Старый 03.02.2009, 17:48
awdrg
Участник форума
Регистрация: 30.01.2009
Сообщений: 196
Провел на форуме:
505362

Репутация: 66
Отправить сообщение для awdrg с помощью ICQ
По умолчанию

все просто:

Код:
// простой код, передает в функцию две структуры
// и возвращает одну, с суммами значений введенных.
// 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"
}
возвращение через функцию, все как полагается
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Среди людей мы иные, но даже среди иных мы остаёмся людьми MorpheuS Авторские статьи 34 16.06.2010 02:57
Как вернуть дед? MaTpOc Болталка 6 30.01.2009 20:50
Плакаль!!!! Бродил вчера по врачебным форумам, искал инфу про лопнувшие в глазах .... $G@mer Болталка 6 12.10.2006 17:12
Как вернуть аську на пм S_T ICQ 12 04.10.2006 15:19
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ