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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.68
bloodnix
0 / 0 / 0
Регистрация: 14.10.2009
Сообщений: 3
#1

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

14.10.2009, 23:56. Просмотров 2873. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возврат структуры из функции (C++):

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

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

Возврат массива из функции - C++
Есть задача: используя функции, вычислить количество элементов заранее введённых массивов, которые кратны Х, и переписать в отдельный...

Неверный возврат из функции - C++
Краткий экскурс. Есть универсальный класс Matrix<TYPE>, описание его выглядит вот так: /*Matrix.h*/ #ifndef _MATRIX_CLASS ...

Возврат объекта из функции - C++
Здравствуйте. Написал в Code.Blocks на C++ вот такой код (привожу только часть кода, остальное на мой взгляд излишне). class Soldier...

Возврат строки из функции - C++
//char perfomers; //char _perfomers; char GetPerfomers(){strcpy(_perfomers,perfomers);return *_perfomers;} Есть у меня такая...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Rififi
2359 / 1054 / 44
Регистрация: 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 / 4
Регистрация: 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
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 она выделяет новый блок памяти с новым адресом.
изменить размер уже выделенного блока НЕЛЬЗЯ.
0
Rififi
2359 / 1054 / 44
Регистрация: 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 / 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 одинаковые.
0
Rififi
2359 / 1054 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
25.12.2009, 22:42 #9
qwert,

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

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

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

в итоге всё равно получаем p
0
.::.DIMA.::.
143 / 143 / 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 одинаковые.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2009, 15:15
Привет! Вот еще темы с ответами:

Возврат значения из функции - C++
Добрый вечер. Вопрос следующий , как возвратить из функции create последнее значение ЛС , чтоб в дальнейшем использовать в main. ...

Возврат массива из функции - C++
Программа должна переводить числа с 10 системы в двоичную... но почемуто выводит некорректно... Вот код... #include &lt;iostream&gt; using...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.12.2009, 15:15
Ответ Создать тему
Опции темы

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