C 中的“结构继承技术”(如本问题所述)是由于以下事实而成为可能的:C 标准保证结构的第一个成员在它之前永远不会有任何填充(?),并且结构的地址第一个成员始终等于结构本身的地址。
这允许如下使用:
typedef struct {
// some fields
} A;
typedef struct {
A base;
// more fields
} B;
typedef struct {
B base;
// yet more fields
} C;
C* c = malloc(sizeof(C));
// ... init c or whatever ...
A* a = (A*) c;
// ... access stuff on a etc.
B* b = (B*) c;
// ... access stuff on b etc.
Run Code Online (Sandbox Code Playgroud)
这个问题有两个部分:
答:在我看来,这种技术打破了严格的别名规则。我错了吗?如果错了,为什么?
B. 假设这种技术确实合法。在这种情况下,如果A:我们首先将对象存储在其特定类型的左值中,然后将其向下或向上转换为不同的类型,或者B:如果我们将其直接转换为所需的特定类型,这会有所不同吗?此刻,而不首先将其存储在特定类型的左值中?
例如,这三个选项都同样合法吗?
选项1: …
我想尝试创建我自己的非常基本的语言,它是非常基本的编译器.全部使用Java.
目前,只需启用"程序员"即可将内容打印到屏幕上.
我知道如何做到这一点,我想知道的是:这会被认为是一个真正的"编译器",一个真正的"语言"和一个真正的"虚拟机"吗?(当然,所有非常非常基础).
我的想法是创建一个程序,它将作为'IDE'(编辑器和编译器),另一个将作为'虚拟机'.
这意味着IDE不会将编写的代码编译为某些现有的机器代码,例如Java Bytecode,但实际上会编译为由我编写的某种编译代码.
这个编译过的代码只能通过我的"虚拟机"程序来理解,并且只能在这个程序中运行."虚拟机"程序将使用高级Java操作来理解和执行已编译的代码.
"虚拟机"程序将是一个在JVM上运行的Java程序.
我的问题是:从概念上讲,这被视为虚拟机和"机器代码"吗?如果没有,这仍然被认为是一种"编程语言",即使它的编译字节码只能在特定程序内运行吗?
我已经实现了一个DocumentFilter子类,当我输入文本时JTextComponent,replace()调用过滤器的方法,而不是insertString()(从不调用).知道为什么会这样吗?
这是我的代码:
// in main.cpp
#include "iostream"
#include "circle.cpp"
#include "rectangle.cpp"
#include "shape.cpp"
using namespace std;
int main() {
Shape shapes[10];
for (int i = 0; i < 10; i++){
if (i % 2)
shapes[i] = Circle(5);
else
shapes[i] = Rectangle(10, 10);
cout << shapes[i].getArea();
}
return 0;
}
// in circle.cpp
#include "shape.cpp"
class Circle : public Shape {
private:
int radius;
static const double PI = 3.14159265358979323846;
public:
Circle (int radius) : radius(radius) {}
virtual int getArea() const { …Run Code Online (Sandbox Code Playgroud) 我是一名Java程序员,最近开始学习C++.我很困惑.
我理解在C++中,要实现多态行为,必须使用指针或引用.例如,考虑Shape具有已实现方法的类getArea().它有几个子类,每个子类都以不同方式覆盖getArea().比考虑以下功能:
void printArea(Shape* shape){
cout << shape->getArea();
}
Run Code Online (Sandbox Code Playgroud)
该函数getArea()根据Shape指针指向的具体内容调用正确的实现.
这也是一样的:
void printArea(Shape& shape){
cout << shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)
但是,以下方法不适用于多态:
void printArea(Shape shape){
cout << shape.getArea();
}
Run Code Online (Sandbox Code Playgroud)
无论Shape函数中传递的是哪种具体类型,getArea()都会调用相同的实现:默认值为Shape.
我想了解这背后的技术推理.为什么多态性适用于指针和引用,而不适用于普通变量?(我认为这不仅适用于功能参数,也适用于任何事情).
请解释一下这种行为的技术原因,帮助我理解.
以下是来自库__init__的Local类的方法werkzeug:
def __init__(self):
object.__setattr__(self, '__storage__', {})
object.__setattr__(self, '__ident_func__', get_ident)
Run Code Online (Sandbox Code Playgroud)
我不明白这个代码的两件事:
他们为什么写
object.__setattr__(self, '__storage__', {})
Run Code Online (Sandbox Code Playgroud)
而不是简单的
`setattr(self, '__storage__', {})`
Run Code Online (Sandbox Code Playgroud)__setattr__如果可以简单地写,他们为什么甚至使用它们
self.__storage__ = {}
Run Code Online (Sandbox Code Playgroud)我正在尝试使用该模块下载 Youtube 视频音频ytdl-core(https://github.com/fent/node-ytdl-core)。
我使用 Express 编写了一个 API,它可以让我通过 URL 下载音频:
app.get('/api/downloadYoutubeVideo', function (req, res) {
res.set('Content-Type', 'audio/mpeg');
var videoUrl = req.query.videoUrl;
var videoName;
ytdl.getInfo(videoUrl, function(err, info){
videoName = info.title.replace('|','').toString('ascii');
res.set('Content-Disposition', 'attachment; filename=' + videoName + '.mp3');
});
var videoWritableStream = fs.createWriteStream('C:\\test' + '\\' + videoName); // some path on my computer (exists!)
var videoReadableStream = ytdl(videoUrl, { filter: 'audioonly'});
var stream = videoReadableStream.pipe(videoWritableStream);
});
Run Code Online (Sandbox Code Playgroud)
问题是,当我调用此 API 时,我从服务器收到 504 错误。
我希望能够将此下载的音频保存在本地磁盘上。
如有帮助,将不胜感激。谢谢
我试图获取一个函数的源代码,向其中添加代码,然后将其放回原始函数中。
基本上是这样的:
new_code = change_code(original_code)
throwaway_module = ModuleType('m')
exec(new_code, throwaway_module.__dict__)
func.__code__ = getattr(throwaway_module, func.__name__).__code__
Run Code Online (Sandbox Code Playgroud)
当new_code不包含任何不在原始函数中的名称时,这非常有效。
但是,当new_code包含原始中不存在的变量名称时,func在最后一行我收到以下错误:
ValueError: func() requires a code object with 1 free vars, not 0
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
编辑:
似乎我在 CPython 源代码中找到了引发此异常的位置(文件 funcobject.c)。为清楚起见省略了一些行:
static int
func_set_code(PyFunctionObject *op, PyObject *value, void *Py_UNUSED(ignored))
{
Py_ssize_t nfree, nclosure;
// ... lines omitted
nfree = PyCode_GetNumFree((PyCodeObject *)value);
nclosure = (op->func_closure == NULL ? 0 :
PyTuple_GET_SIZE(op->func_closure));
if (nclosure != nfree) {
PyErr_Format(PyExc_ValueError,
"%U() requires a code object …Run Code Online (Sandbox Code Playgroud) 我正在学习 C 中的静态和动态库以及如何制作它们。
一直困扰我的一件事是:
假设一个文件mylibrary通过执行#include <mylibrary.h>.
这是否意味着 C 库与匹配的文本头文件一起分发?或者mylibrary.h以某种方式从二进制库文件中神奇地导出?
这是否因不同的方法而异,或者库是静态的还是动态的?
根据严格别名规则(以及一般情况),以下代码是否合法?
const int size = 1024;
uint8_t* buffer = allocateBuffer(size);
float* float_pointer = reinterpret_cast<float*>(buffer);
std::fill(float_pointer, float_pointer + size / sizeof(float), 1.5f);
Run Code Online (Sandbox Code Playgroud)
据我所知,一般来说 SAR 说我们不能通过不同类型的指针访问(读取或写入)数据 - 除非我们使用字符类型的指针。
但是,在上面的代码中,我们使用非字符类型(float*)的指针来读取或写入(可能)字符类型(uint8_t)的数据,我认为这是非法的。
我对么?