Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/17: Рейтинг темы: голосов - 17, средняя оценка - 4.94
bloodnix
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 3
1

Возврат структуры из функции

14.10.2009, 23:56. Просмотров 2997. Ответов 9
Метки нет (Все метки)

Добрый день!
Я только начинаю, и сразу стал путаться с массивами и структурами с горем попалам понял как их передавать в функции. Понимаю, что адрес массива и адрес его первого элемента одно и тоже, тогда
что я делаю не так тут:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct CUSTOMVERTEX {FLOAT X, Y, Z; DWORD COLOR;};
........
        void draw(void)
        {
                          .....
                          CUSTOMVERTEX* t=NULL;
            createCube(t);
                          .....
                       }
 
        void createCube(CUSTOMVERTEX* t)
        {
                              ............
             CUSTOMVERTEX tra[]=
                    {
                        { -1.0f,  1.0f, -1.0f, D3DCOLOR_XRGB(155, 55, 55) },//0
                        {  1.0f,  1.0f, -1.0f, D3DCOLOR_XRGB(155, 55, 55) },//1
                        {  1.0f, -1.0f, -1.0f, D3DCOLOR_XRGB(155, 55, 55) },//2
                        { -1.0f, -1.0f, -1.0f,  D3DCOLOR_XRGB(155, 55,55) },//3
 
                        { -1.0f,  1.0f, 1.0f, D3DCOLOR_XRGB(155, 55, 55) },//4
                        {  1.0f,  1.0f, 1.0f, D3DCOLOR_XRGB(155, 55, 55) },//5
                        {  1.0f, -1.0f, 1.0f, D3DCOLOR_XRGB(155, 55, 55) },//6
                        { -1.0f, -1.0f, 1.0f,  D3DCOLOR_XRGB(155, 55, 55) }//7
 
                    };
                                   .....
             t=(CUSTOMVERTEX *)malloc(sizeof(tra));
                    memcpy(t,tra,sizeof(tra));
        }

собственно проблема:
я так понимаю в этом случае в функции Draw после вызова createCube в переменной t лежит адрес первого элемента tra, ну и все остальные элементы далее. То есть я фактически перенес массив структуры tra из функции createCude в переменную t функции Draw, точнее это моя цель. Но выше приведенный код этого не делает

Уважаемые профи, подскажите где я туплю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2009, 23:56
Ответы с готовыми решениями:

Возврат структуры из функции
Задание на структуру: создается банковский счет с возможностью изменения его...

Возврат копии структуры из другого класса
Как можно копию структуры из одного класса передать в другой? (именно чтоб она...

Возврат 2 значений из функции с одним вызовом этой же функции
Вообщем где то в какой то игре была хукнута одна функция int function(int...

Возврат матрицы из функции
В программе возникает ошибка. Вероятно из-за того,что матрицы не запоминаются в...

Возврат boost::any из функции
virtual bool write_value(const string_type& name_value, const boost::any&...

9
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
14.10.2009, 23:59 2
если изменить с минимальными усилиями, чтобы работало (хотя и с дальнейшим падением :gigi: ) - то

void createCube(CUSTOMVERTEX* t) => void createCube(CUSTOMVERTEX*& t)
2
bloodnix
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 3
15.10.2009, 00:14  [ТС] 3
как ни странно помогло, спасибо
и разрушения не происходит.
я было анчал расписывать что хочу и тут понял, чтобы переданную переменную можно было изменять во второй функции, нужно передавать не ее, аа линк на нее. соответственно тогда все преобразования во второй функции будут влиять на ее значение в первой.

В моем случае мы передаем линк на указатель, соотвественно в функции createCude мы правим адрес расположения первого элемента t. я не прав? просто хотелось бы раз и навсегда разобраться с массивами...
и еще почему должен был происхордить крах?
0
.::.DIMA.::.
143 / 143 / 32
Регистрация: 26.10.2008
Сообщений: 782
15.10.2009, 00:15 4
Цитата Сообщение от Rififi Посмотреть сообщение
*&
Кстати, что делает такое сочетание при передаче в функцию?
0
bloodnix
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 3
15.10.2009, 00:26  [ТС] 5
как я понял говорит что будет передавать линк на указатель. так?

Добавлено через 8 минут
я тут подумал еще... понятно что линк спасет мое положение, тогда возник следующий вопрос если таки мы будем принимать параметр так:

void createCube(CUSTOMVERTEX* t)

то в переменной t нам придет некий адрес? можем ли мы выделить память начиная с этого адреса до размера равного sizeof(tra)? как это сделать верно?

Добавлено через 2 минуты
сорри туплю, нам прийдет NULL, а не адрес.
0
Patch
2336 / 492 / 22
Регистрация: 01.04.2009
Сообщений: 2,181
15.10.2009, 07:53 6
Цитата Сообщение от qwert Посмотреть сообщение
Кстати, что делает такое сочетание при передаче в функцию?
нет такого сочетания.
просто там пробел стоит так, что трудно читать.
в данном случае было createCube(CUSTOMVERTEX* &t)
&t означает "взять указатель на t".

Цитата Сообщение от bloodnix Посмотреть сообщение
можем ли мы выделить память начиная с этого адреса до размера равного sizeof(tra)? как это сделать верно?
вопрос понял смутно.
придти может мало-ли чего.
точно могу сказать, что ОС Windows НЕ ПОЗВОЛЯЕТ выделять память по произвольному адресу.
по запросу alloc/malloc/realloc она выделяет новый блок памяти с новым адресом.
изменить размер уже выделенного блока НЕЛЬЗЯ.
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
22.12.2009, 23:58 7
Patch,

в данном случае было createCube(CUSTOMVERTEX* &t)
точно также могло быть и
Код
CUSTOMVERTEX *&t

и 

CUSTOMVERTEX * & t

и 

CUSTOMVERTEX *& t

и даже 

CUSTOMVERTEX                                                               *                                         &                                             t
пробелы не имеют никакого значения.

точно могу сказать, что ОС Windows НЕ ПОЗВОЛЯЕТ выделять память по произвольному адресу.
VirtualAllocEx
1
.::.DIMA.::.
143 / 143 / 32
Регистрация: 26.10.2008
Сообщений: 782
25.12.2009, 19:51 8
А в чём смысл такого сочетания:
C++
1
*&p
?

C++
1
2
3
4
5
6
7
8
9
10
    int b = 5;
    int * p = &b;
 
    cout << "&b = " << &b << endl;
    cout << "b = " << b << endl;
    cout << "*p = " << *p << endl;
    cout << "&p = " << &p << endl;
    cout << "p = " << p << endl;
    cout << "*&p = " << *&p << endl;
    cout << "&*p = " << &*p << endl;
Ведь значения &b, p, *&p и &*p одинаковые.
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
25.12.2009, 22:42 9
qwert,

Ведь значения &b, p, *&p и &*p одинаковые.

я думаю, для простых типов компилятор просто проводит оптимизацию, поскольку операции взятия адреса (&) и разыменования (*) - противоположные по смыслу, то результат выражения равен изначальному значению.

в первом случае - получили адрес указателя и через (*) вернулись к самому указателю
во втором - разыменовав указатель получили объект, потом взяли от него адрес.

в итоге всё равно получаем p
0
.::.DIMA.::.
143 / 143 / 32
Регистрация: 26.10.2008
Сообщений: 782
28.12.2009, 15:15 10
Результаты аналогичные:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
using namespace std;
 
class myClass
{
public:
    myClass (int v)
    {
        value = v;
    }
 
    int GetValue() const
    {
        return value;
    }
    void SetValue(int v)
    {
        value = v;
    }
 
private:
    int value;
 
    friend ostream &operator<< (ostream &output, const myClass & c)
    {
        output << c.GetValue();
 
        return output;
    }   
};
 
int main ()
{
    myClass b (5);
    myClass * p = &b;
 
    cout << "&b = " << &b << endl;
    cout << "b = " << b << endl;
    cout << "*p = " << *p << endl;
    cout << "&p = " << &p << endl;
    cout << "p = " << p << endl;
    cout << "*&p = " << *&p << endl;
    cout << "&*p = " << &*p << endl;
    return 0;
}
При работе и с простыми типами и с классами и структурами значения &b, p, *&p и &*p одинаковые.
0
28.12.2009, 15:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2009, 15:15

Возврат массива из функции
В объекте есть массив int state;, который мне нужно из него вытащить. Вижуал...

Возврат вектора из функции
Как вывести вектор из функции через адреса или указатели? Можно и внутри вектор...

Неверный возврат из функции
Краткий экскурс. Есть универсальный класс Matrix&lt;TYPE&gt;, описание его выглядит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru