| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2255 人关注过本帖
标题:借个位置放下,关于如何定义一个良好的 API 接口的试验
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
结帖率:59.52%
收藏
已结贴  问题点数:20 回复次数:2 
借个位置放下,关于如何定义一个良好的 API 接口的试验
//双缓冲的使用API 自己写的  其实双缓冲 我觉得用多线程来实现要好点,
程序代码:
#include "stdafx.h"
#include <stdlib.h>
typedef struct double_arrary{     //双数组的数据结构
    char *str;                   //字符串1
    char *str1;                 //字符串2
    char *dumpstring;
    int  strlen1;              //字符串1的长度大小
    int     strlen2;              //字符串2的长度大小
    int  strlen3;               
    int  flag;                 //用双位表示字符串是否有数据的状态 二进制10 str1有2无 , 11 都有 ,01表示 str1无str2有
    int  signal_flag           //还有没有数据的指示标志,先不复杂化问题 将其单独出来 不和上面的flag合并
    int  topflag;              //当前尾巴指针在那个字符串中  
    int  baseflag;            //当前 头指针在那个字符串中
    int  dumpflag             //指示是否转储过字符串
    char *base;                //字符串的头指针位置
    char *top;                 //字符串的当前处理位置指针 
}double_arrary,*pdouble_arrary;
struct double_arrary * malloc_double_arrary(int n1,int n2)   //提供接口 创建一个双数组的读写对象 n1 n2 分别对应数组的大小
{
    pdouble_arrary node;
    node=(double_arrary*)malloc(sizeof(double_arrary));
    node->str=(char*)malloc(n1);
    node->str1=(char*)malloc(n2);
    node->strlen1=n1;
    node->strlen2=n2;
    node->base=node->top=str;
    node->flag=0;
    return node;
}
void getbaseinit(struct double_arrary *node,char *data1,char *data2,int n1,int n2) //对双数组对象的初始化
{
    if(data1!=NULL&&data2!=NULL){
        node->flag=3;
        node->baseflag=node->topflag=1;
        node->base=bode->top=str;
    }
    if(data1==NULL&&data2!=NULL){
        node->flag=1;
        node->baseflag=node->topflag=2;
        node->base=bode->top=str1;
    }
    if(data1!=NULL&&data2==NULL){
        node->flag=2;
        node->baseflag=node->topflag=1;
        node->base=bode->top=str;
    }
    if(data1==NULL&&data2==NULL){
        node->flag=0;
        printf("no data  完成"); //退出点

    }

    if(data1!=NULL&&node->strlen<n1){
        node->str=(char*)remalloc(node->str,n1);
        node->strlen1=n1;
        strncpy(node->str,data1,n1);
    }
    

    if(data2!=NULL){
        node->str=(char*)remalloc(node->str2,n2);
        node->strlen2=n2;
        strncpy(node->str1,data2,n2);
    }

      
}


 void signal_deal(struct double_arrary *node,int flag) //使用者指示程序还有没有数据给出 flag=0表示没有数据了,否则就代表还有数据

 {
     node->signal_flag=flag;
 }


 int  data_deal(struct double_arrary *node)                //数据处理部分

 {
     char *string1 *string2,int n,n2,int flag=0;
     if(node->flag==0)  return 0;
     while(node->flag!=0){
         if((node->flag==1||node->flag==2)&&node->signal_flag==1) 
             return 1;                                   //有一个字符串数组处理完成了,且还有数据要处理,就从这个函数中返回去拿数据
         if(node->topflag==1){
             string=node->str;
             string2=node->str1;
             n=node->strlen1;
             n2=node->strlen2;
             flag=2;
         }
         if(node->topflag==2){
             string=node->str1;
             n=node->strlen2;
             string2=node->str;
             n2=node->strlen1;
             flag=1;
         }
         while(node->top<(string+n)){
             if(*(node->top)==' '&&(node->base==node->top)){
                 node->base++;
                 
             }
             else{
                 if(*node->top==' '){
                     printf("this is a world");  //字符的处理部分 在这添加 假如dumpflag=1则字符串等于dumpstring+base到top之间的数据
                                                        //如果dumpflag=0的话 等于base到top之间的数据
                     if(node->baseflag!=node->topflag)
                         node->flag^=node->baseflag;
                     node->base=node->top+1;
                 }
                
             }
             node->top++;
         }
         if((node->flag^flag)){
             if(node->topflag!=node->baseflag)  {   //当base指针在一个字符数组中,而top在另一个数组中 且另一个数组全部处理完的时候 ,此时,由于base
                                        //所在数组并未读入新的数据,所以top不能进入这个数组进行数据的处理,这个地方可能出现多次要转储字符串的情况
                 if(node->dumpflag==0){
                    node->strlen3=n+string2+n2-base-1;
                    dumpstring=(char*)malloc(node->strlen3);
                    strncpy(dumpstring,base,string2+n2-base-1);
                    strncat(dumpstring,string,n);
                 }
                 else{
                     node->strlen3+=n+string2+n2-base-1;
                     dumpstring=(char*)remalloc(dumpstring,node->strlen3);
                     strncat(dumpstring,base,string2+n2-base-1);
                     strncat(dumpstring,string,n);
                 }

                    node->base=node->top=string2;
                    node->baseflag=node->topflag=flag;
                    node->flag=0;
                    node->dumpflag=1;
             }
             else{
                  node->top=string2;
                  node->topflag=flag;
             }

         }
         else{
             if(node->signal_flag==0)
                 return 0;
             node->top--;
         }
     }
     if(node->signal_flag==1) 
             return 1; 
 }


 void getdata(struct double_arrary *node,char* string,int n)

 {
     if(node->signal_flag==0)
         return 0 ;                                     //循环出口
     if((node->flag&2)==0){
         if(string!=NULL&&node->strlen1<n){
            node->str=(char*)remalloc(node->str,n);
            node->strlen1=n;
         }
         strncpy(node->str,string,n);
         node->flag|=2;
     }
     if((node->flag&1)==0){
         if(string!=NULL&&node->strlen2<n){
            node->str1=(char*)remalloc(node->str1,n);
            node->strlen2=n;
         }
         node->flag|=1;
         strncpy(node->str1,string,n);
     }

 }

接口使用方法
 malloc_double_arrary(int n1,int n2)   //建立一个双字符串数组的对象
 getbaseinit(struct double_arrary *node,char *data1,char *data2,int n1,int n2)  //初始化对象
signal_deal(struct double_arrary *node,int flag)                                //指示对象 还有后续的处理数据否      
while(data_deal(struct double_arrary *node)){                                    //进入循环, 数据处理完退出循环
   getdata(struct double_arrary *node,char* string,int n)                        //给对象取数据
   signal_deal(struct double_arrary *node,int flag)                            //指示对象还有后续数据否
}

我好像是开窍了,应该是的,站的位置又高一步

[ 本帖最后由 zhu224039 于 2014-7-11 04:48 编辑 ]
搜索更多相关主题的帖子: 如何 接口 多线程 include 
2014-07-08 03:44
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11771
专家分:43421
注 册:2006-5-13
收藏
得分:10 
值得庆贺的进步!

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-07-08 07:13
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
不懂

DO IT YOURSELF !
2014-07-08 08:48
快速回复:借个位置放下,关于如何定义一个良好的 API 接口的试验
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017382 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved