圆环填充c语言编程,环形缓冲区的C语言实现

#include

#include

#include

#include

#include

#define BUFFSIZE 1024 * 1024

#define min(x, y) ((x) < (y) ? (x) :

(y))

pthread_mutex_t lock =

PTHREAD_MUTEX_INITIALIZER;

struct cycle_buffer {

unsigned

char *buf;

unsigned

int size;

unsigned

int in;

unsigned

int out;

pthread_mutex_t lock;

};

static struct cycle_buffer *fifo = NULL;

static int init_cycle_buffer(void)

{

int size

= BUFFSIZE, ret;

ret =

size & (size - 1);

if

(ret)

return ret;

fifo =

(struct cycle_buffer *) malloc(sizeof(struct

cycle_buffer));

if

(!fifo)

return -1;

memset(fifo, 0, sizeof(struct cycle_buffer));

fifo->size = size;

fifo->in = fifo->out = 0;

pthread_mutex_init(&fifo->lock, NULL);

fifo->buf = (unsigned char *)

malloc(size);

if

(!fifo->buf)

free(fifo);

else

memset(fifo->buf, 0, size);

return

0;

}

unsigned int fifo_get(unsigned char *buf, unsigned int

len)

{

unsigned

int l;

len =

min(len, fifo->in - fifo->out);

l =

min(len, fifo->size - (fifo->out & (fifo->size -

1)));

memcpy(buf, fifo->buf + (fifo->out & (fifo->size -

1)), l);

memcpy(buf + l, fifo->buf, len - l);

fifo->out += len;

return

len;

}

unsigned int fifo_put(unsigned char *buf, unsigned int

len)

{

unsigned

int l;

len =

min(len, fifo->size - fifo->in +

fifo->out);

l =

min(len, fifo->size - (fifo->in & (fifo->size -

1)));

memcpy(fifo->buf + (fifo->in & (fifo->size - 1)), buf,

l);

memcpy(fifo->buf, buf + l, len - l);

fifo->in += len;

return

len;

}

static void * thread_read(void *arg)

{

char

buf[1024];

unsigned

int n;

pthread_detach(pthread_self());

for (;;)

{

memset(buf, 0, sizeof(buf));

pthread_mutex_lock(&fifo->lock);

n = fifo_get(buf, sizeof(buf));

pthread_mutex_unlock(&fifo->lock);

write(STDOUT_FILENO, buf, n);

}

printf("nnafter thread_read : %snn",buf);

return

NULL;

}

static void * thread_write(void *arg)

{

unsigned

char buf[] = "hello world";

pthread_detach(pthread_self());

for (;;)

{

pthread_mutex_lock(&fifo->lock);

fifo_put(buf, strlen(buf));

pthread_mutex_unlock(&fifo->lock);

}

return

NULL;

}

int main(void)

{

int

ret;

pthread_t

wtid, rtid;

ret =

init_cycle_buffer();

if (ret

== -1)

return ret;

pthread_create(&wtid, NULL, thread_write,

NULL);

pthread_create(&rtid, NULL, thread_read,

NULL);

pthread_exit(NULL);

return

0;

}

view plain

buffer指向存放数据的缓冲区,size是缓冲区的大小,in是写指针下标,out是读指针下标,在len和(fifo->size

- fifo->in + fifo->out)之间取一个较小的值赋给len。注意,当(fifo->in ==

fifo->out+fifo->size)时,表示缓冲区已满,此时得到的较小值一定是0,后面实际写入的字节数也全为0。另一种边界情况是当len很大时(因为len是无符号的,负数对它来说也是一个很大的正数),这一句也能保证len取到一个较小的值,因为fifo->in总是大于等于fifo->out,

所以后面的那个表达式的值不会超过fifo->size的大小把上一步决定的要写入的字节数len“切开”,这里又使用了一个技巧。注意:实际分配

给fifo->buffer的字节数fifo->size,必须是2的幂,否则这里就会出错。既然fifo->size是2的幂,那么

(fifo->size-1)也就是一个后面几位全为1的数,也就能保证(fifo->in &

(fifo->size - 1))总为不超过(fifo->size - 1)的那一部分,和(fifo->in)%

(fifo->size - 1)的效果一样。

这样后面的代码就不难理解了,它先向fifo->in到缓冲区末端这一块写数据,如果还没写完,在从缓冲区头开始写入剩下的,从而实现了循环缓冲。最后,把写指针后移len个字节,并返回len。

view plain

从上面可以看出,fifo->in的值可以从0变化到超过fifo->size的数值,fifo->out也如此,但它们的差不会超过fifo->size

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码来计算圆环面积: #include <stdio.h> #define PI 3.14159 float area(float r1, float r2) { return PI * (r1 * r1 - r2 * r2); } int main() { float r1, r2; printf("请输入圆环的外半径和内半径:"); scanf("%f %f", &r1, &r2); printf("圆环的面积为:%.2f\n", area(r1, r2)); return ; } ### 回答2: 要计算圆环的面积,可以使用C语言中的函数调用。首先,我们需要计算两个半径:外圆的半径R和内圆的半径r。然后,可以使用公式S = π(R^2 - r^2)来求得圆环的面积S。 下面是一个用C语言编写的函数调用的例子: ```c #include <stdio.h> double calculate_ring_area(double R, double r) { double S = 3.14159 * (R * R - r * r); return S; } int main() { double outer_radius = 6.0; double inner_radius = 4.0; double ring_area = calculate_ring_area(outer_radius, inner_radius); printf("圆环的面积是:%f\n", ring_area); return 0; } ``` 在上述代码中,我们定义了一个函数`calculate_ring_area`,该函数接受两个参数R和r,并返回圆环面积S。在`main`函数中,我们定义了外圆的半径`outer_radius`和内圆的半径`inner_radius`,然后调用`calculate_ring_area`函数来计算圆环的面积并赋值给`ring_area`变量。最后,我们使用`printf`函数来输出圆环的面积。 运行上述代码,将会得到输出结果:"圆环的面积是:78.5398"。 这个例子解释了如何使用C语言函数调用来求圆环的面积。你可以根据实际需求来修改半径的值,并相应地计算出不同半径对应的圆环面积。 ### 回答3: 要计算圆环的面积,我们可以使用C语言中的函数调用方法。首先,我们需要知道圆环的内半径和外半径。 假设内半径为r1,外半径为r2。我们可以编写一个函数,传入这两个半径的值,并返回圆环的面积。 函数的声明如下: ```c float calculateArea(float innerRadius, float outerRadius); ``` 在函数内部,我们可以使用圆的面积公式来计算圆环的面积。该公式为: ```c Area = π * (r2^2 - r1^2) ``` 其中,π为圆周率,可以使用宏定义方式定义为3.14159。 函数的定义如下: ```c float calculateArea(float r1, float r2) { float area; area = 3.14159 * (r2*r2 - r1*r1); return area; } ``` 在主函数中,我们可以调用该函数来计算圆环的面积,并将结果打印输出。 ```c #include <stdio.h> int main() { float innerRadius, outerRadius, area; printf("请输入圆环的内半径和外半径:"); scanf("%f %f", &innerRadius, &outerRadius); area = calculateArea(innerRadius, outerRadius); printf("圆环的面积为:%f\n", area); return 0; } ``` 通过以上代码,我们可以实现通过函数调用来计算圆环面积的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值