小编cad*_*luk的帖子

Function和Function.prototype之间的区别

根据这个,函数依次继承FunctionFunctionFunction.prototype:

但是,全局Function对象没有自己的方法或属性,因为它本身就是一个函数,它通过原型链继承了一些方法和属性Function.prototype.

那么重点是Function.prototype什么?为什么不动它的属性Function,让Function.prototypeundefined?函数将来自Function.

同样适用于Object

javascript prototype prototype-chain

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

在Arduino错误时将4个字节转换为long

我有一个非常奇怪的不一致.
我准备读取Arduino上的二进制文件(对于midi播放器,如果你感兴趣的话).如果我尝试将Arduino上的4个字节组合成一个long,它会给我一个错误的结果.
但是,如果我在PC上使用等效代码,我会得到正确的值.

输入为:0x12481248(0x12,0x48,0x12,0x48)(实际上是一个随机数).

Arduino给出:4680.

Code :: Blocks给出:306713160.

4680与0x1248相同,是在Arduino上使用int而不是long时得到的结果(省略2个字节).

Arduino代码:

void setup(){
    Serial.begin(57600);
    char read1 = 0x12;
    char read2 = 0x48;
    char read3 = 0x12;
    char read4 = 0x48;
    unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
    unsigned long testint2 = 306713160;
    Serial.println(testint);
    Serial.println(testint2);
}

void loop(){}
Run Code Online (Sandbox Code Playgroud)

testint2表明它不是由Serial.println()引起的.串行监视器输出确实是:

4680

306713160

C++代码:

#include <iostream>

using namespace std;

int main(){
    char read1 = 0x12;
    char read2 = 0x48;
    char read3 = 0x12;
    char read4 = 0x48;
    unsigned long testint = read1<<24|read2<<16|read3<<8|read4;
    cout << testint;
} …
Run Code Online (Sandbox Code Playgroud)

c++ arduino type-conversion

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

在保护模式下设置中断(x86)

为保护模式设置中断的过程是什么?

这个链接说应该:

  • 为中断描述符表腾出空间
  • 告诉CPU该空间在哪里(参见GDT教程:lidt的工作方式与lgdt完全相同)
  • 告诉PIC您不再需要使用BIOS默认值(请参阅编程PIC芯片)
  • 为IRQ和异常编写几个ISR处理程序(请参阅中断服务程序)
  • 将ISR处理程序的地址放在适当的描述符中
  • 启用IRQ掩码中所有支持的中断(PIC)

第三步对我来说毫无意义(我查看了这个链接,但没有任何关于告诉PIC的事情)所以我忽略了它并完成了接下来的两个步骤,当我到达最后一步时再次无能为力.但是,根据我对中断的理解,我不理解的两个步骤都与PIC控制器的硬件中断有关,不应该影响PIT在IRQ 0上引发的中断.因此我也忽略了这一步骤.

当我运行我的代码时,它编译得很好,甚至在虚拟机中运行,但中断似乎只发射一次.然后我意识到我没有向EOI发送EOI,以防止它再引发任何中断.但是,添加mov al, 0x20out 0x20, aliret指令之前使虚拟机崩溃.

这是我的IDT:

; idt
idt_start :

    dw 0x00         ; The interrupt handler is located at absolute address 0x00
    dw CODE_SEG     ; CODE_SEG points to the GDT entry for code
    db 0x0          ; The unused byte
    db 0b11101001   ; 1110 Defines a 32 bit Interrupt gate, 0 is mandatory, privilege level = 0 (0b00), the last bit is …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly operating-system interrupt

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

替代POSIX-unconformant系统上的ssize_t

我正在写一个程序,涉及网络I/O,所以sendrecv使用,这是POSIX功能.它们返回a ssize_t,也是POSIX特有的.
包装器看起来像这个ATM:

ssize_t sock_send(int sock, const void* msg, size_t len) {
    return send(sock, msg, len, 0);
}
Run Code Online (Sandbox Code Playgroud)

尽管我在当前的实现中严重依赖POSIX,但我希望使接口更贴近标准,因为我计划稍后编写一个Windows实现,其中POSIX不一定可用(该死的,Windows!).

ssize_t根据C11标准的规定,什么是一个很好的替代品?也许ptrdiff_t吧?
或者我该如何处理这个问题呢?

c posix

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

这个全加器实现是否正确?

这篇文章,最近收到了一些非常好的赞成票,询问了+C中的运营商.
它显示了以下实现:

// replaces the + operator
int add(int x, int y) {
    while(x) {
        int t = (x & y) <<1;
        y ^= x;
        x = t;
    }
    return y;
}
Run Code Online (Sandbox Code Playgroud)

巧合的是,我自己也写了一个实现(算法书练习),并提出了:

uint32_t bit_add(uint16_t a, uint16_t b) {
    uint32_t carry = ((uint32_t) a & b) << 1;
    uint16_t add = a ^ b;

    return carry ^ add;
}
Run Code Online (Sandbox Code Playgroud)

我测试了几次它似乎工作.事实上,它比参考帖子的实现快得多,缺少x86上的任何跳转.

我的实施是正确的还是有什么不对的我不知道?
我无法想象我的代码比经常看到和审查的帖子的代码更快.

c algorithm add

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

重新排列对齐对象的顺序以实现最小空间使用

我有一个需要4-KiB对齐的数据结构.我可以使用强制执行此操作__attribute__ ((aligned (4096))).

问题是这种对齐要求会导致内存浪费.这是链接器放置符号的方式(pg_dir是对齐的数据结构):

00011000 <cursor_loc>:
00012000 <pg_dir>:
00013000 <idt>:
Run Code Online (Sandbox Code Playgroud)

cursor_loc只有四个字节.这会更好:

00011000 <pg_dir>:
00012000 <cursor_loc>:
00012008 <idt>:
Run Code Online (Sandbox Code Playgroud)

(这里idt必须是8字节对齐.)


您可以使用以下多个文件重现它:

test1.c:

char aligned[4096] __attribute__ ((aligned (4096)));
int i;
Run Code Online (Sandbox Code Playgroud)

test2.c:

int j;

int main(void) { }
Run Code Online (Sandbox Code Playgroud)

然后用它构建它

gcc test1.c test2.c
Run Code Online (Sandbox Code Playgroud)

objdump -D a.out打印这个:

0000000000602004 <j>:
        ...

0000000000603000 <aligned>:
        ...

0000000000604000 <i>:
Run Code Online (Sandbox Code Playgroud)

如何移动GNU ld重新排列符号以减少空间浪费?我真的很想知道它为什么不自动完成.

c x86 gcc ld memory-alignment

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

Htop进程查看器-设置列宽

我尝试扩大htop列的宽度。我在这里找到了一个解决方案,但它看起来非常具体而且也太困难了。有没有更简单的方法使一列中的所有字符都可见?

linux htop

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

禁用x86 32位中的分页

我试图直接写入物理内存位置,所以我使用汇编函数首先禁用分页,写入值,然后重新启用分页,但由于某种原因,在尝试编写时仍会触发页面错误值.

据我所知,在x86-32bit中,通过在cr0中翻转位32来设置打开和关闭分页,所以这是我的汇编函数:

mov 4(%esp), %ecx //address
mov 8(%esp), %edx //value

mov %cr0, %eax
and $0x7fffffff, %eax
mov %eax, %cr0

mov %edx, (%ecx) //this line still triggers a page fault somehow

or $0x80000000, %eax
mov %eax, %cr0

ret
Run Code Online (Sandbox Code Playgroud)

这是实现我想做的正确方法吗?如果是这样,为什么还会在cr0中的位翻转时触发页面错误?

paging x86 assembly virtual-memory page-fault

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

当一个人说电脑"挂起"或冻结时会发生什么?

我们知道在计算机上运行的所有内容都是由许多人合作的庞大程序.
因此,当计算机挂起而我们无法做任何事情时,会发生什么呢?此外,这个场景中的所有内容都冻结了程序中实现的内容吗?或者它是否像程序计数器卡住并且不能增加,因此处理器中存在一些问题?

operating-system hang computer-architecture

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

为什么在方阵乘法的递归中输入大小除以2而不是4?

在分析方阵乘法运行时,我了解到运行时是

T(N) = 8T(N/2) + O(N^2)

对于朴素的分而治之的方法,和

T(N) = 7T(N/2) + O(N^2)

对于施特拉森的方法。

为什么 N 除以 2 而不是 4?

我怎么理解,系数 T(N/2)(8 表示 naive,7 表示 Strassen)是每个级别引入的递归次数,或者子问题的增长率。除数是减少问题的因子。这O(N^2) addend 是每个特定重复节点的运行时间。

如果朴素算法和施特拉森方法都将输出矩阵划分为 N/2 x N/2 矩阵在哪里 N 是行数和列数,问题是不是减少了 4 倍而不是 2 倍,因为在每个级别我们都在解决 4 个较小矩阵的问题?

下面是我从 GeeksforGeeks 获得的天真方法的图像:

朴素的方法图像

algorithm recursion divide-and-conquer matrix-multiplication

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