| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2019 人关注过本帖
标题:坐等大神 解析,引用结构体数组里面的指针变量
只看楼主 加入收藏
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
代码贴出来

我要成为嘿嘿的黑客,替天行道
2012-11-29 15:15
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
如果没有成熟的管理这种数据结构的手段,就不要使用。条条大路通罗马,挑自己有把握的、能掌控的道路走。程序能运行起来,能达到目的,这才是最主要的,不是被数据结构和算法牵着走的,除非你论证过非这样不可,才要死啃。

授人以渔,不授人以鱼。
2012-11-29 15:24
lxsjzbd
Rank: 4
来 自:河北省
等 级:业余侠客
帖 子:97
专家分:258
注 册:2012-3-31
收藏
得分:4 
你在这个函数subFunc1()里,给结构体成员字符指针赋值的吧,不管你赋的是字符地址还是字符串首地址,在函数结束后那些栈里的字符和字符串都被释放了,再打印当然是乱码了,你可以先给结构体成员通过malloc分配空间,因为是在堆里,只要没free(),程序没终止就一直存在,然后把那些字符或字符串赋给结构体成员(注意如果是字符串要用strcpy),程序最后别忘了free
说的有点乱,明白点就是: 你在堆里分配了一块儿块儿的区域,然后用结构体里的字符指针指向这些区域,然后给这些区域赋值,只要你没free(),这些区域始终存在,就能实现你想得了,不过最后记得free()结构体里的每个字符指针

[ 本帖最后由 lxsjzbd 于 2012-11-29 17:00 编辑 ]
2012-11-29 16:55
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
回复 9楼 zhu224039
我不会啊
2012-11-29 17:16
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
回复 5楼 wp231957
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include "ADSC_FILE.h"


#define MAXNUM 128
#define BLANKSPACE   " "
#define TAB  '\t'
#define USELINENUM 256
#define LINENUM 1024*16
#define SUBFUNCNAMELEN 32

extern unsigned int subFuncNum = 0;

/*         将tags文件中的\t替换为\n         */
char* ReplaceTabWithSpace(char* buffer)
{
    unsigned int nIndex = 0;
    for (nIndex = 0; nIndex < (unsigned int)strlen(buffer); nIndex++)
    {
        if ( buffer[nIndex] == TAB )
        {
            buffer[nIndex] = ' ';
        }
    }
    return buffer;
}

/*        提取行号,并转换为整形数        */
unsigned int  GetUseLinenum( char* p)
{
    unsigned int nIndex = 0;
    char* pRet;
    unsigned int ret = 0;
    pRet = (char*)malloc(strlen(p));
    while( (p[nIndex] >= 0x30) && p[nIndex] <= 0x39)
    {
        pRet[nIndex] = p[nIndex];
        nIndex++;   
    }
    pRet[nIndex] = '\0';
    ret = (unsigned int)atoi(pRet);
    return ret;
}

/* tags文件函数 读取,截取信息,提取行号*/
//void  ReadTagsFile(FILE *fp_tags,FILE *fp_src,FILE *fp_des, FUNCINFO *pFuncInfo)
void  ReadTagsFile(FILE *fp_tags,FILE *fp_src,FILE *fp_des)
{
    char buffer[MAXNUM];
    char srcbuffer[MAXNUM];
    char *buf = NULL;
    int bufferCount = 0;
    int i = 0;
    int k = 0;

    char *p[4];

    FUNCINFO Info[USELINENUM];

    while((fgets(buffer,MAXNUM,fp_tags)) != NULL )
    {
        /*  delete ! info  */
        if(buffer[0] == '!')
            continue;
        /*  delete V info  */
        bufferCount = strlen(buffer);
        if( buffer[bufferCount - 2] == 'v' )
        {
            continue;
        }

        buf = ReplaceTabWithSpace(buffer);
        /*strtok()分离tags每一行*/
        while((p[i]=strtok(buf,BLANKSPACE)) != NULL)
        {
            i++;
            buf=NULL;   
        }
   
            Info[k].funcname = p[0];
            Info[k].srcname  = p[1];
            Info[k].lineno   = p[2];
            Info[k].flag     = p[3];   
            Info[k].uselineno = GetUseLinenum(Info[k].lineno);
   
            i = 0;
            k++;        
    }
    subFuncNum = k;
    //GetSubfunctionFromSrcFile(fp_src, fp_des, Info);
   
        
    //memcpy(pFuncInfo, Info,subFuncNum*sizeof(FUNCINFO));
}

/*  统计 '/n' 数,以确定最后一个子函数的结束位置  */
int getSrcLineNum(FILE *fp_src)
{
    char ch;
    int SrcLineNum = 0;
      while((ch = fgetc(fp_src)) != EOF)
     {
        if(ch == '\n')
        {
            SrcLineNum++;
        }
      }
      rewind(fp_src);
        return SrcLineNum;
}

/*      获取公共的头     */
void  getcommonhead(FILE * fp_src,FILE * fp_des,FUNCINFO *pInfo)
{
    int i = 0;
    char buffer[MAXNUM];

        for(i = 0;i < pInfo[0].uselineno - 1;i++)
        {
            fgets(buffer,MAXNUM,fp_src);
            fprintf(fp_des,"%s",buffer);
        }
}

/*   分解源文件获取子函数 */  
void GetSubfunctionFromSrcFile(FILE *fp_src, FILE *fp_des, FUNCINFO *Info)
{
    char buffer[MAXNUM];
   
    int j = 0;
    int k = 0;
    int n = 0;
    int SrcLineNum = 0;
    char ch;
    char subFuncName[SUBFUNCNAMELEN];

    FILE *fp_subFunc;

    /*  统计 '/n' 数,以确定最后一个子函数的结束位置  */
        SrcLineNum =  getSrcLineNum(fp_src);


        /*    获取前 subFuncNum-1 个子函数    */
            for(k = 0;k < subFuncNum - 1;k++ )
            {
                strcpy(subFuncName,Info[k].funcname);
                strcat(subFuncName,".c");
                fp_subFunc = fopen(subFuncName,"w+");
                    
                /*      获取公共的头     */
                getcommonhead(fp_src, fp_des,Info);
                for(j = Info[k].uselineno;j < Info[k+1].uselineno;j++)
                {
                    fgets(buffer,MAXNUM,fp_src);
                    
                    fprintf(fp_subFunc,"%s",buffer);        
                }
                fclose(fp_subFunc);   
                    
            }

        /*   获取最后一个子函数    */
            strcpy(subFuncName,Info[subFuncNum - 1].funcname);
            strcat(subFuncName,".c");
            fp_subFunc = fopen(subFuncName,"w+");
            for(n = Info[subFuncNum-1].uselineno;n < SrcLineNum+1;n++)
            {
                fgets(buffer,MAXNUM,fp_src);
                fprintf(fp_subFunc,"%s",buffer);
            }
                fclose(fp_subFunc);
}

int main()
{
    FILE *fp_tags;
    FILE *fp_src;
    FILE *fp_des;
    FUNCINFO Info[USELINENUM];
    if((fp_tags=fopen("tags","r")) == NULL)
    {
        printf("fopen file error.\n");
    }
    if((fp_src=fopen("fuction.c","r")) == NULL)
    {
        printf("fopen src file error.\n");
    }
    if((fp_des = fopen("func.txt","w+")) == NULL)
    {
        printf("fopen des file error.\n");
    }

    /* tags文件函数 读取,截取信息,提取行号*/
     ReadTagsFile(fp_tags,fp_src,fp_des);

   // GetSubfunctionFromSrcFile(fp_src,fp_des,Info);



    if(fclose(fp_tags) != 0)
    {
        printf("close tags file error.\n");
    }
    if(fclose(fp_src) != 0)
    {
        printf("close src file error.\n");
    }
    if(fclose(fp_des) != 0)
    {
        printf("close des file error.\n");
    }

    return 0;
}
-----------------------
#ifndef __ADSC_FILE_H__
#define __ADSC_FILE_H__


typedef struct tagFuncInfo{
    char *funcname;
    char *srcname;
    char *lineno;
    char *flag;
    unsigned int    uselineno;
}FUNCINFO;


//void ReadTagsFile(FILE *fp_tags, FUNCINFO *pFuncInfo);

void  ReadTagsFile(FILE *fp_tags,FILE *fp_src,FILE *fp_des);
void GetSubfunctionFromSrcFile(FILE *fp_src,FILE *fp_des,  FUNCINFO *pInfo);
char* RepladeTabWithSpace(char* buffer);
unsigned int  GetUseLinenum(char* p);
int getSrcLineNum(FILE *fp_src);
void getcommonhead(FILE * fp_src,FILE * fp_des,FUNCINFO *pInfo);


#endif
--------------
传参什么的我也不会
2012-11-29 17:18
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
回复 13楼 lxsjzbd
恩恩  明白你的意思的
这个我懂的
谢谢了
2012-11-29 17:19
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
回复 11楼 zhu224039
需求
1.从tags文件中提取出
Xint1(子函数名)    fuction.c(所属源文件)    105;"(行号)    f(代表是子函数)
2.将字符串转105;" 换为 Int的105
3.读取源文件 有各个子函数的起始行号(如105)
定位各个子函数的起始,结束行号
4.导出所有的子函数,导入到以每个子函数为名的文件中
2012-11-29 17:23
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
回复 11楼 zhu224039
需求
1.从tags文件中提取出
Xint1(子函数名)    fuction.c(所属源文件)    105;"(行号)    f(代表是子函数)
2.将字符串转105;" 换为 Int的105
3.读取源文件 有各个子函数的起始行号(如105)
定位各个子函数的起始,结束行号
4.导出所有的子函数,导入到以每个子函数为名的文件中
2012-11-29 17:24
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
回复 5楼 wp231957
代码上传了,帮忙给点建议
2012-11-30 08:58
daniel_
Rank: 5Rank: 5
等 级:职业侠客
帖 子:212
专家分:307
注 册:2012-11-13
收藏
得分:0 
来个大神给点意见啊
我知道内存和传参做的不好,只是我也不会做啊。
第一次写这样的代码
2012-11-30 09:03
快速回复:坐等大神 解析,引用结构体数组里面的指针变量
数据加载中...
 
   



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

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