C 中的另一个核心转储问题
Another coredump issue in C
当我用
编译我的代码时
g++ -g -o prueba prueba.cpp -lstdc++ -O3 -march=corei7 -mtune=corei7 -std=c++0x
使用 g++ -g prueba.cpp
调试后,我得到了这些:
prueba.cpp:24:6: error: ‘stoi’ is not a member of ‘std’
tm = std::stoi(string2);
^
prueba.cpp:34:7: error: ‘stoi’ is not a member of ‘std’
ler = std::stoi(string1);
^
prueba.cpp:77:8: error: ‘stoi’ is not a member of ‘std’
C[i]=std::stoi(string);
^
我将 stoi
声明为 std::stoi
的方式基于 this example。
坏块是:
//////////////////////////////////////////
if( B != NULL )
{
for(i=0;i<div;i++)
{
a=B[i][0];
b=B[i][1];
std::cout<<a<<"\t"<<b<<"\n";
A[b][a]=A[b][a]+1;
A[a][b]=A[a][b]+1;
}
free(B);
}
//////////////////////////////////////////
这给了我分段错误的问题。但是我看不出问题出在哪里。
文件是:
勒尔 https://app.box.com/s/oi52zw7j8w19txr4cau2pf4w3pzmcelm
REL https://app.box.com/s/bo2xwm2hviucx4jzarxv9ghg11j72goa
TMhttps://app.box.com/s/ofmhsttqujor6di0tm89tiiikm3ou1xj
完整代码为:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main()
{
int a,b,div,value,k,i,j,tm,ler;
char string[256];
char string1[256];
char string2[256];
FILE *TM = fopen("TM","r");
if(TM == NULL)
{
printf("Can't open %s\n","TM");
exit(1);
}
fscanf(TM,"%255s",string2);
tm = std::stoi(string2);
fclose(TM);
FILE *LER = fopen("LER","r");
if(LER == NULL)
{
printf("Can't open %s\n","LER");
exit(1);
}
fscanf(LER,"%255s",string1);
ler = std::stoi(string1);
fclose(LER);
div=ler/2;
int **A;
A = (int **)malloc(tm*sizeof(int*));
for(j=0;j<tm;j++)
{
A[j]=(int*)malloc(tm*sizeof(int));
}
int **B;
B = (int **)malloc(div*sizeof(int*));
for(j=0;j<div;j++)
{
B[j]=(int*)malloc(2*sizeof(int));
}
int *C;
C = (int*) malloc(ler*sizeof(int));
if( A != NULL )
{
for(i=0;i<tm;i++)
{
for(j=0;j<tm;j++)
{
A[i][j]=0;
}
}
}
FILE *stream = fopen("REL","r");
if(stream == NULL)
{
printf("Can't open %s\n","REL");
exit(1);
}
for(i=0;i<ler;i++)
{
fscanf(stream,"%255s",string);
C[i]=std::stoi(string);
}
fclose(stream);
if( C != NULL )
{
k=0;
for(i=0;i<div;i++)
{
for(j=0;j<2;j++)
{
B[i][j]=C[k];
k++;
}
}
free(C);
}
//////////////////////////////////////////
if( B != NULL )
{
for(i=0;i<div;i++)
{
a=B[i][0];
b=B[i][1];
std::cout<<a<<"\t"<<b<<"\n";
A[b][a]=A[b][a]+1;
A[a][b]=A[a][b]+1;
}
free(B);
}
//////////////////////////////////////////
for(i=0;i<tm;i++)
{
for(j=0;j<tm;j++)
{
cout<<A[i][j];
}
cout<<"\n";
}
free(A);
}
我认为您需要检查您的外部接受值(使用 assert
可能是一个开始)就像:
- 正在检查
tm>0
ler>0
C[i]<tm
A[i]!=NULL
B[i]!=NULL
正如评论中提到的那样,它 减少了一个 问题:
在 LER 中,值 应该从 0 到 tm-1
或者在第 88 行使用 B[i][j]=C[k]-1;
当我用
编译我的代码时
g++ -g -o prueba prueba.cpp -lstdc++ -O3 -march=corei7 -mtune=corei7 -std=c++0x
使用 g++ -g prueba.cpp
调试后,我得到了这些:
prueba.cpp:24:6: error: ‘stoi’ is not a member of ‘std’
tm = std::stoi(string2);
^
prueba.cpp:34:7: error: ‘stoi’ is not a member of ‘std’
ler = std::stoi(string1);
^
prueba.cpp:77:8: error: ‘stoi’ is not a member of ‘std’
C[i]=std::stoi(string);
^
我将 stoi
声明为 std::stoi
的方式基于 this example。
坏块是:
//////////////////////////////////////////
if( B != NULL )
{
for(i=0;i<div;i++)
{
a=B[i][0];
b=B[i][1];
std::cout<<a<<"\t"<<b<<"\n";
A[b][a]=A[b][a]+1;
A[a][b]=A[a][b]+1;
}
free(B);
}
//////////////////////////////////////////
这给了我分段错误的问题。但是我看不出问题出在哪里。
文件是:
勒尔 https://app.box.com/s/oi52zw7j8w19txr4cau2pf4w3pzmcelm
REL https://app.box.com/s/bo2xwm2hviucx4jzarxv9ghg11j72goa
TMhttps://app.box.com/s/ofmhsttqujor6di0tm89tiiikm3ou1xj
完整代码为:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
int main()
{
int a,b,div,value,k,i,j,tm,ler;
char string[256];
char string1[256];
char string2[256];
FILE *TM = fopen("TM","r");
if(TM == NULL)
{
printf("Can't open %s\n","TM");
exit(1);
}
fscanf(TM,"%255s",string2);
tm = std::stoi(string2);
fclose(TM);
FILE *LER = fopen("LER","r");
if(LER == NULL)
{
printf("Can't open %s\n","LER");
exit(1);
}
fscanf(LER,"%255s",string1);
ler = std::stoi(string1);
fclose(LER);
div=ler/2;
int **A;
A = (int **)malloc(tm*sizeof(int*));
for(j=0;j<tm;j++)
{
A[j]=(int*)malloc(tm*sizeof(int));
}
int **B;
B = (int **)malloc(div*sizeof(int*));
for(j=0;j<div;j++)
{
B[j]=(int*)malloc(2*sizeof(int));
}
int *C;
C = (int*) malloc(ler*sizeof(int));
if( A != NULL )
{
for(i=0;i<tm;i++)
{
for(j=0;j<tm;j++)
{
A[i][j]=0;
}
}
}
FILE *stream = fopen("REL","r");
if(stream == NULL)
{
printf("Can't open %s\n","REL");
exit(1);
}
for(i=0;i<ler;i++)
{
fscanf(stream,"%255s",string);
C[i]=std::stoi(string);
}
fclose(stream);
if( C != NULL )
{
k=0;
for(i=0;i<div;i++)
{
for(j=0;j<2;j++)
{
B[i][j]=C[k];
k++;
}
}
free(C);
}
//////////////////////////////////////////
if( B != NULL )
{
for(i=0;i<div;i++)
{
a=B[i][0];
b=B[i][1];
std::cout<<a<<"\t"<<b<<"\n";
A[b][a]=A[b][a]+1;
A[a][b]=A[a][b]+1;
}
free(B);
}
//////////////////////////////////////////
for(i=0;i<tm;i++)
{
for(j=0;j<tm;j++)
{
cout<<A[i][j];
}
cout<<"\n";
}
free(A);
}
我认为您需要检查您的外部接受值(使用 assert
可能是一个开始)就像:
- 正在检查
tm>0
ler>0
C[i]<tm
A[i]!=NULL
B[i]!=NULL
正如评论中提到的那样,它 减少了一个 问题:
在 LER 中,值 应该从 0 到 tm-1
或者在第 88 行使用 B[i][j]=C[k]-1;