Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 鸡尾酒排序代码SEGFULTS-不确定原因_C++_Sorting_Segmentation Fault - Fatal编程技术网

C++ 鸡尾酒排序代码SEGFULTS-不确定原因

C++ 鸡尾酒排序代码SEGFULTS-不确定原因,c++,sorting,segmentation-fault,C++,Sorting,Segmentation Fault,我编写了一个鸡尾酒排序算法,并通过生成大小为500到10000的随机向量来测试它——每个向量运行10次。在大约2000-3000长度的矢量标记之后,代码将出现故障。我希望它不是测试代码,因为相同的测试用于多个排序算法,并且对于其他所有算法都运行良好。我假设在某个地方我错过了一个结束条件,它试图访问输入数组中不存在的元素。。。但我不完全确定这是否会导致segfault运行 这是代码,我希望有人能发现我的错误。(我也很乐意就如何更好发表任何评论——但请注意,我确实看重这段代码的可读性而不是速度。)

我编写了一个鸡尾酒排序算法,并通过生成大小为500到10000的随机向量来测试它——每个向量运行10次。在大约2000-3000长度的矢量标记之后,代码将出现故障。我希望它不是测试代码,因为相同的测试用于多个排序算法,并且对于其他所有算法都运行良好。我假设在某个地方我错过了一个结束条件,它试图访问输入数组中不存在的元素。。。但我不完全确定这是否会导致segfault运行

这是代码,我希望有人能发现我的错误。(我也很乐意就如何更好发表任何评论——但请注意,我确实看重这段代码的可读性而不是速度。)

void排序::cocktailSort(向量&A){
内部温度;
//要检查的第一个/最后一个索引。这些索引之前/之后的任何内容
//已排序。
int firstIndex=-1;
int lastIndex=A.size()-1;
布尔交换;
做{
第一指数+=1;
交换=假;
for(int i=firstIndex-1;iA[i+1]){
温度=A[i];
A[i]=A[i+1];
A[i+1]=温度;
交换=真;
}
}
如果(!交换)中断;
交换=假;
lastIndex-=1;
对于(int i=lastIndex;i>=firstIndex;i--){
if(A[i]
这不是作业。

如果使用A.at(i)而不是[i],将进行边界检查,并引发超出范围的异常。这可能有助于调试

在我看来,这里的访问

    for(int i = firstIndex-1; i < lastIndex; i++) {
        if(A[i] > A[i+1]) {
for(int i=firstIndex-1;iA[i+1]){
当firstIndex为零时(主循环的第一次迭代),将超出范围。

这可能会对您有所帮助

import java.util.Scanner;

public class CocktailSort {
static Scanner in;

public static void main(String args[]) {
in = new Scanner(System.in);
int[] data = new int[10];
int i, n = 10, c;
System.out.print("\nEnter the data");
for (i = 0; i < 10; i++) {
data[i] = in.nextInt();
}

do {
 // Rightward pass will shift the largest element to its correct
 // place at the end

for (i = 0; i < n - 1; i++) {
if (data[i] > data[i + 1]) {
data[i] = data[i] + data[i + 1];
data[i + 1] = data[i] - data[i + 1];
data[i] = data[i] - data[i + 1];
}
}
n = n - 1;
// Leftward pass will shift the smallest element to its correct
// place at the beginning

for (i = 10 - 1, c = 0; i >= c; i--) {
if (data[i] < data[i - 1]) {
data[i] = data[i] + data[i - 1];
data[i - 1] = data[i] - data[i - 1];
data[i] = data[i] - data[i - 1];
}
}
c = c + 1;
} while (n != 0 && c != 0);
System.out.print("The sorted elements are:");
for (i = 0; i < 10; i++) {
System.out.print(data[i] + "\t");
}
}
}
import java.util.Scanner;
公营凤尾雀{
静态扫描仪;
公共静态void main(字符串参数[]){
in=新扫描仪(System.in);
int[]数据=新的int[10];
int i,n=10,c;
System.out.print(“\n输入数据”);
对于(i=0;i<10;i++){
数据[i]=in.nextInt();
}
做{
//向右传递将最大元素移动到其正确位置
//放在末尾
对于(i=0;i数据[i+1]){
数据[i]=数据[i]+数据[i+1];
数据[i+1]=数据[i]-数据[i+1];
数据[i]=数据[i]-数据[i+1];
}
}
n=n-1;
//向左传递会将最小的元素移动到正确的位置
//开头
对于(i=10-1,c=0;i>=c;i--){
if(数据[i]<数据[i-1]){
数据[i]=数据[i]+数据[i-1];
数据[i-1]=数据[i]-数据[i-1];
数据[i]=数据[i]-数据[i-1];
}
}
c=c+1;
}而(n!=0&&c!=0);
System.out.print(“排序的元素为:”);
对于(i=0;i<10;i++){
系统输出打印(数据[i]+“\t”);
}
}
}

…确实如此。我不知道为什么在初始化时将firstIndex设置为-1而不是0。现在再次运行测试,但这很可能是罪魁祸首。你不知道我检查了多少次,没有发现这个问题XD。刚刚完成了两次测试代码,没有出现错误。Brian,谢谢你非常感谢。我对
at()
想法投了赞成票(这会直接向我指出这一点,因为它
超出了访问尝试的范围),并对查找故障投了一个绿色的勾号。作为一个问题,我假设隔离故障花了这么长时间,因为它访问的内存大部分时间都在执行[-1]操作“实际上是有效的内存吗?然后它最终访问并试图更改一个不允许的内存位?”斯蒂芬可能是这样,也可能是写入
A[i]
在你的程序中重写一部分其他内容,这些内容后来导致其他内容访问不允许的内存地址。更一般地说:如果没有性能问题,最好总是使用
at
,并且只在探查器这么说时才担心性能问题。@Matthieu M.:但是
at
引入了相当多的问题一个性能问题,不是吗?当使用它来调试鸡尾酒排序时,我发现排序速度慢了很多。现在,这可能是偶然的,也许处理器的负载比正常情况下更重,而且它也会引起干扰,但在我看来,直接访问速度要快得多……即使这确实意味着如果你像我一样搞砸了,你会有问题d XD。
import java.util.Scanner;

public class CocktailSort {
static Scanner in;

public static void main(String args[]) {
in = new Scanner(System.in);
int[] data = new int[10];
int i, n = 10, c;
System.out.print("\nEnter the data");
for (i = 0; i < 10; i++) {
data[i] = in.nextInt();
}

do {
 // Rightward pass will shift the largest element to its correct
 // place at the end

for (i = 0; i < n - 1; i++) {
if (data[i] > data[i + 1]) {
data[i] = data[i] + data[i + 1];
data[i + 1] = data[i] - data[i + 1];
data[i] = data[i] - data[i + 1];
}
}
n = n - 1;
// Leftward pass will shift the smallest element to its correct
// place at the beginning

for (i = 10 - 1, c = 0; i >= c; i--) {
if (data[i] < data[i - 1]) {
data[i] = data[i] + data[i - 1];
data[i - 1] = data[i] - data[i - 1];
data[i] = data[i] - data[i - 1];
}
}
c = c + 1;
} while (n != 0 && c != 0);
System.out.print("The sorted elements are:");
for (i = 0; i < 10; i++) {
System.out.print(data[i] + "\t");
}
}
}