小编use*_*755的帖子

C如何在不使用图形库或任何其他库函数的情况下绘制点/设置像素

我试图理解如何在不使用库函数的情况下绘制一组形成圆的点(/设置像素).

现在,获得给定半径的点的(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)

有人可以分享任何链接/参考或解释这是如何工作的?

c

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

C执行堆栈 - 局部变量分配

我有一个非常基本的问题.让我们看看这个片段:

#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 ... …

c

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

基本内存地址混乱

这是我有一个非常基本的内存地址问题:

这是我的片段:

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 = …

c memory pointers kernel memory-management

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

通过查找表了解位集计数的位旋转技巧

我正在阅读斯坦福大学的一些小技巧: 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)

c bit-manipulation

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

为什么使用不同的指针类型

在很多标准的开源代码中,我在不同的地方看到使用不同的指针类型,如:

uint32 fooHash (uint8 *str, uint32 len)
Run Code Online (Sandbox Code Playgroud)

我没有得到以下内容: - 为什么要将int声明为uint32,uint8?所有这些都将在用户空间本身运行,那么为什么不留下自己呢?以后便携性不是一个问题吗?

  • 另外,如果你想在32位系统上运行开源代码,为什么指针为uint8*ptr?

c pointers kernel

0
推荐指数
1
解决办法
4909
查看次数