PDA

View Full Version : خطا هنگام اجرای برنامه



HAIdle
شنبه 06 مرداد 1386, 22:13 عصر
سلام به همه
من یه برنامه با سی نوشتم. وقتی برنامه را از خود محیط دات نت اجرا می کنم بدون خطا به درستی کارش را انجام می دهد ولی وقتی فایل اجرای آن را اجرا می کنم

خطای زیر را می دهد:
The instruction at "0x7c911ec3" referenced memory at "0x003b7aaa". The memory could not be

"written"
البته با وجود این که این خطا را می دهد برنامه تا آخر درست اجرا می شود و خروجی کاملا درست می دهد. حالا اولا این خطا چیست و ثانیا چطور می

تونم بفهمم روی کدوم دستور داره خطا می ده و کجای حافظه؟

emad_67
شنبه 06 مرداد 1386, 22:18 عصر
برنامتو بزار اینجا تا بهتر بشه نظر داد

HAIdle
شنبه 06 مرداد 1386, 22:22 عصر
باشه.
این برنامه کامل منه: قراره یه فرمت را به یه فرمت دیگه ای تبدیل کنه. ممنون میشم اگه راهنمایی دیگه ای درباره کد من دارید و اشکال دیگه ای می بینید بفرمایید.


// In the name of Allah

#include <fstream>
using namespace std;

ofstream output("result.txt");
int pageNum = 2;
char lastGCode;
char z[100], r[100], f[100], x[100];
bool findG0 = false;

bool isM30(char* str)
{
if (strlen(str)<1 || str[0] != 'M')
return false;
if (strlen(str)<2 || str[1] != '3')
return false;
if (strlen(str)<3 || str[2] != '0')
return false;
return true;
}

bool isG0AndNotG0T(char* str)
{
if (strlen(str)<1 || str[0] != 'G')
return false;
if (strlen(str)<2 || str[1] != '0')
return false;
if (strlen(str)>=3 && str[2] == 'T')
return false;
return true;
}

bool isG1(char* str)
{
if (strlen(str)<1 || str[0] != 'G')
return false;
if (strlen(str)<2 || str[1] != '1')
return false;
return true;
}

bool isG2AndNotG20_1_8_9(char* str)
{
if (strlen(str)<1 || str[0] != 'G')
return false;
if (strlen(str)<2 || str[1] != '2')
return false;
if (strlen(str)>=3 && (str[2]=='0' || str[2]=='1' || str[2]=='8' || str[2]=='9' ))
return false;
return true;
}

bool isG3(char* str)
{
if (strlen(str)<1 || str[0] != 'G')
return false;
if (strlen(str)<2 || str[1] != '3')
return false;
return true;
}

bool isG98OrG99(char* str)
{
if (strlen(str)<1 || str[0] != 'G')
return false;
if (strlen(str)<2 || str[1] != '9')
return false;
if (strlen(str)<3 || (str[2]!='8' && str[2]!='9'))
return false;
return true;
}

// return index of first digit of ch in string
// and if this string don't have ch return -1
int findStart(char* str, char ch)
{
int len = strlen(str);
for (int i=0; i<len; i++)
if (str[i] == ch)
return i+1;
return -1;
}

bool isDigitOrPeriodOrNegativeSign(char ch)
{
if (ch == '.' || ch == '-')
return true;
return ('0'<=ch && ch<='9');
}

char* findNumber(char* str, int index)
{
char* res = new char(100);
int pos = 0;
int len = strlen(str);

for (int i=index; i<len && isDigitOrPeriodOrNegativeSign(str[i]); i++)
res[pos++] = str[i];
res[pos] = '\0';
return res;
}

// if this double number has float digits
// from 3th place to last return true
bool has3thFloatDigit(double d)
{
double dif = d - (int)d;
dif *= 100;
return ((dif - (int)dif) != 0);
}

bool isSmallerThanSix_3thFloatDigit(double d)
{
d *= 1000;
int i = (int)d;
return ((i%10)<6);
}

// do some work on num in order that
// when round to tow digits be suitable for our application
double prepare(double num)
{
if (has3thFloatDigit(num))
while(isSmallerThanSix_3thFloatDigit(num))
num += .001;
return num;
}

int computeSpaces(char* str)
{
int len = strlen(str);
int n = 0;
for (int i=0; i<len; i++)
if (str[i] != ' ')
return n;
else
n++;
}

char* divideTwo(const char* str)
{
// note : if all floating digits from 3th place to last be 9 this algorithm don't work truely
double num = atof(str);
char* numStr = new char(100);
char* res = new char(100);
int numSpaces;

num /= 2;
num = prepare(num);
sprintf(numStr, "%20.2f", num);
numSpaces = computeSpaces(numStr);

for (int i=numSpaces; i<20; i++)
res[i-numSpaces] = numStr[i];
res[20-numSpaces] = '\0';

return res;
}

void updateVariables(char* str)
{
int xStart = findStart(str, 'X');
if (xStart != -1)
strcpy(x, divideTwo(findNumber(str, xStart)));

int zStart = findStart(str, 'Z');
if (zStart != -1)
strcpy(z, findNumber(str, zStart));

int rStart = findStart(str, 'R');
if (rStart != -1)
strcpy(r, findNumber(str, rStart));

int fStart = findStart(str, 'F');
if (fStart != -1)
strcpy(f, findNumber(str, fStart));
}

void process(char* str)
{
int i, len;
char temp[1000];

if (isG0AndNotG0T(str))
{
lastGCode = '0';
updateVariables(str);
pageNum++;

if (!findG0) // this is first G0 and must insert into file 2
{
findG0 = true;
/* insertion of file 2 */
output << "\nPAGE ";
if (pageNum < 10)
output << '0';
output << pageNum << " PROGRAM-DATUM\n X " << x << "\n Z " << z << "";
// not clear the last "" because there is a character in it!
}
else
{
/* insertion of file 3 */
output << "\nPAGE ";
if (pageNum < 10)
output << '0';
output << pageNum << " POINT-TO-POINT.G00,G01\n X " << x << "\n Z " << z << "\n FEEDRATE " <<
f << "\n TOOL-NO 1\nSPINDLE-SPEED 1000";
}

return;
}

if (isG1(str))
{
lastGCode = '1';
updateVariables(str);
pageNum++;
/* insertion of file 3 */
output << "\nPAGE ";
if (pageNum < 10)
output << '0';
output << pageNum << " POINT-TO-POINT.G00,G01\n X " << x << "\n Z " << z << "\n FEEDRATE " <<
f << "\n TOOL-NO 1\nSPINDLE-SPEED 1000";
return;
}

if (isG2AndNotG20_1_8_9(str))
{
lastGCode = '2';
updateVariables(str);
pageNum++;
/* insertion of file 4 with CW */
output << "\nPAGE ";
if (pageNum < 10)
output << '0';
output << pageNum << " CIRCULAR-INT..G02,G03\n X " << x << "\n Z " << z <<
"\n RADIUS " << r << "\n SENSE CW\n FEEDRATE " << f << "\n TOOL-NO 1\nSPINDLE-SPEED 1000";
return;
}

if (isG3(str))
{
lastGCode = '3';
updateVariables(str);
pageNum++;
/* insertion of file 4 with CW */
output << "\nPAGE ";
if (pageNum < 10)
output << '0';
output << pageNum << " CIRCULAR-INT..G02,G03\n X " << x << "\n Z " << z <<
"\n RADIUS " << r << "\n SENSE CCW\n FEEDRATE " << f << "\n TOOL-NO 1\nSPINDLE-SPEED 1000";
return;
}

if (isG98OrG99(str))
{
len = strlen(str);
for (i=3; i<len; i++)
temp[i-3] = str[i];
temp[len-3] = '\0';
process(temp);
return;
}

// perform last G Code
if (strlen(str)>=1 && (str[0]=='X' || str[0]=='Z'))
{
temp[0] = 'G';
temp[1] = lastGCode;
len = strlen(str);
for (i=0; i<len; i++)
temp[i+2] = str[i];
temp[len+2] = '\0';
process(temp);
return;
}
}

int main()
{
ifstream input("main.txt");
char temp[1000];

/* insertion of file 1 */
output << "PAGE 01 MM-UNITS\nPAGE 02 ABSOLUTE-FORMAT..G90";

while (true)
{
input.getline(temp, 1000);

if (isM30(temp))
{
pageNum++;
output << "\nPAGE ";
if (pageNum<10)
output << '0';
output << pageNum << " END-PROGRAM..M02";
break;
}

process(temp);
}
return 0;
}

emad_67
شنبه 06 مرداد 1386, 22:34 عصر
این برنامه مطمئنی درست کار میکنه !! البته به غیر از مشکلی که گقتی چون این حلقه while ایی که تو main نوشتی یه حلقه بینهایت هست و برنامه اصلا تموم نمیشه

HAIdle
یک شنبه 07 مرداد 1386, 13:13 عصر
با این مشکل هم برنامه درست کار میکنه یعنی خروجی درست می ده.
درسته که ظاهر حلقه بینهایته ولی داخل حلقه برنامه از فایل یک خط می خونه و اگه M30 بود از حلقه خارج میشه. و فرمت وروی طوری است که حتما این خط را داره.


if (isM30(temp))
{
pageNum++;
output << "\nPAGE ";
if (pageNum<10)
output << '0';
output << pageNum << " END-PROGRAM..M02";
break;
}

emad_67
یک شنبه 07 مرداد 1386, 13:58 عصر
ببخشید اون break رو ندیدم به هر حال من برنامه رو با یه فایل فرضی اجرا کردم و مشکلی تو اجرا نداشت البته اصلا نفهمیدم که این برنامه چیکار میکنه حالا اگه خودت به قسمتی شک داری اون قسمت رو بزار. فکر نمیکنم مشکل از کد برنامه باشه چون خودت هم میگی تو محیط .net درست اجرا میشه

someCoder
دوشنبه 08 مرداد 1386, 02:41 صبح
اگر exception میگیری، حتما اشکال از کدت هست. درست اجرا شدن یک کد، دلیلی برای درست بودنش نیست.
الان که وقت ندارم کدت رو دقیق بررسی کنم، اما طبق تجربه من، احتمالا یه جایی از حدود آرایه بیرون زدی و این کار احتمالا در شرایط خاصی رخ میده.

HAIdle
دوشنبه 08 مرداد 1386, 17:45 عصر
ممنون از emad_67 و someCoder عزیز
من در این برنامه توابعی دارم که اشاره گر به کارکتر بر می گردانند و اشاره گر به کاراکتر می گیرند. حدس زدم شاید اشکال از این باشه و اشاره گر ها را برداشتم و متغیرها را سراسری تعریف کردم و برنامه درست شد.