小编jak*_*inf的帖子

NodeJS中的尾递归

所以我最近遇到的情况我需要编写回调调用自己的代码等等,并想知道NodeJS和尾调用支持,所以我发现这个答案/sf/answers/2125881061/说是的,它支持.

所以我尝试使用这个简单的代码:

"use strict";
function fac(n){
    if(n==1){
        console.trace();
        return 1;
    }
    return n*fac(n-1);
}

fac(5);
Run Code Online (Sandbox Code Playgroud)

在Linux x64上使用Node 6.9.2并运行它node tailcall.js --harmony --harmony_tailcalls --use-strict ,结果是:

Trace
    at fac (/home/tailcall.js:4:11)
    at fac (/home/tailcall.js:7:11)
    at fac (/home/tailcall.js:7:11)
    at fac (/home/tailcall.js:7:11)
    at fac (/home/tailcall.js:7:11)
    at Object.<anonymous> (/home/tailcall.js:10:1)
    at Module._compile (module.js:570:32)
    at Object.Module._extensions..js (module.js:579:10)
    at Module.load (module.js:487:32)
    at tryModuleLoad (module.js:446:12)
Run Code Online (Sandbox Code Playgroud)

这清楚地表明callstack充满了调用,虽然我使用最新的NodeJS,但不支持尾递归.

NodeJS/JavaScript是否支持尾递归?或者我真的必须使用生成器和产量,但问题是我的回调将是非常异步的,无论如何我都不会使用返回值,我只需要确保callstack不会无用地填充函数引用自身作为回报.

javascript recursion tail-call-optimization node.js

4
推荐指数
1
解决办法
1215
查看次数

Void_ptr ++不起作用,但void_ptr + =

我一直认为,指针递增/递减是这样的操作:

 new_ptr=old_ptr+sizeof(type)*count 
Run Code Online (Sandbox Code Playgroud)

所以使用int*它将是:

  old_ptr=0     //int *ptr=0
  count=1       //int count=1
  new_ptr=old_ptr+sizeof(int)*count = 0+4*1 = 0x0004  //ptr+=count; 
Run Code Online (Sandbox Code Playgroud)

并且void的大小= 0,因此使用+ =递增void_ptr不应该改变它.但我可能错了.其他的是++运算符,它会抛出错误.所以如果++抛出错误,为什么+ =也不抛出它?示例代码:

#include <stdio.h>
void tell(const char *s,int *i,void *v){
    printf("%s: \n int_ptr: %#x\n void_ptr: %#x\n",s,i,v);
}
int main(){
    int *int_ptr=0;
    void *void_ptr=0;
    tell("Before",int_ptr,void_ptr);
    int_ptr++;  //int_ptr=int_ptr+sizeof(int); = 0x 0004
    //void_ptr++;   //error: ISO C++ forbids incrementing a pointer of type 'void*'
    tell("After ++",int_ptr,void_ptr);
    int_ptr+=1; //int_ptr=int_ptr+sizeof(int)  =  0x0008
    void_ptr+=1;//void_ptr=void_ptr+sizeof(void)    WHY DOES THIS WORK AND ++ DOES NOT?!     = 0x0001 ?! should be 0x0000, because sizeof …
Run Code Online (Sandbox Code Playgroud)

c++ pointers

3
推荐指数
1
解决办法
441
查看次数

在ACE编辑器中删除自动换行偏移量

我需要删除在ACE编辑器中断行后自动创建的offseting 4""

我尝试使用editor.setTabSize(0)它也有效,但后来我无法通过使用TAB识别代码,因为它将"未定义"引入代码.我在ACE网页上搜索过,但没有那样的东西,当搜索论坛时,它告诉了一些东西setBehaviosrEnabled,但这也没有用

知道如何摆脱这4个空间吗?

问题: 在此输入图像描述

码:

var editor = ace.edit("edittext");
editor.setOptions({
    maxLines: Infinity
});
editor.getSession().setUseWrapMode(true);
editor.setBehavioursEnabled(false);
editor.renderer.setOption('showLineNumbers', false);
editor.setTheme("ace/theme/xcode");
Run Code Online (Sandbox Code Playgroud)

javascript word-wrap ace-editor

2
推荐指数
1
解决办法
2374
查看次数

我无法创建Window

我试图创建窗口已经好几天了,但总是它告诉我"无法创建窗口"当它随机创建窗口时,CPU会增加50%.你能帮助我并说出导致错误的原因吗?这是源代码:

#include<Windows.h> 
int AppRunning=1;
void TellError(LPCWSTR error,HWND hWnd=NULL);
LRESULT CALLBACK WindowProcedure(HWND hWnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
    switch(msg){
        case WM_KEYDOWN:
            AppRunning=0;
            break;
        case WM_CLOSE:
            DestroyWindow(hWnd);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
    }
    return DefWindowProc(hWnd,msg,wparam,lparam);
}

HWND NewWindow(LPCTSTR title,int xpos, int ypos, int width, int height)
{
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WindowProcedure;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = GetModuleHandle(NULL);
    wcex.hIcon = NULL;
    wcex.hCursor = NULL;
    wcex.hbrBackground = GetSysColorBrush(COLOR_BTNFACE);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = …
Run Code Online (Sandbox Code Playgroud)

c++ windows

0
推荐指数
1
解决办法
261
查看次数