segmentation fault atoi(argv[2])

Hi ,

I have little bit of knowledge in C++.When I run the following program its gives me segmentation error. I tried to do all the possible things by reading online but not able to figure out the error. I ran it using gdb debugger but still it stays error is somewhere near n=atoi(argv[2]);
I tried to use valgrind but still no use..
but i am not sure. Can somebody please help me in finding the error.

I am using ubuntu. g++ compiler.

my command line arguments are
./output 2 3 abc.pbm 1.2 abc2.pbm 1.3


#include
#include
#include
#include
#include
#include

using namespace std;
#define MAX 90
#define Lwire 2 // length of the wire 2mm -- all values are for 130nm technology
#define Nwire 128 // Number of wires 128
#define Llink 0.5 // average link load .5
#define powerleakage 2032.8 // leakage power 2032.8nw
#define V 1 BIG_DYN[y] // voltage= 1V
#define Ibias 1 // Ibias=1nA
#define K1 0.39
#define K2 .12
#define POP_SIZE 50
#define R_CO .33
#define R_MUT .1


int pbm[MAX][MAX][MAX],pgm[MAX][MAX],dist[MAX][MAX]={0};
int a=0,b=0,nodes,arg;
//int m,n;
double TotalDynEnergy=0,minTotalDynEnergy=0;
char head[4],head1[4];
int maxd;
// int layoutnumber=0;
// int layoutminTotalDynEnergy;

/**** Dynamic Energy for each communication pattern ****/

double energy( void)
{ int i,j,d;
double powerdyn,powershtckt,powertotal,energy=0;

maxd=0;
powerdyn= ( K1 +( K2 * Lwire))* Nwire * Llink;// Dynamic power equation
// printf("
power dyn %f ",powerdyn);
//powershtckt=V*Ibias;
// powertotal=sumlinks*(powerdyn+powerleakage+powershtckt);
// printf("
%f
",powertotal);

for(j=0;j maxd)
maxd=d; // max distance in the layout
if (d!=0)
{// Dynamic Energy for each entry in comm pattern
energy= energy+(0.37*d)+(powerdyn*(d-1)); // printf("
energy %f",energy);
}
}
}
// printf("
Dynamic energy for this pattern is %f
",energy);
// printf("pattmaxd %d ",maxd);
return(energy);
}

/**** Load Communication paterns ****/

void loadpatterns(int argc,char **argv,int index)
{ FILE *pbmread;
int i,j;


pbmread = fopen (argv[arg],"r"); // open communication pattern file
/* if (!pbmread)
printf("
Cannot open the Communication Pattern file ");
else
printf("
Communication Pattern with weight %s",argv[arg+1]);*/

fscanf(pbmread,"%s
%d %d
",head,&a,&b); //printf("
%s
%d %d
",head,a,b);

for (j=0;j<b;j++)
{ for(i=0;i< a;i++)
{ fscanf(pbmread,"%d",&pbm[index][j][i]); // printf("%d ",pbm[index][j][i]);
}
//printf("
");
}
fclose(pbmread);
}


/**** Distance Matrix and Total Dynamic Energy ****/

void groute(int argc,char **argv)
{
int x1,y1,x2,y2,k,l;
int index;
double DynEnergy;
float weight;
int distance;
int i,j;

for (arg=3,index=0;arg<argc;arg+=2,index++)
{
weight=atof(argv[arg+1]);
loadpatterns(argc,argv,index); // FUNCTION Load Communication Pattern

for (j=0;j<b;j++)
for (i=0;i<a;i++)
{ if (pbm[index][j][i]!=0)
{for (l=0;l<m;l++)
for (k=0;k<n;k++)
{ if (pgm[l][k] == i)
{ x1=l;y1=k;}
if (pgm[l][k]==j)
{ x2=l;y2=k;}
}
distance=(abs(y2-y1)+abs(x2-x1));// 'x+y'or manhattan distance between nodes for pbm[i][j]!=0
dist[j][i]=distance; // Distance matrix
}
if (pbm[index][j][i]==0)
{dist[j][i]=0;}
}
/*printf("
weight %f ",weight);
printf("

Distance Matrix
");
for ( j=0;j<b;j++)
{ for ( i=0;i<a;i++)
printf("%d ",dist[j][i]);
printf("
");
}*/
DynEnergy= energy(); // FUNCTION Dynamic energy for the pattern
TotalDynEnergy=TotalDynEnergy+DynEnergy;//Total Dynamic Energy for all patterns
}

}



int main(int argc,char *argv[])
{
int N_CO,N_MUT;

int dim;
//m=2; n=3;
// int ext1,ext2;
//printf(" %d %s %s %s",argc,argv[1],argv[2],argv[3],argv[4]);
int q;
printf("break1
");
m=atoi(argv[1]);
n=atoi(argv[2]); // mxn layout
printf("
%d %d",m ,n );
dim=m*n;
int x[dim];
int POP[POP_SIZE][dim];
float POP_DYN[POP_SIZE];
int i,j,k,l;
int first,second;
// int* ptr_co;
int t1[i];
float t;
int gen;
int MAX_Gen=10;
int layoutnumber=0;

for ( i=0;i<dim;i++)
x[i]=i;
q=n;
printf(" q is %d",q);

/**** Initial pop ***/
do { printf("enter loop");

for(i=0;i<dim;i++)
POP[layoutnumber][i]=x[i];
printf("layout break1");

l=0;k=0;
for(i=0;i<dim;i++)
{if (l==q)
{k=k+1;l=0;}
pgm[k][l]=x[i]; // layout of the nodes
l++;
}
printf("node break/n");
// groute(argc,argv);
// Dynamic Energy array
POP_DYN[layoutnumber]=TotalDynEnergy;

layoutnumber++;
TotalDynEnergy=0;
pskreddy
}while((next_permutation(x,x+dim)) /*&& ( layoutnumber < POP_SIZE)*/);
}


when i run gdb it gives


#0 0xb7d3ed6c in __strtouq_internal () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7d3eaff in __strtol_internal () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7d3c166 in atoi () from /lib/tls/i686/cmov/libc.so.6
#3 0x08048b26 in main (argc=2, argv=0xbfb64324) at groute.cpp:140
(gdb) up 3
#3 0x08048b26 in main (argc=2, argv=0xbfb64324) at groute.cpp:140
140 n=atoi(argv[2]); // mxn layout

It giving error for n but not m.. i dont know y

I appreciate any help

pskr

Comments

  • Please use code tags to preserve the indention and I'm sure you'll get more responses.
    Example:

    [leftbr]code[rightbr]
    printf("Hello world");
    [leftbr]/code[rightbr]
  • I agree with Lundin that you should use code tags, but one can easily guess the problem:

    argv[2] is out of range when argc equals 2. C/C++ is zero based, so if the argc equals two, one can only safely access argv[0] and argv[1].

    See ya,
    bilderbikkel
Sign In or Register to comment.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories