С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
#1

error C2719 - C++

30.08.2013, 08:37. Просмотров 1113. Ответов 15
Метки нет (Все метки)

При попытке передать в функцию тип XMMATRIX появляется следующая ошибка:
"Ошибка 29 error C2719: WorldMatrix: формальный параметр с __declspec(align("16")) не будет выровнен"
C++
1
void SetMatrix(XMMATRIX WorldMatrix, float kx, float ky, XMFLOAT3 pCam, XMFLOAT3 pDrop, int SwitchConstBuffer);
Уважаемые, подскажите пожалуйста что значит эта ошибка и как от неё избавиться, работаю в VS 2012?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.08.2013, 08:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос error C2719 (C++):

Исправить ошибку в WxDev-C++: Error with debugging process: GDB Error: error, No source file named main.cpp - C++
Здравствуйте товарищи! Новенький я в си, установил wxDev-C++, скомпилировал, запускаешь - работает, а чтоб пошагово отладка - не...

Error LNK1120, error LNK2019, error LNK2028, queue - C++
// свойство класса Parser queue<elem*>* postfix = new queue<elem*>; // строка, из-за которой происходит ошибка ...

Ошибка в тестовом примере: "Error 1 error C2143: syntax error : missing ';' before 'if'" - C++
#include<iostream> using namespace std; int main(){ int x, a = 0, b = 10; (cin >> x).get(); while (x){ int c = x % 10; ...

Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' - C++
выдает вот такую ошибку - Error 1 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'const char *' to 'LPCWSTR' использую visual...

Причина ошибки [ilink32 Error] Error: Unable to perform link - C++
Когда сохранил программу и пытаюсь открыть ее снова то мне выкидывает ошибку Warning: Error detected (LME288) Error: Unable to...

Ошибка error C2146: syntax error : missing ';' before identifier 'alph' - C++
Не получается откомпилировать прогу из консоля в MFC, выбивает ошибку error C2146: syntax error : missing ';' before identifier 'alph' ...

15
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
30.08.2013, 10:31 #2
Только сменой аллокатора, больше никак.

Добавлено через 1 минуту
Но лучше реализовать aligned_starage, который хранит внутри выровненные данные.
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
30.08.2013, 10:35  [ТС] #3
а что за аллокатор, и зачем его используют ? а то первый раз про него слышу, и из всего что вы сказали я ничего не понял..
0
GetVariable
163 / 119 / 5
Регистрация: 17.03.2013
Сообщений: 283
30.08.2013, 10:42 #4
aligned_storage
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
30.08.2013, 17:47  [ТС] #5
а как понять выровненые данные ?
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
30.08.2013, 18:12 #6
Цитата Сообщение от NEvOl Посмотреть сообщение
При попытке передать в функцию тип XMMATRIX
А как ты передаешь параметры функции и какие параметры?
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
30.08.2013, 20:20  [ТС] #7
Примерно так:
C++
1
2
XMMATRIX BaseWorldMatrix = SetWorldMatrix();
SetMatrix(BaseWorldMatrix, ....);
Функция SetWorldMatrix() возвращает тип XMMATRIX, а ругается на SetMatrix()
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
30.08.2013, 20:44 #8
Суть в том, что функция не может принять выравненные данные.. А вообще трудно что-то понять по таким кусочкам кода.
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
31.08.2013, 09:52  [ТС] #9
Вот более подробный код:
C++
1
2
XMMATRIX BaseWorldMatrix = SetWorldMatrix(XMFLOAT3(0, 0, 0), XMFLOAT3(0, 0, 1), XMFLOAT3(1, 0, 0), XMFLOAT3(0, 1, 0)); 
SetMatrix(BaseWorldMatrix, 4, 1, g_pCam);
Вот код функций:
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
void SetMatrix(XMMATRIX WorldMatrix, float kx, float ky, XMFLOAT3 pCam)
{
    g_World = WorldMatrix;
 
 
    g_ViewPos._11 = 1;  g_ViewPos._12 = 0;  g_ViewPos._13 = 0;  g_ViewPos._14 = 0;  
    g_ViewPos._21 = 0;  g_ViewPos._22 = 1;  g_ViewPos._23 = 0;  g_ViewPos._24 = 0;
    g_ViewPos._31 = 0;  g_ViewPos._32 = 0;  g_ViewPos._33 = 1;  g_ViewPos._34 = 0;
    g_ViewPos._41 = -g_pCam.x;  g_ViewPos._42 = -g_pCam.y;  g_ViewPos._43 = -g_pCam.z;  g_ViewPos._44 = 1;
 
    g_ViewRot._11 = g_rCam.x;   g_ViewRot._12 = g_uCam.x;   g_ViewRot._13 = g_tCam.x;   g_ViewRot._14 = 0;  
    g_ViewRot._21 = g_rCam.y;   g_ViewRot._22 = g_uCam.y;   g_ViewRot._23 = g_tCam.y;   g_ViewRot._24 = 0;
    g_ViewRot._31 = g_rCam.z;   g_ViewRot._32 = g_uCam.z;   g_ViewRot._33 = g_tCam.z;   g_ViewRot._34 = 0;
    g_ViewRot._41 = 0;          g_ViewRot._42 = 0;          g_ViewRot._43 = 0;          g_ViewRot._44 = 1;
 
    g_View = g_ViewPos * g_ViewRot;
 
    ConstBuffer cb;
    
    cb.mWorld = XMMatrixTranspose(g_World); 
    cb.mView = XMMatrixTranspose(g_View);
    cb.mProj = XMMatrixTranspose(g_Proj);
    cb.pCam = pCam;
    cb.fKDxTexture = kx;
    cb.fKDyTexture = ky;
    cb.target = g_tCam;
    cb.pos = pCam;
 
    g_pDeviceContext->UpdateSubresource(g_pTerraConstBuffer,0, NULL, &cb, 0, 0);
 
}
 
XMMATRIX SetWorldMatrix(XMFLOAT3 pos, XMFLOAT3 target, XMFLOAT3 right, XMFLOAT3 up)
{
    XMMATRIX WorldRot;
 
    WorldRot._11 = right.x;     WorldRot._12 = right.y;     WorldRot._13 = right.z;     WorldRot._14 = 0;
    WorldRot._21 = up.x;        WorldRot._22 = up.y;        WorldRot._23 = up.z;        WorldRot._24 = 0;
    WorldRot._31 = target.x;    WorldRot._32 = target.y;    WorldRot._33 = target.z;    WorldRot._34 = 0;
    WorldRot._41 = 0;           WorldRot._42 = 0;           WorldRot._43 = 0;           WorldRot._44 = 1;
 
    XMMATRIX WorldPos;
 
    WorldPos._11 = 1;       WorldPos._12 = 0;       WorldPos._13 = 0;       WorldPos._14 = 0;
    WorldPos._21 = 0;       WorldPos._22 = 1;       WorldPos._23 = 0;       WorldPos._24 = 0;
    WorldPos._31 = 0;       WorldPos._32 = 0;       WorldPos._33 = 1;       WorldPos._34 = 0;
    WorldPos._41 = pos.x;       WorldPos._42 = pos.y;       WorldPos._43 = pos.z;       WorldPos._44 = 1;
 
    return WorldRot * WorldPos;
}
ругается на объявлении и определении функции, говорит вот что :"Ошибка 29 error C2719: WorldMatrix: формальный параметр с __declspec(align("16")) не будет выровнен"
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
31.08.2013, 09:57 #10
Это потому, что модификатор align __declspec не распространяется на параметры функций.
Попробуй передать матрицу через указатель: XMMATRIX *WorldMatrix с соответствующими изменениями в коде.
0
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
31.08.2013, 11:58  [ТС] #11
Можете обьяснить что это за модификатор и что значит выравнивание данных, пытался нагуглить но так до конца и не понял что это... буду очень признателен
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
31.08.2013, 12:10 #12
__declspec(align('16')) - этот модификатор (расширение Microsoft, в других компиляторах - другие модификаторы) говорит компилятору, что данные должны быть выравнены по границе 16 байт, т.е. адрес переменной будет кратным 16 (маска 0xfffffff0), это сделано потому, что операции с такими матрицами выполняются набором инструкций SSE, размер регистров которых равен 128 битам (16 байт). Не выровненные данные будут обрабатываться дольше, нежели выравненные.
Если интересно почитай про выравнивание данных.
2
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
31.08.2013, 19:32  [ТС] #13
После изменения ошибка пропала, но возникла другая проблема, в ходе работы программы данные в матрице меняются, вот как изменил, может что-то неправиль сделал:
C++
1
2
XMMATRIX *BaseWorldMatrix = SetWorldMatrix(XMFLOAT3(0, 0, 0), XMFLOAT3(0, 0, 1), XMFLOAT3(1, 0, 0), XMFLOAT3(0, 1, 0)); 
SetMatrix(BaseWorldMatrix, 4, 1, g_pCam);
а вот код функций:
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
XMMATRIX* SetWorldMatrix(XMFLOAT3 pos, XMFLOAT3 target, XMFLOAT3 right, XMFLOAT3 up)
{
    XMMATRIX WorldRot;
 
    WorldRot._11 = right.x;     WorldRot._12 = right.y;     WorldRot._13 = right.z;     WorldRot._14 = 0;
    WorldRot._21 = up.x;        WorldRot._22 = up.y;        WorldRot._23 = up.z;        WorldRot._24 = 0;
    WorldRot._31 = target.x;    WorldRot._32 = target.y;    WorldRot._33 = target.z;    WorldRot._34 = 0;
    WorldRot._41 = 0;           WorldRot._42 = 0;           WorldRot._43 = 0;           WorldRot._44 = 1;
 
 
    XMMATRIX WorldPos;
 
    WorldPos._11 = 1;       WorldPos._12 = 0;       WorldPos._13 = 0;       WorldPos._14 = 0;
    WorldPos._21 = 0;       WorldPos._22 = 1;       WorldPos._23 = 0;       WorldPos._24 = 0;
    WorldPos._31 = 0;       WorldPos._32 = 0;       WorldPos._33 = 1;       WorldPos._34 = 0;
    WorldPos._41 = pos.x;   WorldPos._42 = pos.y;   WorldPos._43 = pos.z;   WorldPos._44 = 1;
 
    return &WorldPos;
}
void SetMatrix(XMMATRIX *WorldMatrix, float kx, float ky, XMFLOAT3 pCam)
{
    g_World = *WorldMatrix;
 
 
    g_ViewPos._11 = 1;  g_ViewPos._12 = 0;  g_ViewPos._13 = 0;  g_ViewPos._14 = 0;  
    g_ViewPos._21 = 0;  g_ViewPos._22 = 1;  g_ViewPos._23 = 0;  g_ViewPos._24 = 0;
    g_ViewPos._31 = 0;  g_ViewPos._32 = 0;  g_ViewPos._33 = 1;  g_ViewPos._34 = 0;
    g_ViewPos._41 = -g_pCam.x;  g_ViewPos._42 = -g_pCam.y;  g_ViewPos._43 = -g_pCam.z;  g_ViewPos._44 = 1;
 
    g_ViewRot._11 = g_rCam.x;   g_ViewRot._12 = g_uCam.x;   g_ViewRot._13 = g_tCam.x;   g_ViewRot._14 = 0;  
    g_ViewRot._21 = g_rCam.y;   g_ViewRot._22 = g_uCam.y;   g_ViewRot._23 = g_tCam.y;   g_ViewRot._24 = 0;
    g_ViewRot._31 = g_rCam.z;   g_ViewRot._32 = g_uCam.z;   g_ViewRot._33 = g_tCam.z;   g_ViewRot._34 = 0;
    g_ViewRot._41 = 0;          g_ViewRot._42 = 0;          g_ViewRot._43 = 0;          g_ViewRot._44 = 1;
 
    g_View = g_ViewPos * g_ViewRot;
 
    ConstBuffer cb;
        
    cb.mWorld = XMMatrixTranspose(g_World); 
    cb.mView = XMMatrixTranspose(g_View);
    cb.mProj = XMMatrixTranspose(g_Proj);
    cb.pCam = pCam;
    cb.fKDxTexture = kx;
    cb.fKDyTexture = ky;
    cb.target = g_tCam;
    cb.pos = g_pCam;
 
    g_pDeviceContext->UpdateSubresource(g_pTerraConstBuffer,0, NULL, &cb, 0, 0);
}
т.е. функция SetWorldMatrix возвращает правильную матрицу, но в функции SetMatrix у переменной WorldMatrix данные отсутствуют..
0
castaway
Эксперт С++
4916 / 3024 / 370
Регистрация: 10.11.2010
Сообщений: 11,081
Записей в блоге: 10
Завершенные тесты: 1
31.08.2013, 19:36 #14
Не правильно делаешь. Делай так:
C++
1
2
XMMATRIX BaseWorldMatrix = SetWorldMatrix(XMFLOAT3(0, 0, 0), XMFLOAT3(0, 0, 1), XMFLOAT3(1, 0, 0), XMFLOAT3(0, 1, 0)); 
SetMatrix( &BaseWorldMatrix, 4, 1, g_pCam);
И в функции SetMatrix просто разименовывай указатель. Если не получится - спрашивай.
1
NEvOl
19 / 18 / 0
Регистрация: 13.08.2012
Сообщений: 729
31.08.2013, 19:42  [ТС] #15
как вы написали сработало) скажите пожалуйста, в чем у меня была ошибка, а то я не очень в чем особо разница ?
0
31.08.2013, 19:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.08.2013, 19:42
Привет! Вот еще темы с ответами:

[ilink32 Error] Error: Unresolved external 'zamena (int * *) ' referenced - C++
Вот это программа не работает : вот ошибка которую выдает компилятор: Error: Unresolved external 'zamena(int * *)' referenced from...

Error 1 fatal error C1093: API call 'ImportFile' failed '0x80070003' : ErrorMessage: - C++
// Lab7_1.cpp : main project file. #include "stdafx.h" #include <iostream> using namespace std; float y; void...

Error C2760: синтаксическая ошибка / Fatal error C1004: непредвиденное обнаружение конца файла - C++
Набыдлокодил следующее: Graph.h template<class D> class Graph { private: class Edge { private: int v1, v2;

Проверить правильность кода. Вылезает Error 5 error C2679: binary '<<' : no operator found which takes a right - C++
Компилятор ругается на ошибку Error 5 error C2679: binary '&lt;&lt;' : no operator found which takes a right-hand operand of type 'Kniga' ...


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

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

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