我试图理解如何在不使用库函数的情况下绘制一组形成圆的点(/设置像素).
现在,获得给定半径的点的(x,y)坐标是直截了当的.
for (x=-r; x <r; x=x+0.1) {
y = sqrt(r*r - x*x);
draw(x,y, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)
但是,一旦我得到了积分,你如何真正画圆圈就是令我困惑的事情.我可以使用图形库,但我想了解如何在不使用图形库的情况下完成它
void draw(float x, float y, float center_x, float center_y) {
//logic to set pixel given x, y and circle's center_x and center_y
// basically print x and y on the screen say print as a dot .
// u 'd need some sort of a 2d char array but how do you translate x and y
// to pixel positions
}
Run Code Online (Sandbox Code Playgroud)
有人可以分享任何链接/参考或解释这是如何工作的?
我有一个非常基本的问题.让我们看看这个片段:
#include <stdio.h>
void foo(void) {
char *s = "StackOverflow";
printf("%s\n", s);
}
int main(void) {
foo();
}
Run Code Online (Sandbox Code Playgroud)
在进程执行堆栈中,main被加载到堆栈,然后调用foo().现在,分配了"StackOverflow"的内存在哪里?同样,在调用printf时分配给"%s \n"的memroy是什么?
请考虑以下代码:
现在我的另一个问题是,考虑下面的代码:
#include <stdio.h>
int x;
int abc = 100;
void foo(void) {
char *s = "stackoverflow";
printf("%s\n", s);
}
int main(void) {
foo();
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我做objdump -s -j .bss a.out,我应该看到未初始化的段,如果我做objdump -s -j .data a.out,我应该看到初始化段(abc = 100)rt?这个假设有什么问题吗?
我得到以下输出:
test> objdump -s -j .bss a.out a.out:文件格式为elf32-i386
test> objdump -s -j .data a.out
a.out:文件格式为elf32-i386
部分内容.data:804954c 00000000 3c960408 00000000 64000000 .... <....... d ... …
这是我有一个非常基本的内存地址问题:
这是我的片段:
int *i = &a[0];
printf("ptr i = %p, i = %x, (i+1) = %p, (i+1) = %x\n", i, i, i+1, i+1);
Run Code Online (Sandbox Code Playgroud)
输出如下:
ptr i = 0x7fff5fbff700, i = 5fbff700, (i+1) = 0x7fff5fbff704, (i+1) = 5fbff704
这是一个32位内核.
我真正没有得到的是:
地址0x7fff5fbff700和地址0x7fff5fbff704应该相差32位或4字节.
如果我将地址中的每个"元素" 0x7fff5fbff700视为1个字节,那么是的,我可以看到两个地址如何相差4个字节,但如果是这种情况,那么地址0x7fff5fbff704将是12*4 = 48字节.这怎么可能呢??
我在Linux中运行它,这是我得到的:
ptr i = 0xffff82cc, i = ffff82cc, (i+1) = 0xffff82d0, (i+1) = ffff82d0
如果我尝试打印(i + 1)-1,它总是给出0x1
但我不知道0xffff 82cc和0xffff 82d0如何相差32位或4字节!
0xffff82cc = FFFF 1000 0010 1010 1010 0xffff82d0 = …
我正在阅读斯坦福大学的一些小技巧: http: //graphics.stanford.edu/~seander/bithacks.html#CountBitsSetTable
对于用查找表设置的位数进行计数,我有两个问题:1)
c = BitsSetTable256[v & 0xff] +
BitsSetTable256[(v >> 8) & 0xff] +
BitsSetTable256[(v >> 16) & 0xff] +
BitsSetTable256[v >> 24];
Run Code Online (Sandbox Code Playgroud)
这怎么是正确的呢。因此,该表包含为 256 个数字预先计算的位数 = 2^8。现在我们有一个 32 位数字来计算位集。v31..v24 v23...v16 v15...v8 v7..v0
我们需要做的就是在查找表中每8位查找一次
所以,它应该是
c = BitsSetTable256[v & 0x0F] +
BitsSetTable256[v>>8 & 0x0F] +
BitsSetTable256[v>>16 & 0x0F] +
BitsSetTable256[v>>24]
Run Code Online (Sandbox Code Playgroud)
我的观点是,我们应该使用 & 0x0F 而不是 FF 来获得 256 范围内的正确数字,对吗?
我在这里缺少什么?:( :(
2)另外,这个宏对于位集的相同位旋转黑客部分意味着什么
static const unsigned char BitsSetTable256[256] =
{
# define B2(n) n, n+1, n+1, n+2
# define B4(n) …Run Code Online (Sandbox Code Playgroud) 在很多标准的开源代码中,我在不同的地方看到使用不同的指针类型,如:
uint32 fooHash (uint8 *str, uint32 len)
Run Code Online (Sandbox Code Playgroud)
我没有得到以下内容: - 为什么要将int声明为uint32,uint8?所有这些都将在用户空间本身运行,那么为什么不留下自己呢?以后便携性不是一个问题吗?