我手上有点太多时间,开始想知道我是否可以写一个自修改程序.为此,我在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中.因此,对于所有意图和目的,硬盘驱动器上的可执行文件是一个副本.为什么修改自己会有问题?
有解决方法吗?
谢谢
当我在头文件中声明一个函数,并将该函数的定义放在其他文件中时,编译器/链接器如何找到定义?它是否系统地搜索其路径中的每个文件,还是有更优雅的解决方案?这一天一直困扰着我,我一直无法找到解释.
当我在大学学习第一门编程课程时,我们被告知全局变量是邪恶的,应该不惜一切代价避免(因为你可以快速开发出令人困惑和不可维护的代码).第二年,我们学习了面向对象的编程,以及如何使用类创建模块化代码.
我发现每当我使用OOP时,我都会使用类的私有变量作为全局变量,即它们可以(并且)被类中的任何函数读取和修改.这并不是真正与我坐在一起,因为它似乎引入了全球变量在C等语言中遇到的相同问题.
所以我想我的问题是,如何停止用"全局"变量编写类?假装我用函数式语言写作会更有意义吗?我的意思是让所有函数都使用参数和返回值,而不是直接修改类变量.如果我需要设置任何字段,我可以只取功能的输出并分配它而不是让函数直接执行.这似乎可以使更多可维护的代码,至少对于更大的类.什么是常见做法?
在Clojure中是否存在迭代二维序列的"正确"方法?假设我有一个数字列表列表,就像这样
((1 2 3)
(4 5 6)
(7 8 9))
Run Code Online (Sandbox Code Playgroud)
我想生成一个新的列表列表,每个数字加1.有没有一种简单的方法在Clojure中执行此操作而不依赖于嵌套映射或循环/重复?我已经能够做到了,但我的解决方案很难看,当我重新阅读它们时,我发现它们很难理解.
谢谢
我正在用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.删除所有乘法使它更快,但不是很多.
绘制网格有更好/更有效的方法吗?
谢谢
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)
我不太确定我的类型在哪里出错以获得此错误.我猜这与我的模式匹配有关,但我不知道为什么.
在许多语言中,如果你写一些东西
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也会被评估,还是会被忽略?
谢谢!
我有一个对象列表.对于列表中的每个项目,我想创建一个绑定到该项目的新用户控件.根据我的阅读,以编程方式执行此操作是WPF的不良做法(并且不太直接),因此我应该使用数据绑定作为解决方案.问题是,我无法弄清楚如何做到这一点.我在编译时不知道列表的内容(只是类型),所以我无法为每个元素创建和绑定XAML.谷歌和MSDN似乎没有任何答案,所以也许我正在考虑这个错误的方式?我需要做什么?
谢谢
编辑:澄清一下,我正在尝试制作自己的音乐评分软件,比如Rosegarden.该列表将包含所有度量,用户控件将是它们的可视化表示.
我已经检查了关于这个主题的其他问题,他们的解决方案对我没用.我有点失落.我的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) 我正在努力将神经网络库移植到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) 我写了以下函数
(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) 我想在画布上围绕鼠标光标绘制一个矩形,该矩形平滑地跟随光标。不幸的是, 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)