小编Asl*_*986的帖子

longjmp如何运作?

我需要了解longjmp函数如何工作; 我知道它的作用,但我需要知道它是如何做到的.

我试图在gdb中disas代码,但我无法理解一些步骤.代码是:

0xb7ead420 <siglongjmp+0>:      push   %ebp
0xb7ead421 <siglongjmp+1>:      mov    %esp,%ebp
0xb7ead423 <siglongjmp+3>:      sub    $0x18,%esp
0xb7ead426 <siglongjmp+6>:      mov    %ebx,-0xc(%ebp)
0xb7ead429 <siglongjmp+9>:      call   0xb7e9828f <_Unwind_Find_FDE@plt+119>
0xb7ead42e <siglongjmp+14>:     add    $0x12bbc6,%ebx
0xb7ead434 <siglongjmp+20>:     mov    %esi,-0x8(%ebp)
0xb7ead437 <siglongjmp+23>:     mov    0xc(%ebp),%esi
0xb7ead43a <siglongjmp+26>:     mov    %edi,-0x4(%ebp)
0xb7ead43d <siglongjmp+29>:     mov    0x8(%ebp),%edi
0xb7ead440 <siglongjmp+32>:     mov    %esi,0x4(%esp)
0xb7ead444 <siglongjmp+36>:     mov    %edi,(%esp)
0xb7ead447 <siglongjmp+39>:     call   0xb7ead4d0
0xb7ead44c <siglongjmp+44>:     mov    0x18(%edi),%eax
0xb7ead44f <siglongjmp+47>:     test   %eax,%eax
0xb7ead451 <siglongjmp+49>:     jne    0xb7ead470 <siglongjmp+80>
0xb7ead453 <siglongjmp+51>:     test   %esi,%esi
0xb7ead455 <siglongjmp+53>:     mov    $0x1,%eax
0xb7ead45a <siglongjmp+58>:     cmove …
Run Code Online (Sandbox Code Playgroud)

c linux security assembly

8
推荐指数
3
解决办法
2697
查看次数

从列表中删除所有出现的元素

尝试编写一个给出值和列表的过程,它会删除列表中写入的值的所有出现:

delMember(X, [], []) :- !.
delMember(X, [X|Xs], Y) :- !, delMember(X, Xs, Y).
delMember(X, [T|Xs], Y) :- !, delMember(X, Xs, Y2), append([T], Y2, Y).
Run Code Online (Sandbox Code Playgroud)

由于cut此代码无法正确回答如下问题:

delMember(Y, [1,2,3,1,2,3,1,2,3], [1, 2, 1, 2, 1, 2 ]).
Run Code Online (Sandbox Code Playgroud)

如果我删除剪辑:

delMember(X, [], []).
delMember(X, [X|Xs], Y) :- delMember(X, Xs, Y).
delMember(X, [T|Xs], Y) :- delMember(X, Xs, Y2), append([T], Y2, Y).
Run Code Online (Sandbox Code Playgroud)

它在以下查询中失败:

delMember(Y, [1,2,3,1,2,3,1,2,3], [1,2,3,1,2,3,1,2,3]).
Run Code Online (Sandbox Code Playgroud)

(true当正确的答案是时,返回false).

如何使它在两种情况下都能正常工作?

也许我可以X is not T在第三行代码中检查一下,我试过:

delMember(X, [T|Xs], Y) :- …
Run Code Online (Sandbox Code Playgroud)

prolog prolog-dif

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

执行"show"功能

我想实现show(二进制)函数的方法,并使其能够distingish内功能(a -> a).

像伪haskell代码的东西:

instance Show (a->b) where
    show fun = "<<Endofunction>>" if a==b
    show fun = "<<Function>>" if a\=b
Run Code Online (Sandbox Code Playgroud)

我如何区分这两种情况?

haskell

7
推荐指数
1
解决办法
436
查看次数

逐行读取文件

我正在尝试逐行读取文件,但是当我到达EOF时我不知道如何停止.

我有这个代码:

readWholeFile = do inputFile <- openFile "example.txt" ReadMode
                readALine inputFile

readALine x = do y <- hGetLine x
                 print y
                 readALine x
Run Code Online (Sandbox Code Playgroud)

它显然总是终止提出异常.

我怎么解决?

编辑:确切的错误消息是:

*** Exception: example.txt: hGetLine: end of file
Run Code Online (Sandbox Code Playgroud)

haskell

7
推荐指数
3
解决办法
6936
查看次数

将Char转换为String

鉴于s : String我如何投射结果

s.first()
Run Code Online (Sandbox Code Playgroud)

变成了String

scala

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

使用std :: vector重新赋值的内存解除分配

假设我有VectorAVectorB两种std::vector<SameType>,两种initilized(我的意思是VectorA.size() > 0VectorB.size() > 0)

如果我做:

VectorA = VectorB;
Run Code Online (Sandbox Code Playgroud)

VectorA通常分配的内存是自动释放的?

c++ vector

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

foreach和Enumeration

我试着通过Dean Wampler学习一些Scala阅读Programming Scala.

我正在尝试复制一个代码片段 Enumeration

object Breed extends Enumeration {
  val doberman = Value("Doberman Pinscher")
  val yorkie = Value("Yorkshire Terrier")
  val scottie = Value("Scottish Terrier")
  val dane = Value("Great Dane")
  val portie = Value("Portuguese Water Dog")
}

for (breed <- Breed) println(breed.id + "\t" + breed)
Run Code Online (Sandbox Code Playgroud)

但是,在最后一行代码中,我收到了这个错误:

value foreach is not a member of object Breed
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我怎么解决?

scala

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

命名空间 std 中所有符号的列表

我在哪里可以找到命名空间 std 中声明的所有符号的列表?

实在找不到了,不知道去哪里找。

c++

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

也许是monad用法的例子

我正在尝试学习Haskell,但我在使用monad时遇到问题.

我导入了模块Data.Maybe.

但我不知道如何使用>>=运营商.

鉴于(>>=) :: Monad m => m a -> (a -> m b) -> m b我无法理解如何定义一个函数(a -> m b).

有人可以提供一些教学示例吗?

monads haskell

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

实现返回功能

我正在尝试return在Scheme R6RS中实现一个函数.我想要这样的东西:

(lambda ()
  (do-some-job-before)
  (return some-value)
  (do-some-job-after))
Run Code Online (Sandbox Code Playgroud)

执行(do-some-job-before),不执行 (do-some-job-after)和lambda函数的最终值some-value.

我想我必须继续使用.我试过了:

(define return #f)
(call/cc (lambda (k)
           (set! return k)))
Run Code Online (Sandbox Code Playgroud)

但它不起作用; 例如

(+ 2 (return 3)) ; -> 3 (and not 5 as I expected)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

scheme continuations callcc

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

标签 统计

haskell ×3

c++ ×2

scala ×2

assembly ×1

c ×1

callcc ×1

continuations ×1

linux ×1

monads ×1

prolog ×1

prolog-dif ×1

scheme ×1

security ×1

vector ×1