小编Sim*_*Sim的帖子

bitsets二进制AND操作

我写了以下几行:

std::bitset<4> bitvec;  //bitset 0000
std::bitset<4> addition; //bitset 0000

addition.set(0); //setting the least significant bit

std::cout << addition << std::endl; //output 0001
std::cout << std::endl;

for(int x = 0; x != 16; ++x) { //addition loop
    std::cout << bitvec << std::endl; //output
    bitvec &= addition; //binary AND
}

std::cout << std::endl;
Run Code Online (Sandbox Code Playgroud)

我期望输出为:

0000
0001
0010
0011
0100
0101
....
Run Code Online (Sandbox Code Playgroud)

但循环只输出'0000'.我错过了什么基本概念?

c++ bitset

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

如何使用 cl.exe 静态链接库以使用 SHGetSpecialFolderPath

我用的SHGetSpecialFolderPath是WINAPI的功能,也是用windows VisualExpressC++编译器(cl.exe)来编译的。但是在链接阶段时,我收到此错误:

error LNK2019: unresolved external symbol __imp___SHGetSpecialFolderPathA@16 referenced in function _main
Run Code Online (Sandbox Code Playgroud)

我想我需要链接Shell32.lib,这是正确的,我将如何做到这一点,让我的程序在另一个系统上运行,甚至可能是 XP 而不是 7,而无需重新编译它?

c++ winapi

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

正确使用这个 - >

this一个班级的自我引用的正确用法是什么?

我有时在一个方法中使用它来清除所使用的变量是一个成员变量而不是在方法中声明的变量,但另一方面我想知道这是否是一个很好的理由,因为我认为你应该总是代码(和注释)以一种自我解释的方式,因此会不必要地使用this不必要的和另一个原因来反对它,那就是你实际上生成了比需要更多的代码.

void function() {
  while(i != this->length) //length is member var
     /*do something*/
}
Run Code Online (Sandbox Code Playgroud)

我经常遇到的另一种使用它的方法是内部构造函数(主要是Java),因为参数确实与必须初始化的成员变量具有相同的名称.由于Primer声明这是坏代码,我不这样做,但另一方面,我看到使用与member-vars相同的名称作为参数名称清除了它们的用途.

C++
Constructor::Constructor(int size,int value) : this->size(size),
                                               this->value(value) {};

Java
Constructor(int size,int value) {
  this->size = size;
  this->value = value;
}
Run Code Online (Sandbox Code Playgroud)

我希望实际上有一个规则考虑两种语言(Java/c ++),如果不是我会重新考虑c ++,因为这是我更感兴趣的.

c++ java this

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

即使类和函数/方法之间没有直接链接,使用defmethod而不是defun也是合理的

考虑这个例子:

有一个名为'first'的类,它在包'a'中定义.

还有一个包'b',它使用模块'a'功能.包'b'的某些功能需要类'first'的对象作为参数.但除此之外,包'a'和'b'之间没有直接的逻辑联系.

现在我想知道编写(defmethod package-b-function ((param first)) #|do stuff..|#)而不是普通函数是否合理,因为函数需要对象并且定义一个方法会为运行时环境和包'b'的其他用户阐明这一点.

我曾经用C++/Java编程,因此我不熟悉在这种情况下使用的OOP约定.

欣赏您的洞察力.

oop coding-style common-lisp

4
推荐指数
2
解决办法
967
查看次数

使用SBCL + quicklisp安装clsql sqlite3

我想使用clsqlsqlite3接口.我已经使用quicklisp 安装了.但是当我尝试运行时:clsql

(clsql:with-database (db '("database.db") 
                          :database-type :sqlite3)
  nil)
Run Code Online (Sandbox Code Playgroud)

我明白了

OPERATION-ERROR while invoking #<COMPILE-OP > on
#<CLSQL-UFFI-SOURCE-FILE "clsql-uffi" "uffi" "clsql_uffi">
   [Condition of type ASDF/BACKWARD-INTERFACE:OPERATION-ERROR]
Run Code Online (Sandbox Code Playgroud)

如果我只是试着赶紧行动,那就是一样的clsql-uffi.

cl-sql,cl-sql-uffi,cl-sql-sqlite3libsqlite3-dev安装.我正在使用Ubuntu,Linux.

sqlite sbcl common-lisp clsql quicklisp

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

如何在方法上使用funcall来设置对象的属性

考虑这段代码:

(defclass test () ((test :initform nil :accessor test)))
#<STANDARD-CLASS TEST>
(defvar *test* (make-instance 'test))
*TEST*
Run Code Online (Sandbox Code Playgroud)

而这个测试:

(funcall #'test *test*)
nil
Run Code Online (Sandbox Code Playgroud)

人们会期望这是有效的:

(setf (funcall #'test *test*) 123)
Run Code Online (Sandbox Code Playgroud)

同样的

(setf (test *test*) 123)
123
Run Code Online (Sandbox Code Playgroud)

但结果如下:

; in: LAMBDA NIL
;     (FUNCALL #'(SETF FUNCALL) #:NEW1175 #:TMP1177 #:TMP1176)
; ==>
;   (SB-C::%FUNCALL #'(SETF FUNCALL) #:NEW1175 #:TMP1177 #:TMP1176)
; 
; caught WARNING:
;   The function (SETF FUNCALL) is undefined, and its name is reserved by ANSI CL
;   so that even if it were …
Run Code Online (Sandbox Code Playgroud)

oop common-lisp

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

如何正确等待n秒

我想实现一个在失败的情况下在重试之前等待n秒的函数,但是实现等待例程的正确方法是什么.

我认为带有if子句的无限循环可能会导致不必要的CPU使用率.

(do ((time (+ (get-universal-time) (- n 1)))
     (time-cur (get-universal-time) (get-universal-time)))
    ((< time time-cur) nil))
Run Code Online (Sandbox Code Playgroud)

因此:这会被认为是正确的代码还是有更标准的方法?

common-lisp

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

如何更改aif以便能够在宏单元中访问'it'而不在包中公开'it'

如果你把介绍的AIF代码onlisp在一个包,并尝试在其他您在PACKAGENAME问题上运行使用它:它不是外部.

(in-package :packagename)

(defmacro aif (test-form then-form &optional else-form)
  ‘(let ((it ,test-form))
     (if it ,then-form ,else-form)))
Run Code Online (Sandbox Code Playgroud)

想要调用语法

(in-package :otherpackage)

(aif (do-stuff)
  (FORMAT t "~a~%" it)
  (FORMAT t "just got nil~%"))
Run Code Online (Sandbox Code Playgroud)

我怎样才能在代码中修复这种行为,而不是将变量外包在包声明中,并且it只能通过it而不是packagename:it

common-lisp

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

如何正确读取大型过程输出

关于如何从流程流中读取已经有一些 答案,但据我所知,它们不包括从以下流程中读取:

  • 在进行任何输出之前可能会运行很长时间
  • 在其生命周期结束时产生巨大的输出(超过流缓冲区可以容纳)
  • 运行时间不应超过给定的时间范围
  • 结果输出作为一个整体需要(长字符串)

因此,使用上述解决方案会导致浪费的进程周期,因为即使没有输出,循环也会尝试读取流,或者由于进程无法打印整个输出(由于完全缓冲)而导致解决方案无法终止输出处理程序在读取之前等待进程终止.

我目前的解决方案看起来像这样(灵感来自批量读取大文件的解决方案)

(defun control-process (process timeout)
  (sb-ext:with-timeout timeout
    (handler-case
      (do ((output-stream (sb-ext:process-output process))
           (string nil))
          ((and (equalp (sb-ext:process-status process) :exited)
            (equalp (peek-char nil output-stream nil :eof) :eof))
           (values string :exited))
        (cond 
          ((equalp (sb-ext:process-status process) :signaled)
           (error 'unexpected-process-finish :finish-status :signaled))
          ((equalp (sb-ext:process-status process) :stopped)
           (error 'unexpected-process-finish :finish-status :stopped)))
        (let ((seq (make-string (file-length output-stream))))
          (read-sequence seq output-stream)
          (setf string (concatenate 'string string seq))
          (sleep 1)))
     (sb-ext:timeout (err)
      (declare (ignore err))
      (values nil :timeout))
     (unexpected-process-finish …
Run Code Online (Sandbox Code Playgroud)

sbcl common-lisp

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

如何将sbcl作为单个参数传递给字符串

我想使用bashcript将sbcl作为单个参数传递给sbcl,但是sbcl将字符串拆分为列表.

bashscript

#!/bin/bash

    sbcl --noinform --eval "(progn (FORMAT t \"~{~a~%~}\" sb-ext:*posix-argv*)(eval (read-from-string (second sb-ext:*posix-argv*))))" $1
Run Code Online (Sandbox Code Playgroud)

执行:

>sh bashsrcipt.bs "\"(FORMAT t \"YEAH\")\""
sbcl
"(FORMAT
t
"YEAH")"

debugger invoked on a END-OF-FILE in thread
#<THREAD "initial thread" RUNNING {1002999833}>:
  end of file on #<SB-IMPL::STRING-INPUT-STREAM {100443F523}>
Run Code Online (Sandbox Code Playgroud)

但结果应该是

>sh bashcript.bs "\"(FORMAT t \"YEAH~%\"\")"
sbcl
"(FORMAT t \"YEAH\")"
YEAH
Run Code Online (Sandbox Code Playgroud)

手册中没有提到这样的行为.

bash sbcl common-lisp

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

标签 统计

common-lisp ×7

c++ ×3

sbcl ×3

oop ×2

bash ×1

bitset ×1

clsql ×1

coding-style ×1

java ×1

quicklisp ×1

sqlite ×1

this ×1

winapi ×1