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

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

Войти
Регистрация
Восстановить пароль
 
 
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
#1

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

05.09.2013, 13:55. Просмотров 625. Ответов 18
Метки нет (Все метки)

Здравствуйте. Изучаю эти туториалы: 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++):

Не работает strcmp + указатели непойми что опять выводят - C++
Странно все это в одном примере работает strcmp в другом (здесь) не работает. Не могу понять почему, пока разбирался решил проверить на...

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; void min_max(int*pa, int*pb,...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
05.09.2013, 14:24  [ТС] #3
Вот когда я делаю так как вы посоветовали, тогда я и получаю эту ошибку при запуске программы (скрин есть)
Nikitko_Cent
136 / 106 / 10
Регистрация: 27.10.2011
Сообщений: 661
Завершенные тесты: 2
05.09.2013, 14:29 #4
Цитата Сообщение от Pro100Tom Посмотреть сообщение
Вот когда я делаю так как вы посоветовали, тогда я и получаю эту ошибку при запуске программы (скрин есть)
А для чего нужна mem?

Добавлено через 2 минуты
Цитата Сообщение от Pro100Tom Посмотреть сообщение
В d3dclass.h есть (подскажите, как это называется)
C++
1
void GetVideoCardInfo(char*, int&);
Объявление или прототип функции
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
05.09.2013, 14:35  [ТС] #5
desc - это информация о видеокарты (например NVIDIA GeForce 540M) а mem - это размер памяти этой видеокарты, в программе показывает 1994 почему-то. Хотя я думал, у меня гигабайт памяти в карте. Где я увидел эту инфу? Вот скрин.
Миниатюры
Опять указатели  
Nikitko_Cent
136 / 106 / 10
Регистрация: 27.10.2011
Сообщений: 661
Завершенные тесты: 2
05.09.2013, 14:47 #6
Пробегись построчно по коду и найди строчку, после выполнения которой вылезает эксцепшн (и выложи сюда эту строчку )
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
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
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
05.09.2013, 14:58 #8
Цитата Сообщение от Pro100Tom Посмотреть сообщение
strcpy_s(cardName, 128, m_videoCardDescription);
сдается мне гдето здесь ошибка, может дескрипшн меньше 128 символов или cardName маленький
в ошибке написано что буффер как раз маленький(cardName в данном случае видимо)
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
05.09.2013, 15:02  [ТС] #9
А как исправить-то это?
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
05.09.2013, 15:05 #10
а m_videoCardDescription откуда пришло
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
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
136 / 106 / 10
Регистрация: 27.10.2011
Сообщений: 661
Завершенные тесты: 2
05.09.2013, 15:10 #12
Как я и ожидал, эксцепшн вылезет в strcpy. Но судя по мелкомягкому алгоритму, вызов исключения мог быть вызван только недостаточным размером конечного буффера, что очень странно (15000 должно с головой хватать). Даже и не знаю что посоветовать, проверь хотя бы, выделяется ли под desc память
Pro100Tom
69 / 28 / 7
Регистрация: 29.10.2012
Сообщений: 328
05.09.2013, 15:11  [ТС] #13
изменил я 128 на 512, ошибка исчезла. Теперь другая проблема!
Я предполагаю, что чувак, который выложил этот туториал сделал баговый метод.
Миниатюры
Опять указатели  
Nikitko_Cent
136 / 106 / 10
Регистрация: 27.10.2011
Сообщений: 661
Завершенные тесты: 2
05.09.2013, 15:12 #14
Цитата Сообщение от Raali Посмотреть сообщение
а m_videoCardDescription откуда пришло
Это скорее всего внутренняя переменная в классе D3DClass
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
05.09.2013, 15:15 #15
возможно где то должно быть взятие этих параметров видеокарты, прежде чем просто брать переменную m_videoCardDescription
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.09.2013, 15:15
Привет! Вот еще темы с ответами:

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;string&gt; using namespace std; //Сортировка &quot;пузырьком&quot;. ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...


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

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

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