Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Доступ к полям структуры, возвращаемой функцией, В теле функции и вне тела 
:(
    Опции темы
ДокторТуамОсес
Дата 6.9.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 8.6.2009

Репутация: -5
Всего: -12



Как прочитать/изменить поля структуры, которую возвращает функция?
Причём как в теле функции, так и за её пределами.

Например:

Код

struct Tstruct { int i,j ; } ;

Tstruct f()
{

// Как присвоить значения отдельным полям (i,j) возвращаемой функцией f структуры Tstruct?

} ;

Tstruct A ;
int Gi ;
//////////////////////////
int main ()
{
   A  = f() 
   Gi = f.i // Так не работает. Тогда как можно прочитать только одно из полей 
             // возвращаемой структуры Tstruct?
}


--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
Acer
Дата 6.9.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 5.9.2007
Где: UA::DN

Репутация: нет
Всего: 8



Код

#include <iostream>

typedef struct STRUCT {
    int a;
    int b;
} MyStruct;

const MyStruct f(){
    MyStruct var;
    var.a = 10;
    var.b = 15;
    return var;
}

int main(void){
    MyStruct var;
    var = f();
    std::cout << "a=" << var.a << std::endl;
    std::cout << "b=" << var.b << std::endl;
}

PM MAIL   Вверх
586
Дата 6.9.2009, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 8
Всего: 146



Цитата(ДокторТуамОсес @  6.9.2009,  22:22 Найти цитируемый пост)
int Gi ;
//////////////////////////
int main ()
{
   A  = f() 
   Gi = f.i // Так не работает. Тогда как можно прочитать только одно из полей 
             // возвращаемой структуры Tstruct?
}

Код
Gi = f().i;

PM   Вверх
ДокторТуамОсес
Дата 6.9.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 8.6.2009

Репутация: -5
Всего: -12



А где выделяется память под теневую переменную, в которую пишется результат по команде return ?

Добавлено через 1 минуту и 54 секунды
Ясно, что не в том же стек-кадре, что и локальные переменные функции. Тогда где?
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
bsa
Дата 6.9.2009, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



в том же.
Код
#include <cstdio>
struct ST
{
        double x;
        double y;
        double z;
};

ST func()
{
        ST st = {0.1, 0.2, 0.3};
        return st;
}

int main()
{
        printf("%f\n", func().x);
        return 0;
}
ассемблер:
Код
...
.globl _Z4funcv
        .type   _Z4funcv, @function
_Z4funcv:
.LFB2:
        pushq   %rbp
.LCFI0:
        movq    %rsp, %rbp
.LCFI1:
        movabsq $4591870180066957722, %rax
        movq    %rax, (%rdi)
        movabsq $4596373779694328218, %rax
        movq    %rax, 8(%rdi)
        movabsq $4599075939470750515, %rax
        movq    %rax, 16(%rdi)
        movq    %rdi, %rax
        leave
        ret
.LFE2:
        .size   _Z4funcv, .-_Z4funcv
        .section        .rodata
.LC3:
        .string "%f\n"
        .text
.globl main
        .type   main, @function
main:
.LFB3:
        pushq   %rbp
.LCFI2:
        movq    %rsp, %rbp
.LCFI3:
        subq    $32, %rsp
.LCFI4:
        leaq    -32(%rbp), %rdi
        call    _Z4funcv
        movsd   -32(%rbp), %xmm0
        movl    $.LC3, %edi
        movl    $1, %eax
        call    printf
        movl    $0, %eax
        leave
        ret
...
Что делает этот код - резервирует место под структуру в кадре функции main и вызывает func(), которая пишет в него результат.

PM   Вверх
ДокторТуамОсес
Дата 7.9.2009, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 242
Регистрация: 8.6.2009

Репутация: -5
Всего: -12



Цитата(bsa @  6.9.2009,  22:54 Найти цитируемый пост)
резервирует место под структуру в кадре функции main

Вот именно. А если б 
Цитата(bsa @  6.9.2009,  22:54 Найти цитируемый пост)
в том же
, то место под структуру резервировалось бы в стек-кадре функции func()  smile  smile 
--------------------
"Извините! А это ничего, что я говорю в тот момент, когда Вы меня перебиваете?"™ 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1168 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.