PDA

View Full Version : سوال: ترتیب تعریف آرایه و تتفاوت نتایج



hadiaj168
دوشنبه 23 فروردین 1389, 10:54 صبح
سلام
تقریبا یک سالی بود که با C کار نکرده بودم ولی با اصرار یکی از دوستان که برای پروژه ارشدش به یک برنامه برای تولید داده نیاز داشت دوباره به این محیط عذاب آور با ارورهای مسخره وارد شدم:عصبانی++:.
کد زیر رو ببینید :

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include <math.h>
//#include <cstdlib>
#include <time.h> /* Needed just for srand seed */

int X[5][2][100],Xx[5][2][100],fX[100][100],fXx[100][100];
int l,Pam[25][25];

int s(int,int);
void Xi_Generate();
void Xxi_Generate();
int Max(int,int,int,int);
void F_X(int);
void F_Xx(int);
void Randomize();

void Randomize()
{
srand((unsigned)time( NULL )) ;
}

int Max(int a,int b,int c,int d)
{
int max;

max = a;

if(b>max)
max = b;

if(c>max)
max = c;

if(d>max)
max = d;

return max;
}

//--------------------------------------------------------------------
void Xi_Generate()
{
int i,j,k;

Randomize() ;
for(i=0;i<5;i++)
for(j=0;j<2;j++)
for(k=0;k<l;k++)
{
X[i][j][k] = rand()%25+65 ; // rand 65..89 ~ A-Y
while(X[i][j][k]==66 || X[i][j][k]==74 || X[i][j][k]==79 || X[i][j][k]==85 || X[i][j][k]==88) // skip B J O U X
X[i][j][k] = rand()%25+65 ; // rand 65..89 ~ A-Y
}
}

void Xxi_Generate()
{
int i,j,k,a,b,c;

for(i=0;i<5;i++)
for(j=0;j<2;j++)
for(k=0;k<l;k++)
Xx[i][j][k] = X[i][j][k];

Randomize() ;
for(i=0;i<5;i++)
{
a = rand()%2+0 ; // rand 0,1 ~ choice x(Not X) y
b = rand()%l+0 ; // rand 0,l-1 ~ choice a araay of x or y

c = rand()%25+65 ; // rand 65..89 ~ A-Y
while(c==66 || c==74 || c==79 || c==85 || c==88) // skip B J O U X
c = rand()%25+65 ; // rand 65..89 ~ A-Y

Xx[i][a][b] = c ; // change x[] to c
}
}

int s(int a,int b)
{
return Pam[a-65][b-65];
}

void F_X(int i)
{
int k,t;

for(k=0;k<l;k++)
for(t=0;t<l;t++)
{
/*printf("\n1fX %d%d = %d ",k,t,fX[k-1][t-1]);
printf("\nsfX %d%d = %d ",k,t,s(X[i][0][k],X[i][1][t]));
printf("\n2fX %d%d = %d ",k,t,fX[k-1][t]);
printf("\n3fX %d%d = %d ",k,t,fX[k][t-1]);*/
fX[k][t] = Max(0,fX[k-1][t-1]+s(X[i][0][k],X[i][1][t]),fX[k-1][t]-2,fX[k][t-1]-2);

}

}

void F_Xx(int i)
{
int k,t;

for(k=0;k<l;k++)
for(t=0;t<l;t++)
fXx[k][t] = Max(0,fXx[k-1][t-1]+s(Xx[i][0][k],Xx[i][1][t]),fXx[k-1][t]-2,fXx[k][t-1]-2);

}

main()
{
int i,j,k;

l = 5;

for(k=0;k<l;k++)
{
fX[k][-1] = 0;
fX[-1][k] = 0;

fXx[k][-1] = 0;
fXx[-1][k] = 0;
}
fX[-1][-1] = 0;
fXx[-1][-1] = 0;

for(i=0;i<25;i++)
for(j=0;j<25;j++)
Pam[i][j]=0;

Pam[0][0]=4;
Pam[17][0]=-1;
Pam[13][0]=-2;
Pam[3][0]=-2;
Pam[2][0]=0;
Pam[16][0]=-1;
Pam[4][0]=-1;
Pam[6][0]=0;
Pam[7][0]=-2;
Pam[8][0]=-1;
Pam[11][0]=-1;
Pam[10][0]=-1;
Pam[12][0]=-1;
Pam[5][0]=-2;
Pam[15][0]=-1;
Pam[18][0]=1;
Pam[19][0]=0;
Pam[22][0]=-3;
Pam[24][0]=-2;
Pam[21][0]=0;

Pam[17][17]=5;
Pam[17][13]=0;
Pam[17][3]=-2;
Pam[17][2]=-3;
Pam[17][16]=1;
Pam[17][4]=0;
Pam[17][6]=-2;
Pam[17][7]=0;
Pam[17][8]=-3;
Pam[17][11]=-2;
Pam[17][10]=2;
Pam[17][12]=-1;
Pam[17][5]=-3;
Pam[17][15]=-2;
Pam[18][17]=-1;
Pam[19][17]=-1;
Pam[22][17]=-3;
Pam[24][17]=-2;
Pam[21][17]=-3;

Pam[13][13]=6;
Pam[13][3]=1;
Pam[13][2]=-3;
Pam[16][13]=0;
Pam[13][4]=0;
Pam[13][6]=0;
Pam[13][7]=1;
Pam[13][8]=-3;
Pam[13][11]=-3;
Pam[13][10]=0;
Pam[13][12]=-2;
Pam[13][5]=-3;
Pam[15][13]=-2;
Pam[18][13]=1;
Pam[19][13]=0;
Pam[22][13]=-4;
Pam[24][13]=-2;
Pam[21][13]=-3;

Pam[3][3]=6;
Pam[3][2]=-3;
Pam[16][3]=0;
Pam[4][3]=2;
Pam[6][3]=-1;
Pam[7][3]=-1;
Pam[8][3]=-3;
Pam[11][3]=-4;
Pam[10][3]=-1;
Pam[12][3]=-3;
Pam[5][3]=-3;
Pam[15][3]=-1;
Pam[18][3]=0;
Pam[19][3]=-1;
Pam[22][3]=-4;
Pam[24][3]=-3;
Pam[21][3]=-3;


Pam[2][2]=9;
Pam[16][2]=-3;
Pam[4][2]=-4;
Pam[6][2]=-3;
Pam[7][2]=-3;
Pam[8][2]=-1;
Pam[11][2]=-1;
Pam[10][2]=-3;
Pam[12][2]=-1;
Pam[5][2]=-2;
Pam[15][2]=-3;
Pam[18][2]=-1;
Pam[19][2]=-1;
Pam[22][2]=-2;
Pam[24][2]=-2;
Pam[21][2]=-1;

Pam[16][16]=5;
Pam[16][4]=2;
Pam[16][6]=-2;
Pam[16][7]=0;
Pam[16][8]=-3;
Pam[16][11]=-2;
Pam[16][10]=1;
Pam[16][12]=0;
Pam[16][5]=-3;
Pam[16][15]=-1;
Pam[18][16]=0;
Pam[19][16]=-1;
Pam[22][16]=-2;
Pam[24][16]=-1;
Pam[21][16]=-2;

Pam[4][4]=5;
Pam[6][4]=-2;
Pam[7][4]=0;
Pam[8][4]=-3;
Pam[11][4]=-3;
Pam[10][4]=1;
Pam[12][4]=-2;
Pam[5][4]=-3;
Pam[15][4]=-1;
Pam[18][4]=0;
Pam[19][4]=-1;
Pam[22][4]=-3;
Pam[24][4]=-2;
Pam[21][4]=-2;

Pam[6][6]=6;
Pam[7][6]=-2;
Pam[8][6]=-4;
Pam[11][6]=-4;
Pam[10][6]=-2;
Pam[12][6]=-3;
Pam[6][5]=-3;
Pam[15][6]=-2;
Pam[18][6]=0;
Pam[19][6]=-2;
Pam[22][6]=-2;
Pam[24][6]=-3;
Pam[21][6]=-3;

Pam[7][7]=8;
Pam[8][7]=-3;
Pam[11][7]=-3;
Pam[10][7]=-1;
Pam[12][7]=-2;
Pam[7][5]=-1;
Pam[15][7]=-2;
Pam[18][7]=-1;
Pam[19][7]=-2;
Pam[22][7]=-2;
Pam[24][7]=2;
Pam[21][7]=-3;

Pam[8][8]=4;
Pam[11][8]=2;
Pam[10][8]=-3;
Pam[12][8]=1;
Pam[8][5]=0;
Pam[15][8]=-3;
Pam[18][8]=-2;
Pam[19][8]=-1;
Pam[22][8]=-3;
Pam[24][8]=-1;
Pam[21][8]=3;

Pam[11][11]=4;
Pam[11][10]=-2;
Pam[12][11]=2;
Pam[11][5]=0;
Pam[15][11]=-3;
Pam[18][11]=-2;
Pam[19][11]=-1;
Pam[22][11]=-2;
Pam[24][11]=-1;
Pam[21][11]=1;

Pam[10][10]=5;
Pam[12][10]=-1;
Pam[10][5]=-3;
Pam[15][10]=-1;
Pam[18][10]=0;
Pam[19][10]=-1;
Pam[22][10]=-3;
Pam[24][10]=-2;
Pam[21][10]=-2;

Pam[12][12]=5;
Pam[12][5]=0;
Pam[15][12]=-2;
Pam[18][12]=-1;
Pam[19][12]=-1;
Pam[22][12]=-1;
Pam[24][12]=-1;
Pam[21][12]=1;

Pam[5][5]=6;
Pam[15][5]=-4;
Pam[18][5]=-2;
Pam[19][5]=-2;
Pam[22][5]=1;
Pam[24][5]=3;
Pam[21][5]=-1;

Pam[15][15]=7;
Pam[18][15]=-1;
Pam[19][15]=-1;
Pam[22][15]=-4;
Pam[24][15]=-3;
Pam[21][15]=-2;

Pam[18][18]=4;
Pam[19][18]=1;
Pam[22][18]=-3;
Pam[24][18]=-2;
Pam[21][18]=-2;

Pam[19][19]=5;
Pam[22][19]=-2;
Pam[24][19]=-2;
Pam[21][19]=0;

Pam[24][24]=7;
Pam[24][21]=-1;
Pam[24][22]=2;
Pam[22][22]=11;
Pam[21][21]=4;
Pam[22][21]=-3;

// remplissage de la partie triangulaire supérieure de la matrice par symétrie
for (i=1;i<25;i++)
{
j=0;
while (i!=j)
{
Pam[j][i]=Pam[i][j];
j++;
}
}

Xi_Generate();

Xxi_Generate();

F_X(0);
F_Xx(0);

for(i=0;i<l;i++)
for(j=0;j<l;j++)
printf("\nfX %d%d = %d ",i,j,fX[i][j]);

for(i=0;i<l;i++)
for(j=0;j<l;j++)
printf("\nfXx %d%d = %d ",i,j,fXx[i][j]);

getch();
}



با اینکه اول تابع Main مقادیر اولیه رو مشخص میکنیم ولی بجای اون مقدار ها عددهای دیگه ای قرار میده.

جالب اینجاست که اگه از کامپایلر GCC استفاده کنیم و در خط 8 ترتیب تعریف آرایه های fX و fXx رو عوض کنیم نتایج فرق میکنه.

جالب ترشم اینه که اگه fX رو قیل از X تعریف کنیم کلا برنامه اجرا نمیشه:گیج:!

sh4mid
دوشنبه 23 فروردین 1389, 16:10 عصر
for(k=0;k<l;k++)
{
fX[k][-1] = 0;
fX[-1][k] = 0;

fXx[k][-1] = 0;
fXx[-1][k] = 0;
}
fX[-1][-1] = 0;
fXx[-1][-1] = 0;



نمیتونی اندیس آرایه رو 1- بگذاری گیر بهت نمیده ولی معلوم نیست تو اون خانه از آرایه چی میریزه و اینکه چی میشه بستگی داره تو اون خانه قبلا چی بوده