Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
bloodnix
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 3
14.10.2009, 23:56     Возврат структуры из функции #1
Добрый день!
Я только начинаю, и сразу стал путаться с массивами и структурами с горем попалам понял как их передавать в функции. Понимаю, что адрес массива и адрес его первого элемента одно и тоже, тогда
что я делаю не так тут:

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, точнее это моя цель. Но выше приведенный код этого не делает

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

Возврат массива из функции C++
Возврат значения из функции C++
C++ Возврат массива из функции
Возврат итератора из функции C++
C++ Возврат массива из функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
14.10.2009, 23:59     Возврат структуры из функции #2
если изменить с минимальными усилиями, чтобы работало (хотя и с дальнейшим падением :gigi: ) - то

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

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

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

void createCube(CUSTOMVERTEX* t)

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

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

Цитата Сообщение от bloodnix Посмотреть сообщение
можем ли мы выделить память начиная с этого адреса до размера равного sizeof(tra)? как это сделать верно?
вопрос понял смутно.
придти может мало-ли чего.
точно могу сказать, что ОС Windows НЕ ПОЗВОЛЯЕТ выделять память по произвольному адресу.
по запросу alloc/malloc/realloc она выделяет новый блок памяти с новым адресом.
изменить размер уже выделенного блока НЕЛЬЗЯ.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 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
.::.DIMA.::.
142 / 142 / 4
Регистрация: 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 одинаковые.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
25.12.2009, 22:42     Возврат структуры из функции #9
qwert,

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

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

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

в итоге всё равно получаем p
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2009, 15:15     Возврат структуры из функции
Еще ссылки по теме:

Возврат 2 значений из функции с одним вызовом этой же функции C++
C++ Возврат массива из функции
C++ Возврат массива из функции

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

Или воспользуйтесь поиском по форуму:
.::.DIMA.::.
142 / 142 / 4
Регистрация: 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 одинаковые.
Yandex
Объявления
28.12.2009, 15:15     Возврат структуры из функции
Ответ Создать тему
Опции темы

Текущее время: 13:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru