C 循环FIFO缓冲区使用

C 循环FIFO缓冲区使用,c,circular-buffer,C,Circular Buffer,我想用C实现循环FIFO缓冲区。当我在Google上搜索代码样本时,我发现了这个。我不明白这是不是意味着循环FIFO缓冲区的概念已经获得了专利,每个想使用它的人都必须拥有许可证 最美好的祝愿 不,软件中的FIFO没有专利(第一个FIFO算法发明时没有软件专利——我不确定确切的日期,但软件专利是20世纪90年代的现象,我在1983年在C64上使用了FIFO) 该专利申请的是一种包含FIFO的硬件芯片,它具有某些特性,特别是“在一个总线周期内执行多个传输” 所以这不是一般的16550 UART(每个

我想用C实现循环FIFO缓冲区。当我在Google上搜索代码样本时,我发现了这个。我不明白这是不是意味着循环FIFO缓冲区的概念已经获得了专利,每个想使用它的人都必须拥有许可证

最美好的祝愿

不,软件中的FIFO没有专利(第一个FIFO算法发明时没有软件专利——我不确定确切的日期,但软件专利是20世纪90年代的现象,我在1983年在C64上使用了FIFO)

该专利申请的是一种包含FIFO的硬件芯片,它具有某些特性,特别是“在一个总线周期内执行多个传输”

所以这不是一般的16550 UART(每个时钟周期只能进行一次传输)

通常,您每天编写的许多代码都获得了专利。通常,这不是一个问题,因为你的公司不在专利所有者的雷达上。但是当他们决定不再喜欢你的那一天,你就有大麻烦了,除非你能花上数亿美元的律师费在法庭上为自己辩护,或者你自己有一大堆愚蠢的专利,你可以用它们来反击

我收集了一些你可能想读的文章:

//circular\u queue.cpp:主项目文件。
#包括“stdafx.h”
使用名称空间系统;
#包括
#包括
#包括
#定义最大值3
int q[10];
int-front=0;
int rear=-1;
int main()
{
int-ch;
无效插入();
无效删除();
void display();
//clrsc();
printf(“\n循环队列操作\n”);
printf(“1.insert\n2.delete\n3.display\n4.exit\n”);
而(1)
{
printf(“输入您的选择:”);
scanf(“%d”和“ch”);
开关(ch)
{
案例1:插入();中断;
案例2:删除();中断;
案例3:显示();中断;
案例4:退出(0);
默认值:printf(“无效选项”);
}
}
返回0;
}
空白插入()
{
int x;
如果((前==0和&后==max-1)| |(前>0和&后==front-1))
printf(“队列溢出\n”);
其他的
{
printf(“输入要插入的元素:”);
scanf(“%d”和&x);
如果(后==最大值1&&前>0)
{
后部=0;
q[后]=x;
}
其他的
{
如果((前==0和&后==-1)| |(后!=前-1))
q[++后]=x;
}
}
}
无效删除()
{
INTA;
如果((前==0)和&(后==1))
{
printf(“队列下溢\n”);
getch();
出口(0);
}
如果(前==后)
{
a=q[前面];
后部=-1;
正面=0;
}
其他的
如果(前==最大值-1)
{
a=q[前面];
正面=0;
}
否则a=q[front++];
printf(“删除的元素是:%d\n”,a);
}
无效显示()
{
int i,j;
如果(前==0和后==-1)
{
printf(“队列下溢\n”);
getch();
出口(0);
}
如果(前>后)
{

对于(i=0;像专利一样的iLooks涵盖了这种缓冲区的硬件实现。虽然我不是律师,但认为硬件FIFO缓冲区没有现有技术的想法是不可思议的。飞利浦是一家主要的电子公司,但循环FIFO缓冲区自离散TTL电子产品诞生以来已经普遍使用了40多年。他们似乎声称,任何包含FIFO缓冲区的单片硅都违反了这项专利,甚至是自1995年以来几乎每台PC机上每个串行端口的16550 UART。这项专利似乎是指硬件中实现的循环缓冲区。无论如何,有太多的软件概念为您申请了专利担心它。关于C中的循环FIFO缓冲区,您可以放心地使用(如果不能使用它,会有很多人陷入麻烦…)。在这段代码中,您可以看到数组int q[10];它存储10个数字。这不是问题的答案
typedef struct red
{
   int niz[MAX]; 
   int f, r;
} RED;

int insert(RED buf, int info)
 {
 if (isFull(buf)) 
 buf->f = (buf->f + 1) % MAX;
 buf->r = (buf->r + 1) % MAX;
 buf->niz[buf->r] = info;
 return 1; }
// circular_queue.cpp : main project file.

#include "stdafx.h"

using namespace System;

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

#define max 3

int q[10];
int front=0;
int rear=-1;

int main()
{
    int ch;
    void insert();
    void delet();
    void display();
   // clrscr();
    printf("\n Circular Queue operations\n");
    printf("1.insert \n 2.delete \n 3.display \n 4.exit \n");
    while(1)
    {
        printf("Enter your choice:");
        scanf("%d",&ch);
        switch(ch)
        {
        case 1: insert();   break;
        case 2: delet();    break;
        case 3: display();  break;
        case 4:exit(0);
        default:printf("Invalid option\n");
        }
    }

    return 0;
}

void insert()
{
    int x;
    if((front==0&&rear==max-1)||(front>0&&rear==front-1))
        printf("Queue is overflow\n");
    else
    {
        printf("Enter element to be insert:");
        scanf("%d",&x);
        if(rear==max-1&&front>0)
        {
            rear=0;
            q[rear]=x;
        }
        else
        {
            if((front==0&&rear==-1)||(rear!=front-1))
                q[++rear]=x;
        }
    }
}
void  delet()
{
    int a;
    if((front==0)&&(rear==-1))
    {
        printf("Queue is underflow\n");
        getch();
        exit(0);
    }
    if(front==rear)
    {
        a=q[front];
        rear=-1;
        front=0;
    }
    else
        if(front==max-1)
        {
            a=q[front];
            front=0;
        }
        else a=q[front++];
        printf("Deleted element is:%d\n",a);
}

void display()
{
    int i,j;
    if(front==0&&rear==-1)
    {
        printf("Queue is underflow\n");
        getch();
        exit(0);
    }
    if(front>rear)
    {
        for(i=0;i<=rear;i++)
            printf("\t%d",q[i]);
        for(j=front;j<=max-1;j++)
            printf("\t%d",q[j]);
        printf("\n rear is at %d\n",q[rear]);
        printf("\n front is at %d\n",q[front]);
    }
    else
    {
        for(i=front;i<=rear;i++)
        {
            printf("\t%d",q[i]);
        }
        printf("\nrear is at %d\n",q[rear]);
        printf("\nfront is at %d\n",q[front]);
    }
    printf("\n");
}
//getch();