PDA

View Full Version : سوال: مشکل در آرایه های دو بعدی



amidagha
یک شنبه 10 اسفند 1393, 12:24 عصر
دوستان گرامی سلام
من یه برنامه با c++ نوشتم که توش از آرایه های دو بعدی استفاده شده. حالا نیازه که تعداد عناصر آرایه رو زیاد کنم، ولی متاسفانه به حد 1000000*10000 که میرسه، دیگه برنامه ام ران نمیشه.
ولی من باید تعداد رو خیلی بیشتر از اینا هم کنم .
چند تا روش مثل تعریف عناصر آرایه خارج از قسمت main()، یا استفاده از اشاره گرها رو امتحان کردم؛ اما در هر بار باز با ارور core dumped مواجه میشم.
نمیدونم دیگه چیکار باید بکنم.
ممنون میشم اگه کمکم کنید.
اینم کدم هست:


/* This programme calculates averages: <X>,<Y>,<X2>,<Y2> & MSD v.s t by "ensemble average" with MAX p=0-0.28*/




#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <fstream>
#include <time.h>
#define step 1000000
#define N 1000
using namespace std;


int main() {
srand48(time(0));
double x,y,X,Y,X2,Y2;
double noise;
ofstream out1("xydN.txt");
ofstream NMSD("NMSD.txt");
static double xns[N+1][step+1], yns[N+1][step+1], d[N+1][step+1];
double XN[step], YN[step], X2N[step], Y2N[step], rN[step], r2N[step];
xns[N+1][1]=1;
yns[N+1][1]=2;
d[N+1][0]=3;
for (int j=1; j<=N; j++)
{
for (int i=1; i<=step; i++)
{
d[j][i]=2*xns[j][i]-3;
out1 <<xns[j][i]<<"\t"<<yns[j][i]<<"\t"<<d[j][i]<<endl;
if (d[j][i]-d[j][i-1]>0)
{
noise=drand48();
if (noise>=0 && noise<0.28)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.28 && noise<0.52)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.52 && noise<0.76)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
if (d[j][i]-d[j][i-1]<0)
{
noise=drand48();
if (noise>=0 && noise<0.28)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.28 && noise<0.52)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.52 && noise<0.76)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
else
{
noise=drand48();
if (noise>=0 && noise<0.25)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.25 && noise<0.50)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.50 && noise<0.75)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
}
}
for (int l=1; l<=step; l+=5) // l=time interval
{
X=0;
Y=0;
X2=0;
Y2=0;
for (int d=1; d<=N; d++)
{
X+=xns[d][l];
Y+=yns[d][l];
X2+=pow((xns[d][l]),2);
Y2+=pow((yns[d][l]),2);
}
XN[l]=X/N;
YN[l]=Y/N;
X2N[l]=X2/N;
Y2N[l]=Y2/N;
rN[l]=sqrt((XN[l]*XN[l])+(YN[l]*YN[l]));
r2N[l]=(X2N[l]+Y2N[l]);


double MSD=r2N[l]-pow(rN[l],2);
NMSD<<l<<"\t"<<XN[l]<<"\t"<<YN[l]<<"\t"<<X2N[l]<<"\t"<<Y2N[l]<<"\t"<<MSD<<endl;
}
out1.close();
NMSD.close();
return 0; }

rahnema1
یک شنبه 10 اسفند 1393, 12:56 عصر
سلام، می شه توضیح بدید دقیقا چیکار می خواهید بکنید چون شاید لازم باشه به جای آرایه دو بعدی از یک بعدی استفاده بشه یا مثلا از فایل خونده بشه یا ..

amidagha
یک شنبه 10 اسفند 1393, 18:02 عصر
سلام، می شه توضیح بدید دقیقا چیکار می خواهید بکنید چون شاید لازم باشه به جای آرایه دو بعدی از یک بعدی استفاده بشه یا مثلا از فایل خونده بشه یا ..

دقیقا من میخوام برای N تا ذره در گامهای زمانی مختلف، مختصات x و y رو ذخیره بکنم. بعد، از اون x,y ها میانگین بگیرم.
ریختن تو فایل هم ایده خوبیه، اما آخه هیچ راه دیگه ای جز استفاده از آرایه دو بعدی برای ذخیره مختصات N تا ذره در گامهای زمانی مختلف به نظرم نمیرسه:متفکر::متفکر:

rahnema1
یک شنبه 10 اسفند 1393, 21:40 عصر
چند جای برنامه خطا وجود داره مثلا

xns[N+1][1]=1;
yns[N+1][1]=2;
d[N+1][0]=3;

n+1 اندیس خارج از آرایه هست
یا مثلا در if ها هم یک else کم بود و می شد ترکیب کرد
ضمنا نیاز به آرایه دو بعدی هم نیست
کد را به این شکل اصلاح کردم

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <fstream>
#include <time.h>
#define step 1000000
#define N 1000
using namespace std;


int main()
{
srand48(time(0));
//srand48(1000);
double x,y;
double noise;
ofstream out1("xydN.txt");
ofstream NMSD("NMSD.txt");
static double xns[N+1], yns[N+1], d[N+1];
double XN[step], YN[step], X2N[step], Y2N[step], rN[step], r2N[step];

/*xns[N+1][1]=1;
yns[N+1][1]=2;
d[N+1][0]=3;*/
int inc1 = 0;
int inc2 = 0;

double X[step]= {};
double Y[step]= {};
double X2[step]= {};
double Y2[step]= {};
for (int j=1; j<=N; j++)
{
for (int i=1; i<=step; i++)
{
d[i]=2*xns[i]-3;
out1 <<xns[i]<<"\t"<<yns[i]<<"\t"<<d[i]<<endl;
if (d[i]-d[i-1]>=0)
{
inc1 = 1;
inc2 = -1;
}
else
{
inc1 = -1;
inc2 = 1;
}
noise=drand48();
if (noise>=0 && noise<0.28)
{
xns[i+1]=xns[i]+inc1;
yns[i+1]=yns[i];
}
else if (noise>=0.28 && noise<0.52)
{
xns[i+1]=xns[i]+inc2;
yns[i+1]=yns[i];
}
else if (noise>=0.52 && noise<0.76)
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]+1;
}
else
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]-1;
}
X[i]+=xns[i];
Y[i]+=yns[i];
X2[i]+=pow((xns[i]),2);
Y2[i]+=pow((yns[i]),2);

}
}
for (int i=1; i<=step; i+=5) // i=time interval
{
XN[i]=X[i]/N;
YN[i]=Y[i]/N;
X2N[i]=X2[i]/N;
Y2N[i]=Y2[i]/N;
rN[i]=sqrt((XN[i]*XN[i])+(YN[i]*YN[i]));
r2N[i]=(X2N[i]+Y2N[i]);

double MSD=r2N[i]-pow(rN[i],2);
NMSD<<i<<"\t"<<XN[i]<<"\t"<<YN[i]<<"\t"<<X2N[i]<<"\t"<<Y2N[i]<<"\t"<<MSD<<endl;
}

out1.close();
NMSD.close();
return 0;
}

amidagha
یک شنبه 10 اسفند 1393, 23:40 عصر
با سلام و تشکر فراوان :لبخندساده:
منظورتون از "اندیس خارج از آرایه"، این هستش که این عضو در آرایه نیست؟ درسته؟ در واقع تو اون قسمت می خواستم بگم که برای همه Nها، اولین گام رو بذاره 1 (برای x) و همینطور برای y و d تا بتونم با رابطه d=2x-3 بقیه مختصه ها رو تعریف کنم؛ که اینجوری خرابکاری شد :لبخند: [تو این قسمت اگه بجای N+1، فقط N میذاشتم درست میشد؟]

بابت کدتون واقعا ممنون. خیلی لطف کردید. متاسفانه همچنان ارور قبلیش برقراره! و در کمال تعجب حتی برای تعداد خیلی کم در حد N=50و step=10 هم ارور میده:متفکر::متعجب:

rahnema1
دوشنبه 11 اسفند 1393, 13:06 عصر
با سلام و تشکر فراوان :لبخندساده:
منظورتون از "اندیس خارج از آرایه"، این هستش که این عضو در آرایه نیست؟ درسته؟ در واقع تو اون قسمت می خواستم بگم که برای همه Nها، اولین گام رو بذاره 1 (برای x) و همینطور برای y و d تا بتونم با رابطه d=2x-3 بقیه مختصه ها رو تعریف کنم؛ که اینجوری خرابکاری شد :لبخند: [تو این قسمت اگه بجای N+1، فقط N میذاشتم درست میشد؟]

بابت کدتون واقعا ممنون. خیلی لطف کردید. متاسفانه همچنان ارور قبلیش برقراره! و در کمال تعجب حتی برای تعداد خیلی کم در حد N=50و step=10 هم ارور میده:متفکر::متعجب:

اگه بخواهید مثلا تمام عناصر ستون اول برابر یک باشند باید با حلقه اونها را برابر یک کنید
لطفا برنامه را بدون خطا ( نسخه نهایی) بذارید تا بگیم چیکار کنید

amidagha
پنج شنبه 14 اسفند 1393, 22:57 عصر
آهان، این رو نمیدونستم.
برنامه بدون خطا همون کد بالاست وقتی که step=100000 و N=500 باشه. برای هر مقداری بیشتر از این تعداد خطا میده.

rahnema1
جمعه 15 اسفند 1393, 18:26 عصر
فکر کنم اندازه آراه ها را اشتباه دادید

XN[step + 1], YN[step + 1], X2N[step + 1], Y2N[step + 1], rN[step + 1], r2N[step + 1];
double X[step + 1]= {};
double Y[step + 1]= {};
double X2[step + 1]= {};
double Y2[step + 1]= {};

amidagha
یک شنبه 20 اردیبهشت 1394, 10:52 صبح
با سلام مجدد

من برنامه ای رو که قبلا گذاشته بودم به این شکل تغییرش دادم:

/* This programme calculates averages: <X>,<Y>,<X2>,<Y2> & MSD v.s t by "ensemble average" with MAX p=0-0.28*/



#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <fstream>
#include <time.h>
#define step 2000
#define N 40
#define E 0.28
using namespace std;


int main() {
srand48(time(0));
float x,y,X,Y,X2,Y2;
float noise;
ofstream out1("xydN.txt");
ofstream NMSD("NMSD.txt");
static float xns[N+1][step+1], yns[N+1][step+1], d[N+1][step+1];
float XN[step], YN[step], X2N[step], Y2N[step], rN[step], r2N[step];
for (int j=1; j<=N; j++)
{
xns[j][1]=1;
yns[j][1]=2;
d[j][0]=3;
for (int i=1; i<=step; i++)
{

d[j][i]=-2*xns[j][i]-3;
out1 <<xns[j][i]<<"\t"<<yns[j][i]<<"\t"<<d[j][i]<<endl;
if (d[j][i]-d[j][i-1]>0)
{
if (xns[j][i]-xns[j][i-1]>0)
{
noise=drand48();
if (noise>=0 && noise<E)
{

xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
else
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
}
if (d[j][i]-d[j][i-1]<0)
{
if (xns[j][i]-xns[j][i-1]>0)
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
else
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
}
else
{
noise=drand48();
if (noise>=0 && noise<0.25)
{
xns[j][i+1]=xns[j][i]+1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.25 && noise<0.50)
{
xns[j][i+1]=xns[j][i]-1;
yns[j][i+1]=yns[j][i];
}
else if (noise>=0.50 && noise<0.75)
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]+1;
}
else
{
xns[j][i+1]=xns[j][i];
yns[j][i+1]=yns[j][i]-1;
}
}
}
}
for (int l=1; l<=step; l+=5) // l=time interval
{
X=0;
Y=0;
X2=0;
Y2=0;
for (int d=1; d<=N; d++)
{
X+=xns[d][l];
Y+=yns[d][l];
X2+=pow((xns[d][l]),2);
Y2+=pow((yns[d][l]),2);
}
XN[l]=X/N;
YN[l]=Y/N;
X2N[l]=X2/N;
Y2N[l]=Y2/N;
rN[l]=sqrt((XN[l]*XN[l])+(YN[l]*YN[l]));
r2N[l]=(X2N[l]+Y2N[l]);


float MSD=r2N[l]-pow(rN[l],2);
NMSD<<l<<"\t"<<XN[l]<<"\t"<<YN[l]<<"\t"<<X2N[l]<<"\t"<<Y2N[l]<<"\t"<<MSD<<endl;
}
out1.close();
NMSD.close();
return 0;
}

و مشکل ران نشدنش بخاطر تعداد زیاد اعضای آرایه حل شد. اما با دو مشکل دیگه روبرو شدم:
1. وقتی E رو در بالا تعریف نمی کنم و اول ران از کاربر میخوام که مقدارشو بده، به نتیجه دور از انتظار میرسم و داده هایی که بدست میارم کلا اشتباه هست. اما وقتی خودم تعریفش می کنم داخل برنامه نتیجه همون چیزیه که انتظار داشتم و دلیلش رو نمیدونم که چرا این اتفاق می افته!!:متفکر:

2. وقتی برنامه اجرا میشه، بیشتر داده ها مربوط به قسمتی هست که تغییرات d مثبت و تغییرات x منفی بوده (یعنی Δd>0 ,Δx<0) یا وقتی که تغییرات d منفی و تغییرات x مثبت بوده (یعنی Δd<0, Δx>0) و بسیار کم پیش اومده که برای Δd>0، Δx>0 بشه و یا برای Δd<0، Δx<0 بشه!!
حالا سوال من اینه که اشکال من کجای این برنامه است که همچین اتفاقی رخ میده، آیا در مقدار دهی اولیه به x و y هست؟ آیا در رابطه ای هست که برای d تعریف می کنم؟ یا چیز دیگه ؟
:متفکر:

rahnema1
یک شنبه 20 اردیبهشت 1394, 15:57 عصر
سلام
لازم به آرایه دو بعدی نیست. براساس کد شما اینجور اصلاح کردم اگه تغییر دیگه ای نباشه

#include <iostream>
#include <stdlib.h>
#include <cmath>
#include <fstream>
#include <time.h>
#define step 2000
#define N 40
#define E 0.28
using namespace std;


int main()
{
srand48(time(0));
double x,y;
double noise;
ofstream out1("xydN.txt");
ofstream NMSD("NMSD.txt");
static double xns[step + 1], yns[step + 1], d[step + 1];
double XN[step + 1], YN[step + 1], X2N[step + 1], Y2N[step + 1], rN[step + 1], r2N[step + 1];

xns[1]=1;
yns[1]=2;
d[0]=3;

double X[step + 1]= {};
double Y[step + 1]= {};
double X2[step + 1]= {};
double Y2[step + 1]= {};
for (int j=1; j<=N; j++)
{
for (int i=1; i<step; i++)
{
d[i]=-2*xns[i]-3;
out1 <<xns[i]<<"\t"<<yns[i]<<"\t"<<d[i]<<endl;
if (d[i]-d[i-1]>0)
{
if (xns[i]-xns[i-1]>0)
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[i+1]=xns[i]+1;
yns[i+1]=yns[i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[i+1]=xns[i]-1;
yns[i+1]=yns[i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]+1;
}
else
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]-1;
}
}
else
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[i+1]=xns[i]-1;
yns[i+1]=yns[i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[i+1]=xns[i]+1;
yns[i+1]=yns[i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]+1;
}
else
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]-1;
}
}
}
if (d[i]-d[i-1]<0)
{
if (xns[i]-xns[i-1]>0)
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[i+1]=xns[i]-1;
yns[i+1]=yns[i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[i+1]=xns[i]+1;
yns[i+1]=yns[i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]+1;
}
else
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]-1;
}
}
else
{
noise=drand48();
if (noise>=0 && noise<E)
{
xns[i+1]=xns[i]+1;
yns[i+1]=yns[i];
}
else if (noise>=E && noise<(2*E+1)/3)
{
xns[i+1]=xns[i]-1;
yns[i+1]=yns[i];
}
else if (noise>=(2*E+1)/3 && noise<(E+2)/3)
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]+1;
}
else
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]-1;
}
}
}
else
{
noise=drand48();
if (noise>=0 && noise<0.25)
{
xns[i+1]=xns[i]+1;
yns[i+1]=yns[i];
}
else if (noise>=0.25 && noise<0.50)
{
xns[i+1]=xns[i]-1;
yns[i+1]=yns[i];
}
else if (noise>=0.50 && noise<0.75)
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]+1;
}
else
{
xns[i+1]=xns[i];
yns[i+1]=yns[i]-1;
}
}
X[i]+=xns[i];
Y[i]+=yns[i];
X2[i]+=pow((xns[i]),2);
Y2[i]+=pow((yns[i]),2);
}
}
for (int i=1; i<=step; i+=5) // i=time interval
{
XN[i]=X[i]/N;
YN[i]=Y[i]/N;
X2N[i]=X2[i]/N;
Y2N[i]=Y2[i]/N;
rN[i]=sqrt((XN[i]*XN[i])+(YN[i]*YN[i]));
r2N[i]=(X2N[i]+Y2N[i]);

double MSD=r2N[i]-pow(rN[i],2);
NMSD<<i<<"\t"<<XN[i]<<"\t"<<YN[i]<<"\t"<<X2N[i]<<"\t"<<Y2N[i]<<"\t"<<MSD<<endl;
}

out1.close();
NMSD.close();
return 0;
}

amidagha
دوشنبه 21 اردیبهشت 1394, 09:26 صبح
چقدر جالب:متعجب: نتایج هیچ فرقی نمی کنند با قبل. خیلی عااالیه. ممنونم. واقعا ممنون.

ببخشید دو تا سوالی که زیر کد نوشته بودم رو هم میشه لطف کنید جواب بدید. اینکه از کاربر مقداری رو بگیریم یا خودمون داخل برنامه اون مقدارو تعریف کنیم چرا باید نتایج متفاوتی بده؟:متفکر:

rahnema1
دوشنبه 21 اردیبهشت 1394, 18:58 عصر
اولا یک اصلاح در پست قبل انجام دادم البته بر اساس کد شما نوشته بودم که اشتباهه
قسمت

for (int i=1; i<=step; i++)

باید به

for (int i=1; i<step; i++)

تغییر پیدا کنه چون در [xns[i+1 از آرایه بیرون می زنه
جواب سوال اول تا کد شما را نبینم نمیتونم نظر بدم اشکال کجا بوده
سوال دوم هم باز نمیتونم بگم چون دقیقا نمیدونم شما چیکار می خواهید بکنید
حداقل اگه شبه کد یا الگوریتم مورد نظر را اینجا میذاشتید تا بر اساس اون روی کد شما قضاوت کنیم. الان شما هر کدی که اینجا بذارید ممکنه ما اصلاح کنیم و بدون خطا یه جوابی هم بده ، ولی معلوم نیست جواب صحیح باشه!