Stack.h
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
InitStack.c:
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
Pop.c
#include "Stack.h"
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
Push.c
#include "Stack.h"
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
StackLength.c
#include "Stack.h"
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
各操作示例:
#include "Stack.h"
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
} // conversion
main.c
#include "Stack.h"
int main()
{
conversion(9);
getchar();
return 0;
}
还有些操作函数示例程序里没用到,我就不传了,麻烦大家自己copy下去建个工程试试,我自己运行时的错误提示是:
stack.h(12) : error C2371: 'SqStack' : redefinition; different basic types
stack.h(12) : see declaration of 'SqStack'
等待高手了
35 个解决方案
#1
我们刚开始学习C语言,才学到指针。不懂哦。。。
#2
干嘛这么费劲,把所有的函数都放在一个*.cpp文件下,然后加入工程就行了。
你试试.
你试试.
#3
我知道阿,可我不知道为什么将各文件导入工程就有问题啊
#4
用vc工程也应该能运行,你要保证每个文件都在硬盘上的工程目录里,然后从vc的IDE把这些文件add进来。
#5
这些我肯定知道阿,我编译都通过了,就是运行不了,有时间的话帮我看看吧
#6
实现文件:Stack.cpp
头文件:Stack.h
都放在根目录下,然后将Stack.cpp加进工程里。
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
}
头文件:Stack.h
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endif
都放在根目录下,然后将Stack.cpp加进工程里。
#7
有几个问题:
1.Stack.h里的内容最好这样写:
2.StackEmpty(&S)这个函数没定义;
3.我不知道convert函数是不是和main函数放一起的,因为你帖出来的文件没有convert.c文件。如果是在一起,就是你main.c包含了两个Stack.h,所以定义了两次SqStack,当然就错了。
所以,定义SqStack最好这样,即使包含两次也没问题:
我运行没错了,就是少了StackEmpty函数的定义。
1.Stack.h里的内容最好这样写:
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void Push(SqStack *S,int e) ;
void Pop(SqStack *S, int *e) ;
void InitStack(SqStack *S) ;
int StackLength(SqStack *S) ;
2.StackEmpty(&S)这个函数没定义;
3.我不知道convert函数是不是和main函数放一起的,因为你帖出来的文件没有convert.c文件。如果是在一起,就是你main.c包含了两个Stack.h,所以定义了两次SqStack,当然就错了。
所以,定义SqStack最好这样,即使包含两次也没问题:
#ifndef _STACK
#define _STACK
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endi
我运行没错了,就是少了StackEmpty函数的定义。
#8
在头文件里还应该有几个函数的声明。
#9
楼上的,StackEmpty忘了,呵呵,在这儿
#include "Stack.h"
int StackEmpty(SqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
还有,你确定是加#endi,好像是#endif吧,不过我加了#endif也不行,这下连编译都通不过了,就是这个#endif问题
#include "Stack.h"
int StackEmpty(SqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
还有,你确定是加#endi,好像是#endif吧,不过我加了#endif也不行,这下连编译都通不过了,就是这个#endif问题
#10
Stack.h
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);
#11
main.c
#include "Stack.h"
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
}
int main()
{
int n;
printf("input n:");
scanf("%d",&n);
conversion (n);
getchar();
return 0;
}
#12
是#endif
给我私信,全部的代码。
给我私信,全部的代码。
#13
还有,我用的是.c的文件,不支持很多c++里的语法,我希望各位也能用.c文件,谢谢!
#14
Stack.c
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
int StackEmpty(SqStack *S)
{
if(S->top==S->base)
return 1;
else
return 0;
}
#15
楼上的,我不是要放在同一个文件,我是想建一个工程,导入各函数
#16
lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
//代码放在这里保护起来
#endif
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
//代码放在这里保护起来
#endif
#17
我用了#endif,可是出现了以下编译错误
stack.h(13) : fatal error C1020: unexpected #endif
怎么搞得阿,能不能具体说明一下?
#18
我用了#pragma once,编译通过了,可还是运行不了,问题一样
#19
#endif报错的原因应该是前面没有对应得#ifXXX。lz请仔细看下代码有没有错的地方。
所谓“#pragma once,编译通过了,可还是运行不了”是什么意思?运行时出现了什么问题?
如果真的是运行时错误,那么平心而言,一般是代码本身的问题了。
所谓“#pragma once,编译通过了,可还是运行不了”是什么意思?运行时出现了什么问题?
如果真的是运行时错误,那么平心而言,一般是代码本身的问题了。
#20
我重做了下,用VC++做的了,共7个文件,直接导入的:Stack.h,Initstack.c,StackEmpty.c,StackLength.c,Pop.c,Push.c,main.c:
Stack.h
Initstack.c
StackEmpty.c
StackLength.c
Pop.c
Push.c
main.c
Stack.h
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void InitStack(SqStack *S) ;
int StackEmpty(SqStack *S) ;
int StackLength(SqStack *S) ;
void Pop(SqStack *S, int *e) ;
void Push(SqStack *S,int e) ;
#endif
Initstack.c
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
StackEmpty.c
#include "Stack.h"
int StackEmpty(SqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
StackLength.c
#include "Stack.h"
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
Pop.c
#include "Stack.h"
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
Push.c
#include "Stack.h"
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
main.c
#include "Stack.h"
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
} // conversion
int main()
{
conversion(9);
getchar();
return 0;
}
#21
这个程序应该不存在C和C++之间的问题,因为程序用的都是基本语句.
如果还有错,那就靠楼主自己调试了.
一步一步的调试,在conversion函数里,你可以一个语句一个语句的调试,不要一口气都调试完,这样你总能找到问题语句.
如果还有错,那就靠楼主自己调试了.
一步一步的调试,在conversion函数里,你可以一个语句一个语句的调试,不要一口气都调试完,这样你总能找到问题语句.
#22
20楼的
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示
#23
我晕。。。。lz你怎么这样啊!~
在VS里,负责函数声明和实现的.h和.cpp(或者.c)是一一对应的。对应的判别依据就是 文件名一样!!
lz你不得不把你那些分.c文件的内容都放到stack.c里面去!!
是不是编译时出现“无法解析的外部符号”错误?是的话就是这个问题。
在VS里,负责函数声明和实现的.h和.cpp(或者.c)是一一对应的。对应的判别依据就是 文件名一样!!
lz你不得不把你那些分.c文件的内容都放到stack.c里面去!!
是不是编译时出现“无法解析的外部符号”错误?是的话就是这个问题。
#24
嗯,是VC6.0.
既然说Pop有错,那你就把有Pop的地方注释起来,看看还有什么错误.
一个一个函数来,一条语句一条语句来调试,总会找到问题所在的.
#25
lz。你的工程我用2005编译了,好像编译没问题。。。。
#26
我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样
#27
我不是给你解决了吗?
#28
我看看有没有人能够 在不把各个函数文件放到一起的情况下解决这个问题,呵呵
#29
你是不是想每个函数单独放一个文件里?
如果是这样,你拆分,然后在加进工程里就行了。
#30
同志们,我搞定了
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。 #ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endif
void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);
问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。 #ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endif
void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);
问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!
#31
这个endif有点诡异了啊!
你前面都没有#if的宏定义?
#32
楼上都是牛人 学习啦 帮顶
#33
up
#34
lz有C语言版的,我用过!是一个搞数据结构的硕士写的!
#35
呵呵,代码没排版好,#ifndef在第二行最后,看到了吧
#1
我们刚开始学习C语言,才学到指针。不懂哦。。。
#2
干嘛这么费劲,把所有的函数都放在一个*.cpp文件下,然后加入工程就行了。
你试试.
你试试.
#3
我知道阿,可我不知道为什么将各文件导入工程就有问题啊
#4
用vc工程也应该能运行,你要保证每个文件都在硬盘上的工程目录里,然后从vc的IDE把这些文件add进来。
#5
这些我肯定知道阿,我编译都通过了,就是运行不了,有时间的话帮我看看吧
#6
实现文件:Stack.cpp
头文件:Stack.h
都放在根目录下,然后将Stack.cpp加进工程里。
#include <stdio.h>
#include <stdlib.h>
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
}
头文件:Stack.h
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endif
都放在根目录下,然后将Stack.cpp加进工程里。
#7
有几个问题:
1.Stack.h里的内容最好这样写:
2.StackEmpty(&S)这个函数没定义;
3.我不知道convert函数是不是和main函数放一起的,因为你帖出来的文件没有convert.c文件。如果是在一起,就是你main.c包含了两个Stack.h,所以定义了两次SqStack,当然就错了。
所以,定义SqStack最好这样,即使包含两次也没问题:
我运行没错了,就是少了StackEmpty函数的定义。
1.Stack.h里的内容最好这样写:
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void Push(SqStack *S,int e) ;
void Pop(SqStack *S, int *e) ;
void InitStack(SqStack *S) ;
int StackLength(SqStack *S) ;
2.StackEmpty(&S)这个函数没定义;
3.我不知道convert函数是不是和main函数放一起的,因为你帖出来的文件没有convert.c文件。如果是在一起,就是你main.c包含了两个Stack.h,所以定义了两次SqStack,当然就错了。
所以,定义SqStack最好这样,即使包含两次也没问题:
#ifndef _STACK
#define _STACK
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endi
我运行没错了,就是少了StackEmpty函数的定义。
#8
在头文件里还应该有几个函数的声明。
#9
楼上的,StackEmpty忘了,呵呵,在这儿
#include "Stack.h"
int StackEmpty(SqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
还有,你确定是加#endi,好像是#endif吧,不过我加了#endif也不行,这下连编译都通不过了,就是这个#endif问题
#include "Stack.h"
int StackEmpty(SqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
还有,你确定是加#endi,好像是#endif吧,不过我加了#endif也不行,这下连编译都通不过了,就是这个#endif问题
#10
Stack.h
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);
#11
main.c
#include "Stack.h"
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
}
int main()
{
int n;
printf("input n:");
scanf("%d",&n);
conversion (n);
getchar();
return 0;
}
#12
是#endif
给我私信,全部的代码。
给我私信,全部的代码。
#13
还有,我用的是.c的文件,不支持很多c++里的语法,我希望各位也能用.c文件,谢谢!
#14
Stack.c
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
int StackEmpty(SqStack *S)
{
if(S->top==S->base)
return 1;
else
return 0;
}
#15
楼上的,我不是要放在同一个文件,我是想建一个工程,导入各函数
#16
lz的问题涉及到了VS的编译器工作的问题。
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
//代码放在这里保护起来
#endif
实质就是.h文件重复引用(以工程级的眼光看)。
解决方案如下:
1.VS98(vc6)以及之后版本使用:头文件最开始加 #pragma once
2. .h文件使用一次编译保护宏(系统生成的代码有类似的)
#ifndef XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
#define XXXXXX_SOME_GLOBAL_UNIQUE_STRING_XXXX
//代码放在这里保护起来
#endif
#17
我用了#endif,可是出现了以下编译错误
stack.h(13) : fatal error C1020: unexpected #endif
怎么搞得阿,能不能具体说明一下?
#18
我用了#pragma once,编译通过了,可还是运行不了,问题一样
#19
#endif报错的原因应该是前面没有对应得#ifXXX。lz请仔细看下代码有没有错的地方。
所谓“#pragma once,编译通过了,可还是运行不了”是什么意思?运行时出现了什么问题?
如果真的是运行时错误,那么平心而言,一般是代码本身的问题了。
所谓“#pragma once,编译通过了,可还是运行不了”是什么意思?运行时出现了什么问题?
如果真的是运行时错误,那么平心而言,一般是代码本身的问题了。
#20
我重做了下,用VC++做的了,共7个文件,直接导入的:Stack.h,Initstack.c,StackEmpty.c,StackLength.c,Pop.c,Push.c,main.c:
Stack.h
Initstack.c
StackEmpty.c
StackLength.c
Pop.c
Push.c
main.c
Stack.h
#ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
void InitStack(SqStack *S) ;
int StackEmpty(SqStack *S) ;
int StackLength(SqStack *S) ;
void Pop(SqStack *S, int *e) ;
void Push(SqStack *S,int e) ;
#endif
Initstack.c
#include "Stack.h"
void InitStack(SqStack *S)
{
S->base = (int *)malloc(sizeof(int)*STACK_INIT_SIZE);
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return ;
}
StackEmpty.c
#include "Stack.h"
int StackEmpty(SqStack *S)
{
if(S->top == S->base)
return 1;
else
return 0;
}
StackLength.c
#include "Stack.h"
int StackLength(SqStack *S)
{
int count = 0;
SElemType *p = S->top;
while(p!=S->base)
{
count++;
p--;
}
return count;
}
Pop.c
#include "Stack.h"
void Pop(SqStack *S, int *e)
{
if(S->top == S->base)
{
printf("栈空");
exit(0);
}
*e = * --S->top;
}
Push.c
#include "Stack.h"
void Push(SqStack *S,int e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (int * ) realloc (S->base,(S->stacksize + STACKINCREMENT) * sizeof(int));
if(!S->base)
{
printf("Over Flow");
exit(0);
}
S->top = S->base +S->stacksize;
S->stacksize += STACKINCREMENT;
}
*S->top ++ = e;
}
main.c
#include "Stack.h"
void conversion (int Num)
{ // 算法3.1
// 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数
SElemType e;
SqStack S;
InitStack(&S); // 构造空栈
while (Num)
{
Push(&S, Num % 8);
Num = Num/8;
}
printf("%d\n",StackLength(&S));
while (!StackEmpty(&S))
{
Pop(&S,&e);
printf ("%d", e);
}
printf("\n");
} // conversion
int main()
{
conversion(9);
getchar();
return 0;
}
#21
这个程序应该不存在C和C++之间的问题,因为程序用的都是基本语句.
如果还有错,那就靠楼主自己调试了.
一步一步的调试,在conversion函数里,你可以一个语句一个语句的调试,不要一口气都调试完,这样你总能找到问题语句.
如果还有错,那就靠楼主自己调试了.
一步一步的调试,在conversion函数里,你可以一个语句一个语句的调试,不要一口气都调试完,这样你总能找到问题语句.
#22
20楼的
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示
你的是vc6.0 吗,为什么我按你的写还是出现相同的错误
Pop.obj : error LNK2005: _Pop already defined in ClearStack.obj
StackEmpty.obj : error LNK2005: _StackEmpty already defined in ClearStack.obj
Debug/Stack.exe : fatal error LNK1169: one or more multiply defined symbols found
运行错误,这是错误提示
#23
我晕。。。。lz你怎么这样啊!~
在VS里,负责函数声明和实现的.h和.cpp(或者.c)是一一对应的。对应的判别依据就是 文件名一样!!
lz你不得不把你那些分.c文件的内容都放到stack.c里面去!!
是不是编译时出现“无法解析的外部符号”错误?是的话就是这个问题。
在VS里,负责函数声明和实现的.h和.cpp(或者.c)是一一对应的。对应的判别依据就是 文件名一样!!
lz你不得不把你那些分.c文件的内容都放到stack.c里面去!!
是不是编译时出现“无法解析的外部符号”错误?是的话就是这个问题。
#24
嗯,是VC6.0.
既然说Pop有错,那你就把有Pop的地方注释起来,看看还有什么错误.
一个一个函数来,一条语句一条语句来调试,总会找到问题所在的.
#25
lz。你的工程我用2005编译了,好像编译没问题。。。。
#26
我一开始就说了能编译但不能运行阿,而且不是运行时出错,害我都没办法调试
我也觉得是头文件重复包含了,可不知道怎么解决,以上各位的方法我都试了,都不行,错误还是一样
#27
我不是给你解决了吗?
#28
我看看有没有人能够 在不把各个函数文件放到一起的情况下解决这个问题,呵呵
#29
你是不是想每个函数单独放一个文件里?
如果是这样,你拆分,然后在加进工程里就行了。
#30
同志们,我搞定了
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。 #ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endif
void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);
问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!
只要把#endif写在紧跟结构体的后面就可以了,楼上虽然有人说到了endif,但都是直接加在头文件最后。 #ifndef STACK_H
#define STACK_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;
#endif
void InitStack(SqStack *S);
void Pop(SqStack *S, int *e);
void Push(SqStack *S,int e);
int StackLength(SqStack *S);
int StackEmpty(SqStack *S);
问题就出在头文件的重复包含上,今晚,谢谢各位了,大家的互助精神是最强大的,嘿嘿,谢谢大家花了一个晚上时间帮助我,在此把最后答案贴上,也算对于这么长时间的回报了,嘿嘿,大家一起加油!
#31
这个endif有点诡异了啊!
你前面都没有#if的宏定义?
#32
楼上都是牛人 学习啦 帮顶
#33
up
#34
lz有C语言版的,我用过!是一个搞数据结构的硕士写的!
#35
呵呵,代码没排版好,#ifndef在第二行最后,看到了吧