小编Avi*_*ohn的帖子

“结构继承”如何不违反严格的别名规则?

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: …

c standards struct

6
推荐指数
1
解决办法
402
查看次数

使用Java创建我自己的(非常简单的)编译器

我想尝试创建我自己的非常基本的语言,它是非常基本的编译器.全部使用Java.

目前,只需启用"程序员"即可将内容打印到屏幕上.

我知道如何做到这一点,我想知道的是:这会被认为是一个真正的"编译器",一个真正的"语言"和一个真正的"虚拟机"吗?(当然,所有非常非常基础).

我的想法是创建一个程序,它将作为'IDE'(编辑器和编译器),另一个将作为'虚拟机'.

这意味着IDE不会将编写的代码编译为某些现有的机器代码,例如Java Bytecode,但实际上会编译为由我编写的某种编译代码.

这个编译过的代码只能通过我的"虚拟机"程序来理解,并且只能在这个程序中运行."虚拟机"程序将使用高级Java操作来理解和执行已编译的代码.

"虚拟机"程序将是一个在JVM上运行的Java程序.

我的问题是:从概念上讲,这被视为虚拟机和"机器代码"吗?如果没有,这仍然被认为是一种"编程语言",即使它的编译字节码只能在特定程序内运行吗?

java compiler-construction machine-code

5
推荐指数
1
解决办法
1万
查看次数

DocumentFilter:为什么调用replace()而不调用insertString()?

我已经实现了一个DocumentFilter子类,当我输入文本时JTextComponent,replace()调用过滤器的方法,而不是insertString()(从不调用).知道为什么会这样吗?

java swing jtextcomponent documentfilter

5
推荐指数
1
解决办法
481
查看次数

错误:重新定义类

这是我的代码:

// 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)

c++ compiler-errors

5
推荐指数
2
解决办法
3万
查看次数

为什么我不能用普通变量做多态?

我是一名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.

我想了解这背后的技术推理.为什么多态性适用于指针和引用,而不适用于普通变量?(我认为这不仅适用于功能参数,也适用于任何事情).

请解释一下这种行为的技术原因,帮助我理解.

c++ variables polymorphism pointers reference

5
推荐指数
1
解决办法
173
查看次数

`object .__ setattr __(self,...,...)`而不是`setattr(self,...,...)`?

以下是来自库__init__Local类的方法werkzeug:

def __init__(self):
    object.__setattr__(self, '__storage__', {})
    object.__setattr__(self, '__ident_func__', get_ident)
Run Code Online (Sandbox Code Playgroud)

我不明白这个代码的两件事:

  1. 他们为什么写

    object.__setattr__(self, '__storage__', {})
    
    Run Code Online (Sandbox Code Playgroud)

    而不是简单的

    `setattr(self, '__storage__', {})`
    
    Run Code Online (Sandbox Code Playgroud)
  2. __setattr__如果可以简单地写,他们为什么甚至使用它们

    self.__storage__ = {}
    
    Run Code Online (Sandbox Code Playgroud)

python methods class

5
推荐指数
1
解决办法
228
查看次数

使用 Express API 和 ytdl 下载音频文件

我正在尝试使用该模块下载 Youtube 视频音频ytdl-corehttps://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 错误。

我希望能够将此下载的音频保存在本地磁盘上。

如有帮助,将不胜感激。谢谢

api node.js http-status-code-504 express

5
推荐指数
1
解决办法
6854
查看次数

正确替换函数的代码对象

我试图获取一个函数的源代码,向其中添加代码,然后将其放回原始函数中。

基本上是这样的:

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)

python cpython metaprogramming

5
推荐指数
1
解决办法
563
查看次数

C 库是否与文本头文件和二进制文件一起分发?

我正在学习 C 中的静态和动态库以及如何制作它们。

一直困扰我的一件事是:

假设一个文件mylibrary通过执行#include <mylibrary.h>.

这是否意味着 C 库与匹配的文本头文件一起分发?或者mylibrary.h以某种方式从二进制库文件中神奇地导出?

这是否因不同的方法而异,或者库是静态的还是动态的?

c include libraries

5
推荐指数
1
解决办法
111
查看次数

带有 uint8_t 的 reinterpret_cast 是否违反了严格别名规则?

根据严格别名规则(以及一般情况),以下代码是否合法?

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)的数据,我认为这是非法的。

我对么?

c++ strict-aliasing c++14

5
推荐指数
1
解决办法
93
查看次数