小编Joe*_*oel的帖子

C程序可以修改其可执行文件吗?

我手上有点太多时间,开始想知道我是否可以写一个自修改程序.为此,我在C中编写了一个"Hello World",然后使用十六进制编辑器在已编译的可执行文件中查找"Hello World"字符串的位置.是否可以修改此程序以打开自身并覆盖"Hello World"字符串?

char* str = "Hello World\n";

int main(int argc, char* argv) {

  printf(str);

  FILE * file = fopen(argv, "r+");

  fseek(file, 0x1000, SEEK_SET);
  fputs("Goodbyewrld\n", file);      
  fclose(file);    

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,我假设有一些东西阻止它打开自己,因为我可以将它分成两个单独的程序(一个"Hello World"和一些修改它),它工作正常.

编辑:我的理解是,当程序运行时,它被完全加载到ram中.因此,对于所有意图和目的,硬盘驱动器上的可执行文件是一个副本.为什么修改自己会有问题?

有解决方法吗?

谢谢

c metaprogramming self-modifying

22
推荐指数
2
解决办法
9549
查看次数

C/C++编译器如何在头文件中找到原型的定义?

当我在头文件中声明一个函数,并将该函数的定义放在其他文件中时,编译器/链接器如何找到定义?它是否系统地搜索其路径中的每个文件,还是有更优雅的解决方案?这一天一直困扰着我,我一直无法找到解释.

c c++ header forward-declaration

21
推荐指数
2
解决办法
4901
查看次数

如何编写不依赖"全局"变量的类?

当我在大学学习第一门编程课程时,我们被告知全局变量是邪恶的,应该不惜一切代价避免(因为你可以快速开发出令人困惑和不可维护的代码).第二年,我们学习了面向对象的编程,以及如何使用类创建模块化代码.

我发现每当我使用OOP时,我都会使用类的私有变量作为全局变量,它们可以(并且)被类中的任何函数读取和修改.这并不是真正与我坐在一起,因为它似乎引入了全球变量在C等语言中遇到的相同问题.

所以我想我的问题是,如何停止用"全局"变量编写类?假装我用函数式语言写作会更有意义吗?我的意思是让所有函数都使用参数和返回值,而不是直接修改类变量.如果我需要设置任何字段,我可以只取功能的输出并分配它而不是让函数直接执行.这似乎可以使更多可维护的代码,至少对于更大的类.什么是常见做法?

oop global-variables

13
推荐指数
2
解决办法
337
查看次数

在Clojure中习惯性地迭代2(或更高)维度序列

在Clojure中是否存在迭代二维序列的"正确"方法?假设我有一个数字列表列表,就像这样

 ((1 2 3)
  (4 5 6)
  (7 8 9))
Run Code Online (Sandbox Code Playgroud)

我想生成一个新的列表列表,每个数字加1.有没有一种简单的方法在Clojure中执行此操作而不依赖于嵌套映射或循环/重复?我已经能够做到了,但我的解决方案很难看,当我重新阅读它们时,我发现它们很难理解.

谢谢

clojure

11
推荐指数
5
解决办法
2690
查看次数

在Windows窗体中有效地绘制网格

我正在用C#编写Conway的生命游戏的实现.这是我用来绘制网格的代码,它在我的panel_Paint事件中.g是图形上下文.

for (int y = 0; y < numOfCells * cellSize; y += cellSize)
{
     for (int x = 0; x < numOfCells * cellSize; x += cellSize)
     {
          g.DrawLine(p, x, 0, x, y + numOfCells * cellSize);
          g.DrawLine(p, 0, x, y + size * drawnGrid, x);
     }
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的程序时,它没有响应,直到它完成绘制网格,这需要几秒钟在numOfCells = 100&cellSize = 10.删除所有乘法使它更快,但不是很多.

绘制网格有更好/更有效的方法吗?

谢谢

c# graphics optimization drawing

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

Haskell的新手,不明白我为什么会遇到无限类型的错误

module Main where

rev :: [a] -> [a]
rev (x:[]) = x
rev (x:xs) = (rev xs):x

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

main = do
   print (rev lst)
Run Code Online (Sandbox Code Playgroud)

我正在努力解决99个Haskell问题,并尝试编写一个函数来反转列表(是的,我知道已有一个已经在前奏中).

我的问题是,当我尝试编译上面的代码(或只是将函数定义键入GHCi)时,我得到:

Occurs check: cannot construct the infinite type: a = [a]
In the expression: rev :: [a] -> [a]
In the definition of `it': it = rev :: [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

我不太确定我的类型在哪里出错以获得此错误.我猜这与我的模式匹配有关,但我不知道为什么.

haskell

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

Clojure有短路逻辑吗?

在许多语言中,如果你写一些东西

if (foo() || bar() || foobar()) { /* do stuff */ }
Run Code Online (Sandbox Code Playgroud)

并且foo()返回true,然后不会计算bar()和foobar().

假设我有以下Clojure代码:

(let [a (simple-function args)
      b (complex-function args)
      c (too-lazy-to-optimize-this-function args)]
  (or a b c))
Run Code Online (Sandbox Code Playgroud)

如果计算结果为true,那么b和c也会被评估,还是会被忽略?

谢谢!

optimization clojure short-circuiting

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

如何在WPF中使用数据绑定为列表中的每个元素创建新的用户控件?

我有一个对象列表.对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件.根据我的阅读,以编程方式执行此操作是WPF的不良做法(并且不太直接),因此我应该使用数据绑定作为解决方案.问题是,我无法弄清楚如何做到这一点.我在编译时不知道列表的内容(只是类型),所以我无法为每个元素创建和绑定XAML.谷歌和MSDN似乎没有任何答案,所以也许我正在考虑这个错误的方式?我需要做什么?

谢谢

编辑:澄清一下,我正在尝试制作自己的音乐评分软件,比如Rosegarden.该列表将包含所有度量,用户控件将是它们的可视化表示.

c# wpf binding user-controls

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

Java OpenGL绑定中的GLU.gluLook似乎什么都不做

我已经检查了关于这个主题的其他问题,他们的解决方案对我没用.我有点失落.我的GLEventListener实现中有以下函数.

public void init(GLAutoDrawable gl) {
    GL2 gl2 = gl.getGL().getGL2();

    gl2.glMatrixMode(GL2.GL_PROJECTION);
    gl2.glLoadIdentity();
    GLU glu = GLU.createGLU(gl2);
    glu.gluPerspective(45.0f, 1, 0.1f,100.0f);
    gl2.glMatrixMode(GL2.GL_MODELVIEW);
    gl2.glLoadIdentity();
    gl2.glViewport(0, 0, width, height);
    gl2.glEnable(GL.GL_DEPTH_TEST);
}

private void render(GLAutoDrawable drawable) {

    GL2 gl = drawable.getGL().getGL2();
    GLU glu = GLU.createGLU(gl);

    gl.glClear(GL.GL_COLOR_BUFFER_BIT);
    gl.glMatrixMode(GL2.GL_MODELVIEW);
    gl.glLoadIdentity();
    glu.gluLookAt(5,  0, 20, 
                  0, 30,  0, 
                  0,  1,  0);

    gl2.glPushMatrix();
    gl2.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT );                
    gl2.glLoadIdentity();
    gl2.glTranslatef(x, y, z);        
    gl2.glBegin( GL2.GL_QUADS );
        gl2.glColor3f( 1, 0, 0 );

        //24 glVertex3f calls & some colour changes go here.
        gl2.glVertex3f(...) …
Run Code Online (Sandbox Code Playgroud)

java opengl jogl glu

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

有没有办法用编码/ gob序列化循环数据结构?

我正在努力将神经网络库移植到Go.我希望能够保存和恢复训练有素的网络,所以我试图直接序列化它.问题是,网络结构在其字段中包含循环(神经元A与神经元B有连接,神经元B与神经元A有连接).每当我尝试使用encoding/gob序列化整个网络时,它就会因堆栈溢出而失败.

这是一个非常简单的代码示例,它以相同的方式中断:

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
    "log"
)

type P struct {
    Name    string
    Q *Q
}

type Q struct {
    Name string
    P *P
}

func main() {
    var network bytes.Buffer        // Stand-in for a network connection
    enc := gob.NewEncoder(&network) // Will write to network.
    dec := gob.NewDecoder(&network) // Will read from network.

    p := &P{ "P", nil }
    q := &Q{ "Q", p }
    p.Q = q

    err := enc.Encode(p)
    if err != nil { …
Run Code Online (Sandbox Code Playgroud)

go cyclic-reference gob

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

为什么我会收到LazySeq投射错误?

我写了以下函数

(defn insert-block
  "Given a block, coordinate and playfield, returns the altered playfield.
   Does not check for collisions."
  [[x y] block playfield]
  (let [blocksize (count block)
    insertion (fn [a b] (vector (block a) (playfield b)))
    block-indicies (range 0 blocksize)
    field-indicies (range y (+ y blocksize))]
    (map insertion block-indicies field-indicies))) 
Run Code Online (Sandbox Code Playgroud)

块和游戏区域都是向量的向量.出于某种原因,每次调用此函数时,都会出现以下错误:

#<ClassCastException java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to clojure.lang.IFn>
Run Code Online (Sandbox Code Playgroud)

该函数已经从我的代码中简化了一点 - "插入"在原始版本中更复杂,但无论如何我得到相同的错误.这让我感到疯狂 - 有没有人有任何想法?

编辑:我一直用[2]为[xy]和[[0 0 0] [0 1 0] [1 1 1]]测试它.Playfield太大而无法在此处粘贴,但它是包含整数的26个向量的向量,长度为14.

EDIT2:这是playfield矢量.

[[1 1 1 1 1 1 1 …
Run Code Online (Sandbox Code Playgroud)

casting clojure

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

在javascript中顺利预测鼠标光标的位置

我想在画布上围绕鼠标光标绘制一个矩形,该矩形平滑地跟随光标。不幸的是, mousemoved 事件触发的速度不够快,并且绘图不断落后于它。所以我假设我需要预测鼠标在哪里,并在该点绘制矩形。我正在尝试编写一个简单的库来抽象它,但它并没有像我想要的那样紧密地跟踪快速移动(事实上,快速移动是令人紧张的)。对于缓慢的移动,它的跟踪效果相当好,并且比使用原始鼠标坐标的简单解决方案更好。

基本思想是 mousemove 用鼠标的当前位置更新几个外部变量。requestAnimationFrame 循环(Watcher 函数)随着时间的推移跟踪这些变量及其先前的值,以计算鼠标移动的速度(在 x 轴上)。当调用 PredictX 函数时,它返回当前的 x 位置,加上 x 的最后变化乘以速度。不同的 reqeustAnimationFrame 循环根据预测的 x 值移动矩形。

var MouseLerp = (function () {
    var MOUSELERP = {};
    var current_x = 0;
    var last_x = 0;
    var dX = 0;
    var last_time = 0;
    var x_speed = 0;

    var FPS = 60;

    function Watcher(time) {
        var dT = time - last_time
        if (dT > (1000 / FPS)) {
            dX = last_x - current_x;
            last_x = current_x;
            x_speed = …
Run Code Online (Sandbox Code Playgroud)

html javascript canvas

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