奇怪的结果:同一段程序在不同编译器上的结果(codeblock,vc6.0和vs2008)
先贴代码,实现的是合并排序,比较简单
/******************************************************************
*使用方法:
*1.输入待排序的数组长度
*2.依次输入数组元素值
*3.无错则输出排序后的数组
*备注:
*1.使用模板技术,数组成员必须支持<,<=运算,否则程序无法正常运行
*2.运行程序时遇到了比较奇怪的地方,无论DEBUG宏是否定义,条件编译
* 语句均会执行
******************************************************************/
#include <iostream>
#include <stdlib.h>//for function exit(int);
#include <stdexcept>
#define DEBUG
using namespace std;
template <typename T>
void merge_sort(T array[],size_t begin_index,size_t end_index,size_t size);
template<typename T>
void merge(T array[],size_t begin_index,size_t middle_index,size_t end_index);
int main()
{
size_t size;
cout<<"please input the size of the array"<<endl;
cin>>size;
int*array;
try
{
array=new int[size];
}catch(const bad_alloc& ba)
{
cerr<<"failed to allocate memory"<<endl;
exit(1) ;
}
size_t index;
cout<<"please input the elements in the array"<<endl;
for(index=0;index!=size;++index)
cin>>array[index];
try
{
merge_sort(array,0,size-1,size);
}catch(const invalid_argument& ia)
{
ia.what();
exit(1);
}catch(const bad_alloc& ba)
{
cerr<<"failed to allocate memory "<<endl;
exit(1);
}
for(index=0;index!=size;++index)
cout<<array[index]<<" ";
delete[]array;
return 0;
}
/****************************************************************************
*函数名:merge_sort
*功能:实现合并排序
*参数:array指向待排序的数组
* bi和ei分别为数组第一个和最后一个元素的下标
* size为数组长度
*返回值:无
**************************************************************************/
template<typename T> void merge_sort(T array[],size_t bi,size_t ei,size_t size)
{
size_t index;
int mi;
if(bi<ei)
{
mi=(bi+ei)/2;
merge_sort(array,bi,mi,mi-bi+1);
merge_sort(array,mi+1,ei,ei-mi);
merge(array,bi,mi,ei);
#ifndef DEBUG
for(index=0;index!=size;++index)
cout<<array[index]<<"\t";
cout<<endl;
#endif
}
}
/**********************************************************************
*函数名:merge
*功能:合并排序的子过程,完成两个已排序数组的合并
*参数:array,bi,ei含义同merge_sort
* mi为前一个数组的末尾元素下标,亦即后一个数组的首个元素下标
*返回值:无
*********************************************************************/
template<typename T> void merge(T array[],size_t bi,size_t mi,size_t ei)
{
int index1,index2;
int size1=mi-bi+1;//第一个数组的长度
int size2=ei-mi;//第二个数组的长度
int bi2=bi;
T* array1=new T[size1+1];
T* array2=new T[size2+1];
for(index1=0;index1!=size1;++index1)
{
array1[index1]=array[bi2++];//因为bi要在后面用到,所以此处创建一个临时对象bi2
#ifndef DEBUG
cout<<array1[index1]<<"\t";
#endif
}
cout<<endl;
for(index2=0;index2!=size2;++index2)
{
array2[index2]=array[++mi];
#ifndef DEBUG
cout<<array2[index2]<<"\t";
#endif
}
cout<<endl;
for(index1=0,index2=0;index1!=size1&&index2!=size2;)
{
if(array1[index1]<array2[index2])
{
array[bi++]=array1[index1++];
}
else
{
array[bi++]=array2[index2++];
}
}
if(index2==size2)
{
while(bi<=ei)
array[bi++]=array1[index1++];
}
else
while (bi<=ei)
array[bi++]=array2[index2++];
//使用下述方法时必须在数组末尾设置一个结束标志,如
//T为整型时,可以设为无穷大
/*index1=0;
index2=0;
while(bi<=ei)
{
if(array1[index1]<array2[index2])
{
array[bi++]=array1[index1++];
if(index1==size1)
}
else
array[bi++]=array2[index2++];
}*/
delete[]array1;
delete[]array2;
}
程序实现合并排序,可是在不同的编译器中运行结果差别很大
在codeblock上面的问题是无论DEBUG宏有没有定义,条件编译那部分的代码都会执行
更奇怪的是在vc6.0上竟然连编译都不过,结果如下:
E:\Program Files\Microsoft Visual Studio\MyProjects\MergeSort\main.cpp(33) : warning C4101: 'ba' : unreferenced local variable
E:\Program Files\Microsoft Visual Studio\MyProjects\MergeSort\main.cpp(50) : warning C4101: 'ba' : unreferenced local variable
E:\Program Files\Microsoft Visual Studio\MyProjects\MergeSort\main.cpp(73) : error C2065: 'bi' : undeclared identifier
E:\Program Files\Microsoft Visual Studio\MyProjects\MergeSort\main.cpp(45) : see reference to function template instantiation 'void __cdecl merge_sort(int [],unsigned int,unsigned int,unsigned int)' being compiled
E:\Program Files\Microsoft Visual Studio\MyProjects\MergeSort\main.cpp(73) : error C2065: 'ei' : undeclared identifier
E:\Program Files\Microsoft Visual Studio\MyProjects\MergeSort\main.cpp(45) : see reference to function template instantiation 'void __cdecl merge_sort(int [],unsigned int,unsigned int,unsigned int)' being compiled
在vs2008上并没有什么奇怪的地方,运行结果正确,只是输入完数组后,结果要隔好几行之后才输出,不知道为什么
高手帮忙给看看啊
另外,程序有什么不妥的地方还请大家指点啊
相关推荐
【工业自动化】欧姆龙PLC产品线与编程软件体系详解:基于西门子工程师视角的选型指导与避坑指南
内容概要:本文详细解析了欧姆龙PLC的产品线、编程软件体系、通信架构及选型策略,重点从西门子工程师视角出发,对比两者的定位差异与技术路径。文章明确指出欧姆龙存在两套不兼容的系统:传统的C系列(CP/CJ/CS)使用CX-Programmer软件和绝对地址编程,适用于单机设备与老线改造;新型Sysmac平台(NJ/NX/NY)采用Sysmac Studio集成开发环境,支持IEC 61131-3标签变量、EtherCAT运动控制和多领域一体化控制,代表当前技术高地。同时梳理了FINS、CompoWay/F、EtherCAT、EtherNet/IP等多层通信协议的区别,并列出从西门子转型易踩的八大误区,提供清晰的选型决策路径。; 适合人群:具备一定工业自动化背景,熟悉西门子PLC体系,正在转向或需要维护欧姆龙系统的工程师,尤其是从事设备选型、系统集成与产线升级的研发和技术人员。; 使用场景及目标:①帮助西门子背景工程师快速建立对欧姆龙双平台的认知框架;②指导正确选用CP/CJ/NJ/NX系列及配套软件;③避免在通信接口、地址体系、软件版本等方面出现典型错误;④实现老旧系统向新平台平滑迁移。; 阅读建议:此资源强调“先框架后细节”,建议读者先掌握三大平台分流和软件对应关系,再深入具体型号参数。特别注意2026年10月新版Sysmac Studio与CX-One对CJ3M系列的双向支持这一关键更新,在实际项目中需严格核对控制器固件与软件版本匹配性,防止因版本不兼容导致无法连接。
地级市到杭州北京深圳的球面距离.-最新出炉zip
一、资源特点 全新力作:今年精心打造,人工细细打磨,品质上乘。 权威精准:数据来源,准确靠谱,值得信赖。 品质无忧:绝无数据造假,品质有保障,放心使用。 二、适用人群 学生:在校专科生、本科生、研究生,助力学业各个环节。 教研人员:大学教师和学术科研工作者,为教学科研添力。 三、适用专业 社科经济:经济学、社会学专业适用。 规划管理:地理学、城市规划,以及商业、工商管理专业皆可使用。 [特别说明]相关资源数据已全部上传至网盘。 由于纯手工分享粘贴链接和提取码,不排除有极少提取码或者链接出现差错(或内容与标题对不上),若遇到这种情况,不要着急,请私信博主,将会第一时间更正补链接!
openeuler配置
openeuler系统环境配置管理
产业园区运营负责人如何提升园区内科技成果引进与落地的匹配效率?.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
CISP-CSE注册云安全工程师备考资源包
CISP-CSE注册云安全工程师备考资源包


