| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1415 人关注过本帖
标题:谁能帮我把这警告去掉?
只看楼主 加入收藏
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
结帖率:97.78%
收藏
已结贴  问题点数:10 回复次数:12 
谁能帮我把这警告去掉?
谁能帮我把这警告去掉?
 现在学数据结构,, 想写一个计算器,, 于是我就开始写...
但是才下手就发现有一个去不掉的警告....
三个文件: stack.h input.h cal.c

stack.h:
程序代码:
#include <stdio.h>
#include <stdlib.h>

#ifndef _STACK_H__
#define _STACK_H__

#define _STACK_INIT_SIZE_ 100
#define _STACK_PUSH_SIZE_ 10

typedef int elem;
typedef struct stack{
    void *base;
    void *top;
    int stacksize;
}Stack;


static inline void alloc_err(void)
{
    fputs("Malloc Err\n", stderr);
    exit(-1);
}

static inline int re_malloc(Stack *S, int size)
{
    void *tmp;
    tmp = realloc(S->base, size *
            (S->stacksize + _STACK_PUSH_SIZE_));
    if(tmp == NULL){
        alloc_err();
    }
    S->base = tmp;
    S->top = S->base + S->stacksize;
    S->stacksize += _STACK_PUSH_SIZE_;
    return 1;
}

#define stack_init(S, type) do{\
    type *tmp;\
    tmp = malloc(sizeof(type) * _STACK_INIT_SIZE_); \
    if(tmp == NULL){ \
        alloc_err(); \
    } \
    S->base = S->top = tmp; \
    S->stacksize = _STACK_INIT_SIZE_; \
}while(0);

int inline stack_isempty(Stack *S)
{
    return S->base == S->top ? 1 : 0;
}
//检查是否为空栈, 即base == top

#define stack_gettop(S, type) do{ \
    return *((type *)S->top); \
}while(0);
//获取栈顶元素

#define stack_push(S, type, push) do{ \
    if(((type *)S->top) - ((type *)S->base) == S->stacksize){ \
        re_malloc(S, sizeof(type)); \
    } \
    *((type *)S->top)++ = push; \
}while(0);
//将元素插入栈中

#define stack_pop(S, type, pop) do{\
    if(pop == NULL){ \
        --((type *)S->top); \
    } \
    *pop = *(--((type *)S->top)); \
}while(0);
//出栈,,

//返回栈的长度
#define stack_lenth(S, type) do{\
    return ((type)S->top) - ((type)S->base);\
}while(0);

//清空栈
void inline stack_clean(Stack *S)
{
    S->top = S->base;
}

void inline stack_destory(Stack *S)
{
    free(S->base);
}

#endif


input.h
程序代码:
#include <stdio.h>

#ifndef _INPUT_H_
#define _INPUT_H_

typedef void *input_t;

#define input_init(input_t) do{;}while(0);

inline char input_getchar(void *input)
{
    return getchar();
}

#endif



cal.c
程序代码:
#include "input.h"
#include "stack.h"

void cal(void);

int main(void)
{
    while(1){
        cal();
    }
    return 0;
}

void cal(void)
{
    Stack num, cha;
    input_t input;
    char ch;
    input_init(input);    /*初始化各个结构*/
    stack_init((&num), int);
    stack_init((&cha), char);
    stack_push((&cha), char, '#');    /*将结束的符号压入符号栈*/
    ch = input_getchar(input);    /*获取用户输入的字符*/
}


具体的警告是:
22 [Warning] use of cast expressions as lvalues is deprecated
搜索更多相关主题的帖子: 警告 
2010-02-09 15:53
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
还有一个问题, 就是在调用stack相关的函数(或者是宏吧)时, 为什么要(&stack) 而不能直接&satck
就是说比如:
Stack S;
stack_init(&S);
这样的在我这里会发生错误,, 无法编译成功..

stack_init((&S)); 就能够编译成功..
为什么?

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2010-02-09 16:11
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:10 
找你师傅问一下.
2010-02-09 16:17
CodeWays
Rank: 2
等 级:论坛游民
帖 子:62
专家分:61
注 册:2010-2-7
收藏
得分:0 
发现差距越来越大了...

胖胖的我~
2010-02-10 13:44
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
回复 4楼 CodeWays
... 只吸收了Linux内核情景分析中内核使用的链表的构造加上数据结构的堆栈...
至于这么夸张吗?

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2010-02-10 15:30
CodeWays
Rank: 2
等 级:论坛游民
帖 子:62
专家分:61
注 册:2010-2-7
收藏
得分:0 
别忘了...我和你有两本书的距离...还是很厚的书...

胖胖的我~
2010-02-10 21:00
CodeWays
Rank: 2
等 级:论坛游民
帖 子:62
专家分:61
注 册:2010-2-7
收藏
得分:0 
上下QQ??有点事

胖胖的我~
2010-02-10 21:03
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
回复 7楼 CodeWays
?? 早点说,,, 论坛上不适合聊天~~ 呵呵,

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2010-02-10 21:13
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
回复 楼主 zqy110007
把stack.h的stack_push部分改成下面
#define stack_push(S, type, push) do{ \
    if(((type *)S->top) - ((type *)S->base) == S->stacksize){ \
        re_malloc(S, sizeof(type)); \
    } \
    char * tmp; \
    tmp = ((type *)S->top); \
    *tmp++ = push; \
    S->top = (void *)tmp; \
}while(0);

身体是玩命的本钱
2010-02-11 00:16
zhddragon
Rank: 5Rank: 5
等 级:职业侠客
帖 子:208
专家分:346
注 册:2009-5-14
收藏
得分:0 
以下是引用zqy110007在2010-2-9 16:11:06的发言:

还有一个问题, 就是在调用stack相关的函数(或者是宏吧)时, 为什么要(&stack) 而不能直接&satck
就是说比如:
Stack S;
stack_init(&S);
这样的在我这里会发生错误,, 无法编译成功..

stack_init((&S)); 就能够编译成 ...

#define stack_init(S, type) do{\
    type *tmp;\
    tmp = malloc(sizeof(type) * _STACK_INIT_SIZE_); \
    if(tmp == NULL){ \
        alloc_err(); \
    } \
    S->base = S->top = tmp; \
    S->stacksize = _STACK_INIT_SIZE_; \
}while(0);
中如果使用stack_init(&S,char)那么S->base = S->top = tmp;会变成&S->base = &S->top = tmp;
->优先级高于&,那么会相当于执行  &(S->base) = &(S->top) = tmp;对非对象指针使用->会出错

身体是玩命的本钱
2010-02-11 00:23
快速回复:谁能帮我把这警告去掉?
数据加载中...
 
   



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

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