我正在练习使用OpenGL,并且面临的任务是实现向不同对象(在我的情况下,是由顶点组成的网格)添加多个不同纹理的能力。我知道您可以使用GL_TEXTURE0 + i
,其中是从 0 到 31 的i
数字。但是这里有一个限制,我只能使用 32 个纹理(而我需要更多)。另外,我还实现了实例化,这也为编写程序增加了细微差别(因此,我无法在渲染之前使用每个单独的网格切换到必要的纹理)。请告诉我如何成功实现我所需要的?glActiveTexture
Mikhail Medvedev
Asked:
2025-02-05 04:12:54 +0800 CST
在创建一类二维矩阵时遇到了这个问题:
错误:
E0461 非常量参数引用的初始值必须是左值
C2440 返回:无法将“Matrix::MatrixRow”转换为“double &”
意思很清楚:Matrix 类中的运算符 [] 返回指向其中一行的指针,然后 MatrixRow 类中的运算符 [] 从数组中返回元素本身。实际上,下面这段代码是 Chat GPT 写给我的,因为这是我第一次遇到这样的语法,我只是想知道我到底做错了什么。我在 stack overflow western 上找到了一篇有此错误的文章,但我不知道如何将此解决方案应用于我的示例 https://stackoverflow.com/questions/55083497/c-cannot-convert-input-param-to-reference中的错误
class MatrixRow{
public:
MatrixRow(double* matrixRow) : matrixRow(matrixRow) {}
double& operator[](int index){
return matrixRow[index];
}
private:
double* matrixRow;
};
class Matrix{
MatrixRow& operator[](int index){
return MatrixRow(matrix_arr[index]);
}
private:
double** matrix_arr;
};
Morphezy
Asked:
2025-02-03 05:41:48 +0800 CST
我写了以下代码:
#include <string>
std::string fakeBin(std::string str){
for (int i = 0; i < str.length(); i++){
str[i] = ((str[i] - '0') > 4) ? '1' : '0';
}
return str;
}
它完成了它的工作,但我在写作时遇到了一个问题,这变得很有趣。如果? '1' : '0'
用双引号替换引号,代码将停止工作。这是什么原因?C++ 中的单引号和双引号有什么区别?
Фангенто
Asked:
2025-01-31 00:37:12 +0800 CST
char8_t h = u8'ы';
给出错误:“UTF-8 字符文字的值不能占用多个模块”
我使用带有 C++20 标准的 MSVC 的 Visual Studio。
CriticalError
Asked:
2025-01-30 02:38:01 +0800 CST
问题是这样的:有一个服务器和一个客户端,我们通过套接字发送数据。例如,如果我在一台计算机上运行服务器和客户端,那么一切都很好,但如果我在一台计算机上运行服务器,在同一个网络上的另一台计算机上运行客户端,那么我也会收到响应并发送数据,但我收到的数据是 0,尽管在服务器端的调试器中一切都很好
客户
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "Winsock2.h"
#include <iostream>
#include <windows.h>
#include <string>
#include <ctime>
#pragma comment(lib, "WS2_32.lib")
using namespace std;
struct GETSINCHRO
{
string cmd;
int curvalue;
};
struct SETSINCHRO
{
string cmd;
int correction;
};
int main()
{
setlocale(LC_CTYPE, "Russian");
string IP = "127.0.0.1";
int Tc = 1000;
int Cc = 0;
SYSTEMTIME tm;
SYSTEMTIME localtm;
GETSINCHRO getsincro;
SETSINCHRO setsincro;
ZeroMemory(&setsincro, sizeof(setsincro));
ZeroMemory(&getsincro, sizeof(getsincro));
getsincro.cmd = "SINC";
getsincro.curvalue = 0;
cout << "Клиент запущен" << endl;
try
{
SOCKET cS;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
throw SetErrorMsgText("Startup: ", WSAGetLastError());
if ((cS = socket(AF_INET, SOCK_DGRAM, NULL)) == INVALID_SOCKET)
throw SetErrorMsgText("Socket: ", WSAGetLastError());
SOCKADDR_IN serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(2000);
serv.sin_addr.s_addr = inet_addr(IP.c_str());
int avgcorr = 0;
int lensockaddr = sizeof(serv);
sendto(cS, (char*)&getsincro, sizeof(getsincro), 0, (sockaddr*)&serv, sizeof(serv));
recvfrom(cS, (char*)&setsincro, sizeof(setsincro), 0, (sockaddr*)&serv, &lensockaddr);
getsincro.curvalue += setsincro.correction;
int tick_number = 1;
while (tick_number < 11)
{
GetSystemTime(&tm);
TIME_ZONE_INFORMATION tzInfo;
GetTimeZoneInformation(&tzInfo);
SystemTimeToTzSpecificLocalTime(&tzInfo, &tm, &localtm);
sendto(cS, (char*)&getsincro, sizeof(getsincro), 0, (sockaddr*)&serv, sizeof(serv));
recvfrom(cS, (char*)&setsincro, sizeof(setsincro), 0, (sockaddr*)&serv, &lensockaddr);
Cc += Tc;
cout << " Date and time " << localtm.wMonth << "/" << localtm.wDay << "/" << localtm.wYear << " " << endl
<< localtm.wHour << " Hours " << localtm.wMinute << " Minutes " << localtm.wSecond << " Seconds " << localtm.wMilliseconds
<< " Milliseconds " << endl << tick_number++ << " " << getsincro.curvalue
<< " Correction = " << setsincro.correction << endl;
Sleep(Tc);
}
}
catch (string errorMsgText)
{
cout << endl << errorMsgText << endl;
}
system("pause");
return 0;
}
服务器
#include <iostream>
#include "Winsock2.h"
#include "ws2tcpip.h"
#include "string.h"
#include "locale"
#include "time.h"
#include "numeric"
#include <windows.h>
#include "ServerU.h"
#pragma comment(lib, "WS2_32.lib")
using namespace std;
struct SETSINCRO
{
string cmd;
int correction;
};
struct GETSINCRO
{
string cmd;
int curvalue;
};
int setAverageCorrection(int averageCorrection[], int length)
{
return std::accumulate(averageCorrection, averageCorrection + length, 0);
}
int main()
{
setlocale(LC_ALL, "Russian");
SETSINCRO setsincro;
GETSINCRO getsincro;
ZeroMemory(&setsincro, sizeof(setsincro));
ZeroMemory(&getsincro, sizeof(getsincro));
setsincro.cmd = "SINCRO";
setsincro.correction = 0;
SYSTEMTIME tm;
SYSTEMTIME localtm;
cout << "Сервер запущен" << endl;
try
{
SOCKET sS;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
throw SetErrorMsgText("Startup: ", WSAGetLastError());
if ((sS = socket(AF_INET, SOCK_DGRAM, NULL)) == INVALID_SOCKET)
throw SetErrorMsgText("Socket: ", WSAGetLastError());
SOCKADDR_IN serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(2000);
serv.sin_addr.s_addr = INADDR_ANY;
if (bind(sS, (LPSOCKADDR)&serv, sizeof(serv)) == SOCKET_ERROR)
throw SetErrorMsgText("Bind_Server: ", WSAGetLastError());
int count = 1;
while (true)
{
SOCKADDR_IN client;
int lc = sizeof(client);
int average = 0;
GetSystemTime(&tm);
TIME_ZONE_INFORMATION tzInfo;
GetTimeZoneInformation(&tzInfo);
SystemTimeToTzSpecificLocalTime(&tzInfo, &tm, &localtm);
recvfrom(sS, (char*)&getsincro, sizeof(getsincro), NULL, (sockaddr*)&client, &lc);
c = clock();
setsincro.correction = c - getsincro.curvalue;
averageCorrection[count - 1] = setsincro.correction;
average = setAverageCorrection(averageCorrection, count);
sendto(sS, (char*)&setsincro, sizeof(setsincro), 0, (sockaddr*)&client, sizeof(client));
char clientIp[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(client.sin_addr), clientIp, INET_ADDRSTRLEN);
cout << endl << count << "." << " Date and time " << localtm.wMonth << "/" << localtm.wDay << "/" << localtm.wYear//
<< " " << endl << localtm.wHour << " Hours " << localtm.wMinute << " Minutes " << localtm.wSecond//
<< " Seconds " << localtm.wMilliseconds << " Milliseconds " << endl << "Correction = " << setsincro.correction//
<< ", Average correction = " << average << endl;//
cout << "Client's address " << clientIp << endl;//
count++;
}
}
catch (string errorMsgText)
{
cout << endl << errorMsgText;
}
return 0;
}