الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أرجو المساعدة في معرفة الغرض من هذا الexception

بدأه lug في 26 يناير 2009 · 7 رد · 785 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

الأخوة الكرام في هذا المنتدى

لدي سؤال وأتمنى أن تجيبوا عليه في أسرع وقت

لدي برنامج في ال c++ والمترجم اللذي أنفذ عليه هو visual studio 2005 وعندما أقوم بتنفيذ البرنامج يظهر التالي

Unhandled exception at 0x004068e6 in lexer5.exe: 0xC0000005: Access violation reading location 0x00000000.

فلا أعرف ما السبب من ظهور هذا ال exception وكيف يمكنني التعامل معه.

هذا ولكم جزيل الشكر

#2

ربما عندك خطأ في استخدام احد المؤشرات ؟

من الافضل وضع الكود كي نرى ما الخطأ !

mov eax, dword ptr ds:[0xffdf0308]

jmp dword ptr [eax+0xfc]

#3

هذا هو الكود هو طويل شوي(كود lexer بسيط)

/*=============================================================================
			 تضمين المكتبات
  ===========================================================================
=*/
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <cstring>
#include <stdio.h>//for switch

/*=============================================================================
			 تصريحات الدوال
  ===========================================================================
=*/

void open_file();
void read_file();
void lexical();
int scan_words();
int scan_numbers();
int scan_symbols();
void check_ptr();
void print();

/*============================================================================
			  تعريف المتغيرات
  ===========================================================================
=*/

FILE *myfile;
char buffer [256]={0},lexem [20]={0};
int p=0,i=0,ptr,le=0,j;
int token;

struct lexical
{
  //char lexeme[20];
 char *lexeme;
  int token;
};
struct lexical lex[200];


# define PROGRAM 1
# define VAR 2
# define BEGIN 3
# define INTEGER 4
# define REAL 5
# define CHAR 6
# define BOOLEAN 7
# define READ 8
# define READLN 9
# define WRITE 10
# define WRITELN 11
# define IF 12
# define THEN 13
# define ELSE 14
# define FOR 15
# define TO 16
# define DO 17
# define END 18
# define IDENTIFIER 19
# define NUMBER 20
# define ASSIGNMENT 21
# define OPERATOR 22
# define SPECIAL 23

/*==============================================================================
			  main الدالة الرئيسية
  ===========================================================================
==*/

void main ()
{
  open_file();
 read_file();
 lexical();
 print();
 fclose(myfile);
  cin>>j;
}
/*==============================================================================
			  دالة فتح الملف
  ===========================================================================
====*/

void open_file()
{   if((myfile = fopen("H:\\program.txt","rb"))==NULL)
  {
   cout<<"Cannot open file";
   exit(1);
  }
}

/*===============================================================================
			  دالة القراءة من الملف
  ===========================================================================
====*/

void read_file()
{
   if (!feof(myfile))
	if (p == 0)
  {
	fread(buffer,128,1,myfile);
   ptr = -1;
  }
  else
   fread(&buffer[128],128,1,myfile);
}

/*===============================================================================
		   ptr دالة فحص الـ
  ===========================================================================
====*/

void check_ptr()
{
 if ( ptr == 127 )
 {
  p = 1;
  read_file();
 }
 else if ( ptr ==255 )
 {
  p = 0;
   read_file();
 }

}

/*===============================================================================
		  tokens دالة استخراج الـ
  ===========================================================================
====*/

void lexical()
{
   for(ptr=0;ptr<256 && buffer[ptr] != EOF;++ptr)
   {
   if(isspace(buffer[ptr]))
	continue;
   else if(isalpha(buffer[ptr]))
   lex[le].token = scan_words();
   else if(isdigit(buffer[ptr]))
	lex[le].token = scan_numbers();
   else
	lex[le].token = scan_symbols();
   ++le;
   } 
}

/*===============================================================================
								 دالة فحص الكلمات 
  ===========================================================================
====*/

int scan_words()
{
 do
 {
  lexem = buffer[ptr];
  check_ptr();
  ++ptr;
	 ++i;
 }while (isalpha(buffer[ptr]) || isdigit(buffer[ptr]) );
 lexem='\0';
 lex[le].lexeme = lexem;
  i=0;
  ptr=ptr-1;
 if(strcmp(lexem,"PROGRAM")==0)
 {
  token = PROGRAM;
 }
 else if(strcmp(lexem,"VAR")==0)
 {
  token=VAR;
 }
 else if(strcmp(lexem,"BEGIN")==0)
 {
  token = BEGIN;
 }
 else if(strcmp(lexem,"INTEGER")==0)
 {
 token = INTEGER;
 }
 else if(strcmp(lexem,"REAL")==0)
 {
   token=REAL;
  }
 else if(strcmp(lexem,"READ")==0)
 {
  token=READ;
 }
 else if(strcmp(lexem,"READLN")==0)
  {
  token=READLN;
  }
 else if(strcmp(lexem,"WRITE")==0)
  {
  token=WRITE;
  }
 else if(strcmp(lexem,"WRITELN")==0)
  {
   token=WRITELN;
   }
 else if(strcmp(lexem,"IF")==0)
  {
  token=IF;
  }
 else if(strcmp(lexem,"THEN")==0)
 {
  token=THEN;
  }
 else if(strcmp(lexem,"ELSE")==0)
  {
  token=ELSE;
  }
 else if(strcmp(lexem,"FOR")==0)
 {
  token=FOR;
  }
 else if(strcmp(lexem,"TO")==0)
  {
   token=TO;
   }
 else if(strcmp(lexem,"DO")==0)
 {
  token=DO;
  }
 else if(strcmp(lexem,"END")==0)
  {
  token=END;
  }
 else
  {
  token=IDENTIFIER;
  }


return token;
}

/*===============================================================================
								 دالة فحص الأرقام 
  ===========================================================================
====*/
int scan_numbers()
{

 do
 {
  lexem = buffer[ptr];
  check_ptr();
  ++ptr;
	 ++i;
 }while ( isdigit(buffer[ptr]) );
 if (buffer[ptr]=='.')
 {
  lexem = buffer[ptr];
  check_ptr();
  ++ptr;
   ++i;

  while ( isdigit(buffer[ptr]) )
	 {
  lexem = buffer[ptr];
  check_ptr();
  ++ptr;
   ++i;
	 }
 }

 lexem='\0';
 //cout<<lexem<<'\t';
  lex[le].lexeme = lexem;
 i=0;
 ptr=ptr-1;
 return NUMBER;
}

/*===============================================================================
		   دالة فحص الرموز
  ===========================================================================
====*/
int scan_symbols()
{
 switch (buffer[ptr])
 {
 case ';'  : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	lex[le].lexeme = lexem;
	 i=0;
	 token=SPECIAL;
	  }
 case ',' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token=SPECIAL;
	}
case '.' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token= SPECIAL;
	}
case '\'' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token= SPECIAL;
	}
case '-' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token = OPERATOR;
	 }
case '+' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token = OPERATOR;
	}
case '*' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token = OPERATOR;
	}
 case '/' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token = OPERATOR;
	}
 case '=' : {
	 lexem=buffer[ptr];
	 lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	 token = OPERATOR;
	}
 case ':' : {
	 lexem=buffer[ptr];
	 check_ptr();
	 ++ptr;
	 ++i;
	if (buffer[ptr]=='=')
	{
	  lexem = buffer[ptr];
	  lexem[i+1]='\0';
	 //cout<<lexem<<'\t';
	  lex[le].lexeme = lexem;
	 i=0;
	 token = ASSIGNMENT;
	}
	else
	{lexem='\0';
	 //cout<<lexem<<'\t';
	 lex[le].lexeme = lexem;
	 i=0;
	ptr=ptr-1;
	 token = SPECIAL;
	}
	  }
 case '<' : {
	 lexem=buffer[ptr];
	check_ptr();
	 ++ptr;
	  ++i;
	if ((buffer[ptr]=='=') || (buffer[ptr]=='>'))
	{
	  lexem = buffer[ptr];
	lexem[i+1]='\0';
	}
	else
	{
	ptr=ptr-1;
	 lexem='\0';
	}
	 //cout<<lexem<<'\t';
	lex[le].lexeme = lexem;
	 i=0;
	 token = OPERATOR;
	  }
case '>' : { lexem=buffer[ptr];
	check_ptr();
	  ++ptr;
	 ++i;
	if (buffer[ptr]=='=')
	{
	 lexem = buffer[ptr];
	 lexem[i+1]='\0';
	}
	else
	{
	ptr=ptr-1;
	lexem='\0';
	}
	  //cout<<lexem<<'\t';
	lex[le].lexeme = lexem;
	i=0;
	token = OPERATOR;
	 }
 }
 return token;
}

/*===============================================================================
		   دالة الطباعة
  ===========================================================================
====*/
void print()
{ 
 for(j=0; j<200;++j)
 {
  cout<<lex[j].lexeme<<'\t';
  cout<<lex[j].token<<endl;
 }
}

تم تعديل هذه المشاركة بواسطة lug في 26 يناير 2009 في 10:05

#4

اخي الكريم

لم أقرأ الكود ولكن هذا الخطأ (0xC0000005) هو عبارة عن استخدام خاطئ للذاكرة، والظاهر من الخطأ أنه يوجد لديك مؤشر يؤشر على NULL وتحاول استخدامه، أو تحاول استخدام موقع خارج حدود المصفوفة، حاول أن تتتبع البرنامج عن طريق debug وترى أي يحدث الخطأ

#5

يبدوا ان المشكله زي ما ذكر الاخوان

وايضا الكود يعتمد على الملف الخارجي وما يحتويه

لو تم وضع داله للاخطاء errors

في الكود لكان من السهل ايجاد المشكله

عموما يمكنك تتبع الخطاء

او وضع الملف الخارجي هنا

متغيب

#6

اشكركم على التعاون بس بصراحة لحد الآن ما عرفت ايش الخطأ بالضبط بالرغم من أني اتبعت البرنامج

ممكن انزل الملف الخارجي

بس على ما اعتقد إنه ما له علاقة

مرة اخرى شكراً على تعاونكم

program.rar

#7

والله افتر راسي وانا اتتبع الكود

لانه بصراحه ما عندي مترجم حاليا

لكن جرب

عدل بالكود ما يلي

struct lexical lex[200];

عدلها لي

struct lexical lex[202];

وايضا

for(j=0; j<200;++j)

عدلها لي

for(j=0; j<202;++j)

وقلي وش يصير معك

متغيب

#8

أولاً شكراً جزيلاً على التعاون وشكر خاص لأنك قمت بقراءة الكود

قمت بتغيير الكود كما قلت لكن الخطأ كما هو ما في اختلاف عن السابق

وإن شاء الله أحاول اشوف حل

ولا تتعب نفسك مرة ثانية وتقرأ الكود.

مواضيع مشابهة