这是对不同问题的跟进。
最初的问题还有其他问题,但我必须意识到主要问题(根据 CLang)是重新定义time为不同的符号,而只使用了很好的C++ 包含。
所以这是一个精简版:
#include<iostream>
using std::cout;
using std::endl;
class time
{
public:
int h, min, sec;
};
const int full = 60;
void canonify(time& pre) // Error here (line 14)
{
pre.min += pre.sec / full;
pre.h += pre.min / full;
pre.sec %= full;
pre.min %= full;
}
int main()
{
time a; // and here (line 23)
a.h = 3;
a.min = 128;
a.sec = 70;
canonify(a);
cout << …Run Code Online (Sandbox Code Playgroud) 这是我的另一个问题的 C++后续
在ISO C之前的旧时代,以下代码会让人感到惊讶:
struct Point {
double x;
double y;
double z;
};
double dist(struct Point *p1, struct Point *p2) {
double d2 = 0;
double *coord1 = &p1->x;
double *coord2 = &p2->x;
int i;
for (i=0; i<3; i++) {
double d = coord2[i] - coord1[i]; // THE problem
d2 += d * d;
}
return sqrt(d2);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个问题的行使用指针算法(p[i]被定义 *(p + i)).其明确地不是由标准允许的任何阵列的外面草案4659用于C++ 17说,在8.7 [expr.add]:
如果表达式P指向具有n个元素的数组对象x的元素x [i],则表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素x [i + j]如果0 <= …
我有一个LocalContainerEntityManagerFactoryBean为EntityManager实例.
要快速删除整个表的内容,我想运行以下代码:
@Service
public class DatabaseService {
@Autowired
private EntityManager em;
@Transactional
public void clear() {
em.createNativeQuery("TRUNCATE TABLE MyTable").executeUpdate();
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
ERROR org.springframework.integration.handler.LoggingHandler: javax.persistence.TransactionRequiredException: Executing an update/delete query
at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:71)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:708)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:644)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Run Code Online (Sandbox Code Playgroud)
如果我做了这个改变:
public …Run Code Online (Sandbox Code Playgroud) 我正在使用 PySide2 GUI 开发一个简单的 Python 应用程序。它目前在 Windows、Linux 和 Mac 上运行良好。在 Windows 上,我可以使用 PyInstaller 和 InnoSetup 来构建一个简单的安装程序。然后我尝试在 Mac 上做同样的事情。它很快就崩溃了,因为系统拒绝启动 PyInstaller 生成的命令或应用程序,因为它没有正确签名。因为我不是苹果开发者,所以我不能签署任何东西......
经过一番研究,我尝试了 py2app。我可以在这里更进一步。和
python setup.py py2app -A
Run Code Online (Sandbox Code Playgroud)
我可以创建一个可运行的应用程序。显然不能移植到不同的系统,因为它使用我的开发文件夹。如果我使用python setup.py py2app生成的程序无法启动,因为 py2app 没有复制所有必需的 Qt 东西。我试着将缺失的库一一添加,但最后系统找不到插件,我放弃了......
有人可以帮助我使用 Qt GUI 将 python 脚本或包转换为 Mac 上的便携式应用程序吗?理想情况下,配方应该说明如何使用自定义应用程序图标,但这不是必需的。
由于我的真实包对于 SO 问题来说太大了,因此我将其缩减为最小的可重现示例:
from PySide3.QtWidgets import *
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
hello = QLabel('Hello', self)
hello.move(50, 50)
def run(args):
app …Run Code Online (Sandbox Code Playgroud) 这是关于内存重用的另一个问题的后续内容.由于最初的问题是关于具体实施,答案与具体实施有关.
所以我想知道,在一致的实现中,为一个不同类型的数组重用基本类型数组的内存是否合法:
我结束了以下示例代码:
#include <iostream>
constexpr int Size = 10;
void *allocate_buffer() {
void * buffer = operator new(Size * sizeof(int), std::align_val_t{alignof(int)});
int *in = reinterpret_cast<int *>(buffer); // Defined behaviour because alignment is ok
for (int i=0; i<Size; i++) in[i] = i; // Defined behaviour because int is a fundamental type:
// lifetime starts when is receives a value
return buffer;
}
int main() {
void *buffer = allocate_buffer(); // Ok, defined behaviour
int *in = …Run Code Online (Sandbox Code Playgroud) 在这段代码中:
typedef int foo;
struct S
{
foo foo;
};
int main() {}
Run Code Online (Sandbox Code Playgroud)
所有版本的clang -std=c++14接受此代码,但所有版本的g++ -std=c++14报告:
5 : error: declaration of 'foo S::foo' [-fpermissive]
foo foo;
^
1 : error: changes meaning of 'foo' from 'typedef int foo' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
代码是否正确?
这是一个可以将char数组与任何数据类型一起使用的后续内容吗?
我知道动态内存和malloc的常见实现,可以在维基百科上找到引用.我也知道malloc返回的指针可以转换成程序员想要的任何东西,甚至没有警告,因为6.3.2.3指针中的标准状态§1
指向void的指针可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针.
现在的问题是假设我有没有一个独立的环境malloc和free,我怎么可以建立兼容标准的C的这两个功能的实现?
如果我对标准采取一些自由,很容易:
问题是该实现返回的指针的有效类型仍然是 char *
标准在同一段§7中说明
指向对象或不完整类型的指针可以转换为指向不同对象或不完整类型的指针.如果生成的指针未针对指向类型正确对齐,则行为未定义.否则,当再次转换回来时,结果将等于原始指针.
这似乎不允许我假装被声明为简单字符的内容可以神奇地包含另一种类型,甚至在该数组的不同部分或同一部分中的不同时刻也可以包含不同的类型.不同地解释引用这样的指针似乎是未定义的行为,并严格解释标准.这就是为什么memcpy当你在字符串缓冲区中获得对象的字节表示时,例如当你从网络流中读取它时,常用的习惯用法而不是别名.
那么如何在纯C中构建一个符合malloc的实现呢?
我有一个使用Spring Security保护的Spring MVC应用程序.大多数应用程序使用简单的http来节省资源,但是一小部分处理更多机密信息并需要https频道.
摘自security-config.xml:
<sec:http authentication-manager-ref="authenticationManager" ... >
...
<sec:intercept-url pattern="/sec/**" requires-channel="https"/>
<sec:intercept-url pattern="/**" requires-channel="http"/>
</sec:http>
Run Code Online (Sandbox Code Playgroud)
一切正常,直到我们决定将其迁移到主服务器,其中应用程序服务器在反向代理后面运行.现在,HTTPS由反向代理处理,应用程序服务器只能看到HTTP请求,并且不允许访问/sec/**层次结构.
经过一些研究,我发现代理添加了一个X-Forwarded-Proto: https头(*),但在Spring Security HttpServletRequest.isSecure()中用于确定所提供的通道安全性(从SecureChannelProcessorjavadoc中提取)
如何告诉Spring Security X-Forwarded-Proto: https标头足以满足安全请求?
我知道我可以在代理配置上报告该部分,但代理管理员确实不喜欢该解决方案,因为代理背后有许多应用程序,并且配置可能会增长到不可管理的状态.
我目前正在使用带有XML配置的Spring Security 3.2,但我已准备好接受基于Java配置和/或更新版本的答案.
(*)当然,代理如果它在传入请求中存在则删除标题,因此应用程序可以对它充满信心.
这主要是对另一个问题的跟进,即关于从长到双的奇怪转换,再回到长期的大值转换.
我已经知道将float转换为整数类型会截断,如果截断的值无法在目标类型中表示,则行为是未定义的:
4.9浮动积分转换[conv.fpint]
可以将浮点类型的prvalue转换为整数类型的prvalue.转换截断; 也就是说,丢弃小数部分.如果截断的值无法在目标类型中表示,则行为未定义.
但这是我的代码来演示这个问题,假设有一个小的endian架构,其中long long和long double都使用64位:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
unsigned long long ull = 0xf000000000000000;
long double d = static_cast<long double>(ull);
// dump the IEE-754 number for a little endian system
unsigned char * pt = reinterpret_cast<unsigned char *>(&d);
for (int i = sizeof(d) -1; i>= 0; i--) {
cout << hex << setw(2) << setfill('0') << static_cast<unsigned int>(pt[i]);
}
cout << endl;
unsigned long long ull2 …Run Code Online (Sandbox Code Playgroud) 用于C++ 17的n4659草案描述了第4章中语言的一般原理.在第4.5章,C++对象模型[intro.object]中,我无法理解一个句子的含义(强调我的)
3如果在与"N unsigned char数组"类型或"n std :: byte数组"(21.2.1)类型的另一个对象e关联的存储中创建了一个完整对象(8.3.4),该数组提供存储对于创建的对象if:
(3.1) - e的生命周期已经开始但未结束,
(3.2) - 新对象的存储完全适合e,并且
(3.3) - 没有更小的数组对象满足这些限制.
虽然示例显示数组可以为比数组短得多的元素提供存储:
struct A { unsigned char a[32]; };
struct B { unsigned char b[16]; };
A a;
B *b = new (a.a + 8) B; // a.a provides storage for *b
int *p = new (b->b + 4) int; // b->b provides storage for *p
Run Code Online (Sandbox Code Playgroud)
这里*p只使用sizeof(int)16字节数组中的4个字节(假设为4).那么,3.3的含义是什么?