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

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

14.10.2009, 23:56. Показов 3760. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2009, 23:56
Ответы с готовыми решениями:

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

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

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

Возврат строки из функции
//char perfomers; //char _perfomers; char GetPerfomers(){strcpy(_perfomers,perfomers);return...

9
MCSD: APP BUILDER
8791 / 1070 / 104
Регистрация: 17.06.2006
Сообщений: 12,603
14.10.2009, 23:59 2
если изменить с минимальными усилиями, чтобы работало (хотя и с дальнейшим падением :gigi: ) - то

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

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

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

void createCube(CUSTOMVERTEX* t)

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

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

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

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

и 

CUSTOMVERTEX * & t

и 

CUSTOMVERTEX *& t

и даже 

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

точно могу сказать, что ОС Windows НЕ ПОЗВОЛЯЕТ выделять память по произвольному адресу.
VirtualAllocEx
1
144 / 144 / 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
MCSD: APP BUILDER
8791 / 1070 / 104
Регистрация: 17.06.2006
Сообщений: 12,603
25.12.2009, 22:42 9
qwert,

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

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

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

в итоге всё равно получаем p
0
144 / 144 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2009, 15:15

Возврат массива из функции
Здравствуйте, Не пойму почему не работает данный код. Пишет cannot convert 'std::string*' to...

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

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

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


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

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

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