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

Опять указатели - C++

Восстановить пароль Регистрация
 
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 13:55     Опять указатели #1
Здравствуйте. Изучаю эти туториалы: http://www.rastertek.com/dx11tut03.html В конце есть упражнение: конфигурацию видеокарты вывести в текстовой документ. Есть файл: d3dclass.cpp, ну и d3dclass.h соответственно. Там (в d3dclass.cpp) есть метод:
C++
1
2
3
4
5
6
void D3DClass::GetVideoCardInfo(char* cardName, int& memory)
{
    strcpy_s(cardName, 128, m_videoCardDescription);
    memory = m_videoCardMemory;
    return;
}
В d3dclass.h есть (подскажите, как это называется)
C++
1
void GetVideoCardInfo(char*, int&);
В main.cpp хочу вызвать этот метод. Так же хочу изменить этот метод, чтобы он возвращал значение или создать другой метод аналогичный этому, но это не судь. Подскажите почему, когда я пишу вот так:
C++
1
2
3
4
D3DClass *myClass = new D3DClass();
    char *desc = new char[15000]();
    int mem = 0;
    myClass->GetVideoCardInfo(desc, &mem);
, то появляется ошибка
Код
initial value of reference to non-const must be an lvalue
Когда я открываю скобку этого метода, то появляется такой хинт
C++
1
char *,int &
Насколько я понимаю, он просит указатель и адрес переменно типа integer. Когда я убираю знак '&', то ошибок нет, но потом появляется окно с ошибкой. Я пытался понять из-за какого параметра появляется эта ошибка, изменял сам метод, убирая второй параметр, и передавал в main только указатель, все равно такая же ошибка. И размер буфера самого char тоже увеличивал. Еще раз пересмотрел туториал по указателям и все равно... http://www.youtube.com/watch?v=_ja8i...A6B83&index=39
Миниатюры
Опять указатели  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 13:55     Опять указатели
Посмотрите здесь:

опять строки C++
Опять конструкторы C++
C++ опять о шрифтах
Опять текстуры C++
Опять static C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
eXtream
24 / 24 / 0
Регистрация: 10.03.2010
Сообщений: 161
05.09.2013, 14:18     Опять указатели #2
Цитата Сообщение от Pro100Tom Посмотреть сообщение
myClass->GetVideoCardInfo(desc, &mem);
в данном случае вы пытаетесь передать указатель на mem нужно так:
C++
1
myClass->GetVideoCardInfo(desc, mem);
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 14:24  [ТС]     Опять указатели #3
Вот когда я делаю так как вы посоветовали, тогда я и получаю эту ошибку при запуске программы (скрин есть)
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
05.09.2013, 14:29     Опять указатели #4
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Вот когда я делаю так как вы посоветовали, тогда я и получаю эту ошибку при запуске программы (скрин есть)
А для чего нужна mem?

Добавлено через 2 минуты
Цитата Сообщение от Pro100Tom Посмотреть сообщение
В d3dclass.h есть (подскажите, как это называется)
C++
1
void GetVideoCardInfo(char*, int&);
Объявление или прототип функции
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 14:35  [ТС]     Опять указатели #5
desc - это информация о видеокарты (например NVIDIA GeForce 540M) а mem - это размер памяти этой видеокарты, в программе показывает 1994 почему-то. Хотя я думал, у меня гигабайт памяти в карте. Где я увидел эту инфу? Вот скрин.
Миниатюры
Опять указатели  
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
05.09.2013, 14:47     Опять указатели #6
Пробегись построчно по коду и найди строчку, после выполнения которой вылезает эксцепшн (и выложи сюда эту строчку )
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 14:55  [ТС]     Опять указатели #7
ошибка в файле tcscpy_s.inl вот код
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
/***
*tcscpy_s.inl - general implementation of _tcscpy_s
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       This file contains the general algorithm for strcpy_s and its variants.
*
****/
 
_FUNC_PROLOGUE
errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC)
{
    _CHAR *p;
    size_t available;
 
    /* validation section */
    _VALIDATE_STRING(_DEST, _SIZE);
    _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);
 
    p = _DEST;
    available = _SIZE;
    while ((*p++ = *_SRC++) != 0 && --available > 0)
    {
    }
 
    if (available == 0)
    {
        _RESET_STRING(_DEST, _SIZE);
        _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
    }
    _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);
    _RETURN_NO_ERROR;
}
экцепшн вылезает в if :
C++
1
_RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);
Добавлено через 4 минуты
Если попытаться обойти эту проблему. То, как бы вы посоветовали вывести в файл конфигурацию? Я бы создал метод в d3dclass.cpp и использовал этот метод в main. Как думаете, правильно ли с точки зрения программирвоания? спасибо
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
05.09.2013, 14:58     Опять указатели #8
Цитата Сообщение от Pro100Tom Посмотреть сообщение
strcpy_s(cardName, 128, m_videoCardDescription);
сдается мне гдето здесь ошибка, может дескрипшн меньше 128 символов или cardName маленький
в ошибке написано что буффер как раз маленький(cardName в данном случае видимо)
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 15:02  [ТС]     Опять указатели #9
А как исправить-то это?
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
05.09.2013, 15:05     Опять указатели #10
а m_videoCardDescription откуда пришло
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 15:08  [ТС]     Опять указатели #11
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
////////////////////////////////////////////////////////////////////////////////
// Filename: d3dclass.h
////////////////////////////////////////////////////////////////////////////////
#ifndef _D3DCLASS_H_
#define _D3DCLASS_H_
 
 
/////////////
// LINKING //
/////////////
#pragma comment(lib, "dxgi.lib")
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib")
#pragma comment(lib, "d3dx10.lib")
 
 
//////////////
// INCLUDES //
//////////////
#include <dxgi.h>
#include <d3dcommon.h>
#include <d3d11.h>
#include <d3dx10math.h>
 
 
////////////////////////////////////////////////////////////////////////////////
// Class name: D3DClass
////////////////////////////////////////////////////////////////////////////////
class D3DClass
{
public:
    D3DClass();
    D3DClass(const D3DClass&);
    ~D3DClass();
 
    bool Initialize(int, int, bool, HWND, bool, float, float);
    void Shutdown();
    
    void BeginScene(float, float, float, float);
    void EndScene();
 
    ID3D11Device* GetDevice();
    ID3D11DeviceContext* GetDeviceContext();
 
    void GetProjectionMatrix(D3DXMATRIX&);
    void GetWorldMatrix(D3DXMATRIX&);
    void GetOrthoMatrix(D3DXMATRIX&);
 
    void GetVideoCardInfo(char*, int&);
 
private:
    bool m_vsync_enabled;
    int m_videoCardMemory;
    char m_videoCardDescription[128];
    IDXGISwapChain* m_swapChain;
    ID3D11Device* m_device;
    ID3D11DeviceContext* m_deviceContext;
    ID3D11RenderTargetView* m_renderTargetView;
    ID3D11Texture2D* m_depthStencilBuffer;
    ID3D11DepthStencilState* m_depthStencilState;
    ID3D11DepthStencilView* m_depthStencilView;
    ID3D11RasterizerState* m_rasterState;
    D3DXMATRIX m_projectionMatrix;
    D3DXMATRIX m_worldMatrix;
    D3DXMATRIX m_orthoMatrix;
};
 
#endif
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
05.09.2013, 15:10     Опять указатели #12
Как я и ожидал, эксцепшн вылезет в strcpy. Но судя по мелкомягкому алгоритму, вызов исключения мог быть вызван только недостаточным размером конечного буффера, что очень странно (15000 должно с головой хватать). Даже и не знаю что посоветовать, проверь хотя бы, выделяется ли под desc память
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 15:11  [ТС]     Опять указатели #13
изменил я 128 на 512, ошибка исчезла. Теперь другая проблема!
Я предполагаю, что чувак, который выложил этот туториал сделал баговый метод.
Миниатюры
Опять указатели  
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
05.09.2013, 15:12     Опять указатели #14
Цитата Сообщение от Raali Посмотреть сообщение
а m_videoCardDescription откуда пришло
Это скорее всего внутренняя переменная в классе D3DClass
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
05.09.2013, 15:15     Опять указатели #15
возможно где то должно быть взятие этих параметров видеокарты, прежде чем просто брать переменную m_videoCardDescription
Nikitko_Cent
128 / 98 / 8
Регистрация: 27.10.2011
Сообщений: 629
Завершенные тесты: 2
05.09.2013, 15:16     Опять указатели #16
Цитата Сообщение от Pro100Tom Посмотреть сообщение
изменил я 128 на 512, ошибка исчезла. Теперь другая проблема!
Я предполагаю, что чувак, который выложил этот туториал сделал баговый метод.
Ты уверен, что используемый тобою класс (D3DClass) работоспособен? Сдается мне, он криво написан...

Ой, ты же уже написал что неуверен

Добавлено через 1 минуту
Цитата Сообщение от Raali Посмотреть сообщение
возможно где то должно быть взятие этих параметров видеокарты, прежде чем просто брать переменную m_videoCardDescription
Нужны исходники класса
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 15:49  [ТС]     Опять указатели #17
В общем я разобрался. В классе D3DClass.cpp происходит инициализация дайрект икса. Там и создаются переменные всяких непонятных типов, которые потом достают данные видеокарты. У меня теперь такой вопрос: как лучше вывести параметры видеокарты в файл. 1 вариант: в самой инициализации тупо написать код, чтобы записались данные в файл. 2 вариант: Создать метод в D3DClass.cpp, который будет повторно доставать откуда-то данные о моей карте и возвращать значение в Main, откуда я этот метод и вызову. А потом уже записать в файл. Как посоветуете?

Добавлено через 3 минуты
Честно скажу, от одной инициализации дайрект икса, меня уже мутит. Очень бы хотел опенгл изучить, да только не вижу хороших новых туториалов. Пишут, что нехе устарел, а альтернативу так и не нашел. В растертеке об опенгл совсем немного к сожалению.
Raali
05.09.2013, 16:06
  #18

Не по теме:

новый Opengl 3.3 +
http://www.opengl-tutorial.org/
на английском правда

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 16:09     Опять указатели
Еще ссылки по теме:

опять же строки C++
Опять файлы C++
Не работает strcmp + указатели непойми что опять выводят C++

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

Или воспользуйтесь поиском по форуму:
Pro100Tom
 Аватар для Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 325
05.09.2013, 16:09  [ТС]     Опять указатели #19
Спасибо). Ничего, у меня с английским нет проблем).
Yandex
Объявления
05.09.2013, 16:09     Опять указатели
Ответ Создать тему
Опции темы

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