我正在尝试创建一个处理大整数运算的库.大整数存储在结构中:
typedef struct BigInt BigInt;
struct BigInt
{
uint32_t size;
uint32_t *data;
};
Run Code Online (Sandbox Code Playgroud)
第一个成员是包含数字长度的uint32_t,第二个成员是指向实际数字数据的指针(存储在二进制补码中).我编写了一个简单的toHex(BigInt*a)函数来分配内存,将大整数的十六进制值打印到字符串中,然后返回地址.
在我的主循环中,我有以下内容:
int main(int argc, char *argv[])
{
char *ap, *bp;
BigInt *a = fromUInt32(0x7fffffff), *b = fromUInt32(1), *c = fromUInt32(0x80000000);
_add(a, b);
ap = toHex(a);
bp = toHex(c);
printf("%s\n", ap);
printf("%s\n%s\n", ap, bp);
printf("%s\n%s\n", ap, bp);
free(ap);
free(bp);
deleteBigInt(a);
deleteBigInt(b);
deleteBigInt(c);
}
Run Code Online (Sandbox Code Playgroud)
好奇的是,打印出来的
0000000080000000
0
0000000080000000
0000000080000000
0000000080000000
Run Code Online (Sandbox Code Playgroud)
因此,第二个printf语句打印的内容与第一个和第三个printf语句不同.似乎第一个printf语句是正确的,第二个是搞乱的.我已经使用GDB逐步完成了代码,在评估了toHex之后,ap指向字符串"0000000080000000",由空指针终止.
我完全不知所措.据我所知,可能性是:
1.由于一些奇怪的原因,我遇到了未定义的行为.
2.在_add中我调用用x86汇编代码编写的例程,其中可能存在错误(但我通过保留esi,edi,ebx,ebp和esp来遵守GCC的调用约定).
3. printf中有一个错误,似乎不太可能.
此外,由于没有释放toHex分配的内存,我有一个明显的"内存泄漏"(引用因为对内存泄漏的看法似乎有所不同),但这并不重要.
我的toHex功能是Sourav Ghosh要求的,如下:
char numToHex[] = { '0', '1', '2', '3', '4', …Run Code Online (Sandbox Code Playgroud) 对于一个赋值(如果你想知道它是并发的) - 我必须实现自己的锁
(更具体:TaS,TTas和Array-Lock,如"多处理器编程的艺术"中所述)
我尝试过一些在线测试输入和输出方案(太糟糕了,他们需要很长时间才能尝试).
您的程序将计算通过特定测试的9位数字
(它在荷兰语中称为elfproef,我不知道英语对等,对不起).
有时我的号码略有不同,这表明我的锁不能100%正常工作.
我已经实现了这样的锁:
interface Lock
{
void Lock();
void Unlock();
}
class TaSLock : Lock
{
AtomicBool state = new AtomicBool(false);
void Lock.Lock()
{ while (state.getAndSet(true)); }
void Lock.Unlock()
{ state.getAndSet(false); }
}
Run Code Online (Sandbox Code Playgroud)
在AtomicBool与一个实现integer,因为Interlocked类不具备操作Boolean变量.这在内存使用方面不是最佳的,但它不会(或不应该)对速度有影响.
class AtomicBool
{
int value;
static int True = 1, False = -1;
public AtomicBool(bool value)
{
if (value) this.value = True;
else this.value = False;
}
public void set(bool …Run Code Online (Sandbox Code Playgroud) 我需要为学校作业实施一个国际象棋游戏,你必须创建一个适用于同一板上其他游戏的界面.所以,你必须实现国际象棋棋子,但也需要其他游戏的棋子.
我试着这样做:
data ChessPiece = King | Queen | Knight | Rook | Bishop | Pawn deriving (Enum, Eq, Show)
data Piece = ChessPiece | OtherGamePiece deriving (Enum, Eq, Show)
data ColoredPiece = White Piece | Black Piece
data Board = Board { boardData :: (Array Pos (Maybe ColoredPiece)) }
Run Code Online (Sandbox Code Playgroud)
然后我尝试加载国际象棋游戏的开头:
beginBoard = Board (listArray (Pos 0 0, Pos 7 7) (pieces White ++ pawns White ++ space ++ pawns Black ++ pieces Black)) where
pieces :: (Piece -> ColoredPiece) …Run Code Online (Sandbox Code Playgroud) 我不确定这是问的正确地方,但是我已经在stackoverflow上看到了其他Arduino线程,所以我认为这没问题。
我的arduino不兼容的主板未得到认可。我在Windows 8和Windows XP上尝试过。当我打开设备管理器时,“端口(COM和LPT)”部分下只有一个名为“ USB串行端口”的条目。但是,Arduino在连接时不会闪烁。
我尝试卸载USB串行端口驱动程序或对其进行更新,但两者均无效:这些驱动程序似乎是最新的,当我卸载并重新连接arduino时,它们再次出现。
当我尝试上传程序时,我得到
avrdude: stk500_getsync(): not in sync: resp=0x00
Run Code Online (Sandbox Code Playgroud)
要么
avrdude: usbdev_open(): did not find any USB device "usb"
Run Code Online (Sandbox Code Playgroud)
(当我使用“使用编程器上传”时)。
我希望任何人都可以帮助我,我已经尝试了很长时间了。

编辑2:我在父母的装有Windows Vista的计算机上尝试了相同的操作。在那里,该板被识别为“未知设备”下的USB串行端口(首先,我认为这是一个包含两个大写字母然后四个数字的代码,但我不确定,我无法得到该代码)重命名,即使卸载驱动程序也是如此。
是的,另一个美元符号问题.对不起......(我使用了搜索功能!)
我的课程功能编程教授告诉我们,美元符号'有点添加一个开头括号,然后在结尾添加一个'(这里大致粗略地描述的方式大致相同).所以
fibs = 0 : 1 : zipWith (+) fibs $ tail fibs
Run Code Online (Sandbox Code Playgroud)
应该相当于
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
嗯,事实并非如此.第二件事编译得很好,第一件事就是错误:
jkjj.hs:1:8:
Couldn't match expected type `[a1] -> [a1]' with actual type `[a0]'
The first argument of ($) takes one argument,
but its type `[a0]' has none
In the expression: 0 : 1 : zipWith (+) fibs $ tail fibs
In an equation for `fibs':
fibs = 0 : 1 : zipWith …Run Code Online (Sandbox Code Playgroud) 一个简短的,也许是愚蠢的问题.对于类和结构,有时我喜欢使用与构造函数参数同名的成员变量.例如:
class Vector3
{
float x, y, z;
public Vector3(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我也想为结构做这个,但你不能在结构构造函数中使用'this'(我认为它们的使用是为类保留的).有没有办法做到这一点,还是我应该给我的论点另一个名字?
我想使用sizeof函数来获取char数组的大小。我得到的尺寸太大了。例:
#include <stdio.h>
char text[] = "hey";
const int n = sizeof(text);
int main(int argc, char *argv[])
{
printf("%i\n", n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出4,而不是预期的3。我在各种在线c ++编译器上重现了此行为,所以我认为这是有目的的(奇怪的是,我在Internet上找不到任何东西)。我在网上可以找到的大多数资源都说应该为3 * sizeof(char)(在大多数普通系统上为3)。
如果我正确理解了所有内容,那么将以某种方式将多余的字节用于数组表示。为什么会这样?