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 suing gdb debugger but still it stays error is somewhere near n=atoi(argv[2]);
but i am not sure. Can somebdy please help me in finding the error.

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <time.h>

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("\n power dyn %f \t",powerdyn);
        //powershtckt=V*Ibias;
        // powertotal=sumlinks*(powerdyn+powerleakage+powershtckt);
       // printf("\n %f\n ",powertotal);

          for(j=0;j<b;j++)
          { for (i=0;i<a;i++)
            { 
              d=dist[j][i];    // printf("\n value of d   %d\t",d);		
             if(d > 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("\n energy %f",energy);
             } 	    
            }
           }
      //  printf("\n Dynamic energy for this pattern  is  %f \n",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("\n Cannot open the Communication Pattern file ");
       else
           printf("\nCommunication Pattern with weight %s",argv[arg+1]);*/ 

      fscanf(pbmread,"%s\n%d %d\n",head,&a,&b);  //printf("\n%s\n%d  %d\n",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("\n");
        } 
   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("\nweight  %f ",weight);
               printf("\n\nDistance Matrix\n");
               for ( j=0;j<b;j++)
               { for ( i=0;i<a;i++)
                 printf("%d  ",dist[j][i]);
                 printf("\n");
                }*/
  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\n");
  m=atoi(argv[1]);
 n=atoi(argv[2]); // mxn layout
 printf("\n %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 0xb7d9bd6c in __strtouq_internal () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7d9baff in __strtol_internal () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7d99166 in atoi () from /lib/tls/i686/cmov/libc.so.6
#3 0x08048b26 in main (argc=2, argv=0xbf8c2ac4) at groute.cpp:139
(gdb) up 3
#3 0x08048b26 in main (argc=2, argv=0xbf8c2ac4) at groute.cpp:139
139 m=atoi(argv[1]);n=atoi(argv[2]); // mxn layout
Current language: auto; currently c++


I appreciate any help

pskr

Your compiler should have given you a bunch of compile errors. Here is the list I got with VC++ 2005 Express (yes I know you are using *nix but your compiler should have given you similar errors).

d:\dvlp\test2\test2\test2.cpp(110) : error C2065: 'm' : undeclared identifier
d:\dvlp\test2\test2\test2.cpp(111) : error C2065: 'n' : undeclared identifier
d:\dvlp\test2\test2\test2.cpp(152) : error C2057: expected constant expression
d:\dvlp\test2\test2\test2.cpp(152) : error C2466: cannot allocate an array of constant size 0
d:\dvlp\test2\test2\test2.cpp(152) : error C2133: 'x' : unknown size
d:\dvlp\test2\test2\test2.cpp(153) : error C2057: expected constant expression
d:\dvlp\test2\test2\test2.cpp(153) : error C2466: cannot allocate an array of constant size 0
d:\dvlp\test2\test2\test2.cpp(153) : error C2087: 'POP' : missing subscript
d:\dvlp\test2\test2\test2.cpp(158) : error C2057: expected constant expression
d:\dvlp\test2\test2\test2.cpp(158) : error C2466: cannot allocate an array of constant size 0
d:\dvlp\test2\test2\test2.cpp(158) : error C2133: 't1' : unknown size
d:\dvlp\test2\test2\test2.cpp(186) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
d:\dvlp\test2\test2\test2.cpp(191) : error C2065: 'pskreddy' : undeclared identifier
d:\dvlp\test2\test2\test2.cpp(191) : error C2143: syntax error : missing ';' before '}'

> when i run gdb
That isn't going to help when you have a hideous mismatch of c and c++. Learn the basics first.

The code you posted doesn't compile. Resolve the compilation errors. Also before accessing argv[2], you may want to ensure that agrv indeed contains those many elements. You can do that by checking the value of argc.