为何在WIN-TC 下编译提示 说明语法错误在VC++却正常编译

时间:2021-03-13 03:35:54
 #include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int *Triplet;
typedef int ElemType;
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)
{
 T=(int *)malloc(3*sizeof(int));
 if(!T) 
  exit(OVERFLOW);
 T[0]=v1;
 T[1]=v2;
 T[2]=v3;
 return OK;
}
Status Get(Triplet T,ElemType i,ElemType e)
{
 if(i<1||i>3) 
  return ERROR;
 e=T[i-1];
 return e;
}
Status Put(Triplet &T,ElemType i,ElemType e)
{
 if(i<1||i>3) 
  return ERROR;
 T[i-1]=e;
 return T[i-1];
}
void IsAscending(Triplet T)
{
 if(T[0]<=T[1]&&T[1]<=T[2]) 
     printf("是升序!\n");
 else
  printf("不是升序!\n");
}
void IsDescending(Triplet T)
{
 if(T[0]>=T[1]&&T[1]>=T[2])
  printf("是降序!\n");
 else
  printf("不是降序!\n");
}
Status Max(Triplet T,ElemType &e)
{
 e=(T[0]>=T[1])?((T[0]>=T[2])?T[0]:T[2]):((T[1]>=T[2])?T[1]:T[2]);
 return e;
}
Status Min(Triplet T,ElemType &e)
{
 e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]):((T[1]<=T[2])?T[1]:T[2]);
 return e;
}
void main()
{
 ElemType v1,v2,v3,i,e1,e2,e3,e4;
 
 Triplet T=NULL; 

 e1=e3=e4=0;

 printf("请输入v1,v2,v3的值:\n");

 scanf("%d %d %d",&v1,&v2,&v3);
 
 printf("请输入i,e2的值:\n");

 scanf("%d %d",&i,&e2);
 
 InitTriplet(T,v1,v2,v3);
 printf("a\n");
 
 printf("T的第i元的值是:%d\n",Get(T,i,e1));
 
 printf("T的第i元的值被换为e2:%d\n",Put(T,i,e2));
 
 IsAscending(T);
 
 IsDescending(T);
 
 printf("T的最大元素的值是:%d\n",Max(T,e3));
 
 printf("T的最小元素的值是:%d\n",Min(T,e4));

 getchar();

 getchar();

}




以上程序是《数据结构》一书上的三元组例题,我一模一样的写了下来在WIN-TC上编译却提示几个函数的参数说明语法错误,结果我把函数的参数的取地址符号&去掉后错误提示就没有了(如函数Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)中的Triplet &T ),可是去掉取地址符号&后的程序就不符合函数要求了。。。。而且问题还有就是为什么一模一样的函数在VC++却能顺利的编译了出来。。。。。
小弟真的好郁闷,上网查也没这种错误的详细讲解,希望大家能帮手解决下!!!!!

19 个解决方案

#1


珍惜生命,远离那个岁数比你还大的tc吧。

#2


计算机是1946年发明的,现在大家都在研究!!!!请说说我的问题吧!!

#3


引用 2 楼 kooyou 的回复:
计算机是1946年发明的,现在大家都在研究!!!!请说说我的问题吧!!

你的问题在于:老编译器对标准的支持度不够。
所以是编译器的问题。

换个编译器吧。
比如换这个: http://topic.csdn.net/u/20100903/23/b0e105ee-4551-4531-8717-8357fffbfc09.html

#4


顺便问个问题 如果 
typedef int *Triplet 
那么
Triplet &T 
是什么意思,是表示T是一个指针么?
那么 只是 int &T 又是什么意思?

#5


应该是typedef int* Triplet吧
那就是int的指针类型。
&符号为c++中的引用符,可用指针代替
int &T 表示引用实参,而不是重新卫星餐分配空间。
over

#6


C里面好像没有引用这个概念吧,引用是C++才提出来的东西
引用 5 楼 zhongcongwujiang 的回复:
应该是typedef int* Triplet吧
那就是int的指针类型。
&amp;符号为c++中的引用符,可用指针代替
int &amp;T 表示引用实参,而不是重新卫星餐分配空间。
over

#7


Win-TC是C编译器,VC++是C++编译器

#8


引用 2 楼 kooyou 的回复:
计算机是1946年发明的,现在大家都在研究!!!!请说说我的问题吧!!

你在用1946年的计算机 ?

#9


win-tc老了,vc++支持的东西多,所以不报错。不过还是没有一个像java eclipse这样不用安装的开发环境

#10


看到这里我就郁闷了,我看的是《数据结构  C语言版》 怎么就出来了C++的语法,这不是作弄人吗?怎么老师又不说,最郁闷的就是问老师什么原因,他竟然说我编错了吧,TMD我是和课本上的一模一样!!!!!

#11


老师才不管呢。。。。他又不会挨个试一遍。。。。书估计也是作者的研究生执笔的呢。。。。

引用 10 楼 kooyou 的回复:
看到这里我就郁闷了,我看的是《数据结构 C语言版》 怎么就出来了C++的语法,这不是作弄人吗?怎么老师又不说,最郁闷的就是问老师什么原因,他竟然说我编错了吧,TMD我是和课本上的一模一样!!!!!

#12


凡是编译器的问题,除非很懂的,一般都说不明白,应该还是兼容性的问题

#13


引用 10 楼 kooyou 的回复:
看到这里我就郁闷了,我看的是《数据结构 C语言版》 怎么就出来了C++的语法,这不是作弄人吗?怎么老师又不说,最郁闷的就是问老师什么原因,他竟然说我编错了吧,TMD我是和课本上的一模一样!!!!!

严蔚敏的书上是伪码! 她用 &,是表示,在函数内部可能会对该变量造成修改!你在编程的时候,要用 指针符 *

#14


 那不是取地址符号,是引用。tc不支持吧

#15


是引用!!说起伪码,我就觉得好烦。。。对伪码的无从入手已经不是我一个人的烦恼了,大家都抱怨书本上的伪码不好理解,一模一样的代码在不同的编译器不一定可以运行,好像WINT-TC这样的C语言编译器在我们新生中是比较普及,可是很多时候书本上的代码并不能编译成功。而其中的原因有时候竟然是因为伪码是C++的。又或者是要用别的编译器才可以编译,其中的原因对一个初学者来说简直就是折磨!很多人学《数据结构 C语言版》的,最多看的不是课本,听得最多也不是老师,而是要看百度知道,看网上的教程,很多时间就这样纠结在一个无语的问题--代码中有C++的代码,C编译器不能编译。。。。。。。。。。。

#16


那不是"取址符号",那是"引用符号",这个符号只在C++有,如果你写C语言程序,本来你的语法就不合法。我估计你根本没有理解数据结构,只是在抄代码而已
引用楼主 kooyou 的回复:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int *Triplet;
typedef int ElemType;
Status InitTriplet(Triplet &amp;T,ElemTy……

#17


1. TC不是在新生中普及,只有一些学校还用15年前就被淘汰的编译器
2。 伪代码是非常正确的教学方法,给你一个能在特定编译器编译通过的代码,只能让一些学生懒得思考,直接抄代码。楼主遇到这种问题时,应该问问自己,你的C语言过关么?
引用 15 楼 kooyou 的回复:
是引用!!说起伪码,我就觉得好烦。。。对伪码的无从入手已经不是我一个人的烦恼了,大家都抱怨书本上的伪码不好理解,一模一样的代码在不同的编译器不一定可以运行,好像WINT-TC这样的C语言编译器在我们新生中是比较普及,可是很多时候书本上的代码并不能编译成功。而其中的原因有时候竟然是因为伪码是C++的。又或者是要用别的编译器才可以编译,其中的原因对一个初学者来说简直就是折磨!很多人学《数据结构 C语言……

#18


顶阿荣

#19


说的太对了!!!!
引用 15 楼 kooyou 的回复:
是引用!!说起伪码,我就觉得好烦。。。对伪码的无从入手已经不是我一个人的烦恼了,大家都抱怨书本上的伪码不好理解,一模一样的代码在不同的编译器不一定可以运行,好像WINT-TC这样的C语言编译器在我们新生中是比较普及,可是很多时候书本上的代码并不能编译成功。而其中的原因有时候竟然是因为伪码是C++的。又或者是要用别的编译器才可以编译,其中的原因对一个初学者来说简直就是折磨!很多人学《数据结构 C语言……

#1


珍惜生命,远离那个岁数比你还大的tc吧。

#2


计算机是1946年发明的,现在大家都在研究!!!!请说说我的问题吧!!

#3


引用 2 楼 kooyou 的回复:
计算机是1946年发明的,现在大家都在研究!!!!请说说我的问题吧!!

你的问题在于:老编译器对标准的支持度不够。
所以是编译器的问题。

换个编译器吧。
比如换这个: http://topic.csdn.net/u/20100903/23/b0e105ee-4551-4531-8717-8357fffbfc09.html

#4


顺便问个问题 如果 
typedef int *Triplet 
那么
Triplet &T 
是什么意思,是表示T是一个指针么?
那么 只是 int &T 又是什么意思?

#5


应该是typedef int* Triplet吧
那就是int的指针类型。
&符号为c++中的引用符,可用指针代替
int &T 表示引用实参,而不是重新卫星餐分配空间。
over

#6


C里面好像没有引用这个概念吧,引用是C++才提出来的东西
引用 5 楼 zhongcongwujiang 的回复:
应该是typedef int* Triplet吧
那就是int的指针类型。
&amp;符号为c++中的引用符,可用指针代替
int &amp;T 表示引用实参,而不是重新卫星餐分配空间。
over

#7


Win-TC是C编译器,VC++是C++编译器

#8


引用 2 楼 kooyou 的回复:
计算机是1946年发明的,现在大家都在研究!!!!请说说我的问题吧!!

你在用1946年的计算机 ?

#9


win-tc老了,vc++支持的东西多,所以不报错。不过还是没有一个像java eclipse这样不用安装的开发环境

#10


看到这里我就郁闷了,我看的是《数据结构  C语言版》 怎么就出来了C++的语法,这不是作弄人吗?怎么老师又不说,最郁闷的就是问老师什么原因,他竟然说我编错了吧,TMD我是和课本上的一模一样!!!!!

#11


老师才不管呢。。。。他又不会挨个试一遍。。。。书估计也是作者的研究生执笔的呢。。。。

引用 10 楼 kooyou 的回复:
看到这里我就郁闷了,我看的是《数据结构 C语言版》 怎么就出来了C++的语法,这不是作弄人吗?怎么老师又不说,最郁闷的就是问老师什么原因,他竟然说我编错了吧,TMD我是和课本上的一模一样!!!!!

#12


凡是编译器的问题,除非很懂的,一般都说不明白,应该还是兼容性的问题

#13


引用 10 楼 kooyou 的回复:
看到这里我就郁闷了,我看的是《数据结构 C语言版》 怎么就出来了C++的语法,这不是作弄人吗?怎么老师又不说,最郁闷的就是问老师什么原因,他竟然说我编错了吧,TMD我是和课本上的一模一样!!!!!

严蔚敏的书上是伪码! 她用 &,是表示,在函数内部可能会对该变量造成修改!你在编程的时候,要用 指针符 *

#14


 那不是取地址符号,是引用。tc不支持吧

#15


是引用!!说起伪码,我就觉得好烦。。。对伪码的无从入手已经不是我一个人的烦恼了,大家都抱怨书本上的伪码不好理解,一模一样的代码在不同的编译器不一定可以运行,好像WINT-TC这样的C语言编译器在我们新生中是比较普及,可是很多时候书本上的代码并不能编译成功。而其中的原因有时候竟然是因为伪码是C++的。又或者是要用别的编译器才可以编译,其中的原因对一个初学者来说简直就是折磨!很多人学《数据结构 C语言版》的,最多看的不是课本,听得最多也不是老师,而是要看百度知道,看网上的教程,很多时间就这样纠结在一个无语的问题--代码中有C++的代码,C编译器不能编译。。。。。。。。。。。

#16


那不是"取址符号",那是"引用符号",这个符号只在C++有,如果你写C语言程序,本来你的语法就不合法。我估计你根本没有理解数据结构,只是在抄代码而已
引用楼主 kooyou 的回复:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int *Triplet;
typedef int ElemType;
Status InitTriplet(Triplet &amp;T,ElemTy……

#17


1. TC不是在新生中普及,只有一些学校还用15年前就被淘汰的编译器
2。 伪代码是非常正确的教学方法,给你一个能在特定编译器编译通过的代码,只能让一些学生懒得思考,直接抄代码。楼主遇到这种问题时,应该问问自己,你的C语言过关么?
引用 15 楼 kooyou 的回复:
是引用!!说起伪码,我就觉得好烦。。。对伪码的无从入手已经不是我一个人的烦恼了,大家都抱怨书本上的伪码不好理解,一模一样的代码在不同的编译器不一定可以运行,好像WINT-TC这样的C语言编译器在我们新生中是比较普及,可是很多时候书本上的代码并不能编译成功。而其中的原因有时候竟然是因为伪码是C++的。又或者是要用别的编译器才可以编译,其中的原因对一个初学者来说简直就是折磨!很多人学《数据结构 C语言……

#18


顶阿荣

#19


说的太对了!!!!
引用 15 楼 kooyou 的回复:
是引用!!说起伪码,我就觉得好烦。。。对伪码的无从入手已经不是我一个人的烦恼了,大家都抱怨书本上的伪码不好理解,一模一样的代码在不同的编译器不一定可以运行,好像WINT-TC这样的C语言编译器在我们新生中是比较普及,可是很多时候书本上的代码并不能编译成功。而其中的原因有时候竟然是因为伪码是C++的。又或者是要用别的编译器才可以编译,其中的原因对一个初学者来说简直就是折磨!很多人学《数据结构 C语言……

#20