Is this command line wrong? FILE *TM = fopen("TM","r");
When I compile my code with: g++ -O3 -march=corei7 -mtune=corei7 -std=c++11 prueba3.cpp -o prueba3 -lstdc++
or g++ -O3 -march=corei7 -mtune=corei7 -std=c++0x prueba3.cpp -o prueba3 -lstdc++
and then run the executable, I got:
Segmentation fault (core dumped)
When I debug the code with dbg I got the following result:
Reading symbols from ./a.out...done.
(gdb) b main
Breakpoint 1 at 0x400e59: file prueba3.cpp, line 10.
(gdb) r
Starting program: /home/alejo/Desktop/CM/a.out
Breakpoint 1, main () at prueba3.cpp:10
10 {
(gdb) s
19 FILE *TM = fopen("TM","r");
(gdb) c
Continuing.
2053 2618
2618 3223
3223 3431
Program received signal SIGSEGV, Segmentation fault.
0x000000000040138e in main () at prueba3.cpp:98
98 A[b][a]=A[b][a]+1;
(gdb) q
A debugging session is active.
Inferior 1 [process 3977] will be killed.
Quit anyway? (y or n) y
But, still, I don't understand how to apply it on my code, which is:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a,b,i,j,div,tm,ler;
char string0[256],string1[256],string2[256];
///////////
// Load files:
// TM = size of the sqaure matrix
// REL = List of numbers
// LER = How many numbers are in REL
///////////
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 *REL = fopen("REL","r");
if(REL == NULL)
{
printf("Can't open %s\n","REL");
exit(1);
}
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;
///////////
// Allocate matrices
///////////
int **A;
A = (int **)malloc(tm*sizeof(int*));
for(i=0;i<tm;i++)
{
A[i]=(int*)malloc(tm*sizeof(int));
}
int *B;
B = (int*) malloc(ler*sizeof(int));
///////////
// Set zero all elementes of allocated matrices
///////////
if( A != NULL )
{
for(i=0;i<tm;i++)
{
for(j=0;j<tm;j++)
{
A[i][j]=0;
}
}
}
if( B != NULL )
{
for(i=0;i<ler;i++)
{
B[i]=0;
}
}
///////////
// Put the LER numbers of REL in B[i]
// with converting number-string to number-int
///////////
for(i=0;i<ler;i++)
{
fscanf(REL,"%255s",string0);
B[i]=std::stoi(string0);
}
fclose(REL);
///////////
// Reocate numbers of C[i] in A[i][j]
///////////
for(i=0;i<div;i+=2)
{
a=B[i]-1;
b=B[i+1]-1;
std::cout<<a<<"\t"<<b<<"\n";
A[b][a]=A[b][a]+1;
A[a][b]=A[a][b]+1;
}
free(B);
///////////
// Print A[][]
///////////
for(i=0;i<tm;i++)
{
for(j=0;j<tm;j++)
{
cout<<A[i][j];
}
cout<<"\n";
}
free(A);
}
What am I doing wrong?
Just in case, the files are:
REL:
2054
2619
2619
3224
3224
3432
194
2619
2619
3224
3224
3432
448
LER
30846
TM
3434
As you've indicated yourself, the size of
A
(tm
) is 3371 x 3371. The file REL.txt contains numbers like3383
(line 138 in the file) which are larger than the dimensions ofA
. This makes you reach out of bounds in this part, as indicated by the debugger:You don't need to verify this manually though, you can implement it: