PDA

View Full Version : آیا gotoxy منسوخ شده؟



armintirand
جمعه 20 شهریور 1388, 02:40 صبح
سلام
من یک برنامه کتابخانه دارم مینویسم که سورس اون رو پایین گذاشتم اما موقع کامپایل به دستورات gotoxy ارور میگیره اگه میشه منو تو این مورد راهنمایی کنیدکه چطور این ارور ها رو برطرف کنم.
یکی میگفت که gotoxy منسوخ شده ولی خوب اگه اینطور هم باشه قبلا که استفاده میشده پس الان هم باید بشه استفاده کرد.
اینم سورس:


#include <iostream>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
//using namespace std;
const int num_book=100;
/*struct struc_book{
char book_name[20];
char book_auther[20];
char book_writer[20];
int books_number;
}s_book[num_book];*/
class lib{
public:
int menue_select(void);
int find_free(void);
void list_all(void),init_list_all(void);
void delete_book(void);
//save(********);
//restore(**********);
void enter(void);
private:
struct struc_book{
char book_name[20];
char book_auther[20];
char book_writer[20];
int books_number;
}s_book[num_book];
};
int lib::menue_select(void)
{
char s[10];
int c;
gotoxy(29,6);
cout <<"(1).Entering data";
gotoxy(29,8);
cout<<"(2).Deleting data";
gotoxy(29,10);
cout<<"(3).List all data";
gotoxy(29.12);
cout<<"(4). Quit ";
do{
gotoxy(24,15);
cout<<"Please enter your choice(1-4):";
cin>>s;
c=atoi(s);
}while(c<0||c>4);
return (c);
}
void lib::enter (void)
{
int slot;
char s[80];
slot=find_free();
if(slot==-1){
cout<<"\nList full";
return ;
}
gotoxy(5,17);
cout<<"Enter book name";
cin.get(s_book[slot].book_name,19);
gotoxy(40,17);
cout<<"Enter book authet:";
cin.get(s_book[slot].book_auther,19);
gotoxy(5,19);
cin.get(s_book[slot].book_writer,19);
s_book[slot].books_number=slot;
}
int lib::find_free(void)
{
register int t;
for(t=0;s_book[t].book_name[0]
&&t<num_book;++t);
if(t==num_book) return -1;
return t;
}
void lib::delete_book(void)
{
int slot;
gotoxy(28,19);
cout<<"enter record #(0-99):";
cin>>slot;
if(slot>=0&&slot<num_book)
s_book[slot].book_name[0]='\0';
}
void lib::list_all(void)
{
register int t;
int r=0;
char ch;
gotoxy(25,2);
cout<<"all information in list are:";
gotoxy(13,3);
cout<<"********";
gotoxy(10,4);
cout<<"name auther writer number";
gotoxy(10,5);
cout<<" ";
for(t=0;t<num_book;++t){
if(s_book[t].book_name[0]){
gotoxy(14,6+r);
cout<<s_book[t].book_name;
gotoxy(26,6+r);
cout<<s_book[t].book_auther;
gotoxy(40,6+r);
cout<<s_book[t].book_writer;
gotoxy(54,6+r);
cout<<s_book[t].books_number;
r++;
}
}
gotoxy(13,6+r);
cout<<"********";
gotoxy(27,7+r);
cout<<"press any key to continue";
getch();
}
void lib::init_list_all(void)
{
register int t;
for(t=0;t<num_book;++t)
s_book[t].book_name[0]='\0';
}
int main ( )
{
lib ketab;
char a;
for(;;){
a=ketab.menue_select();
switch(a){
case 1: ketab.enter();
break;
case 2:ketab.delete_book();
break;
case 3:ketab.list_all();
break;
case 4:exit(0);
return 0;
}
}
}

deopen
جمعه 20 شهریور 1388, 04:06 صبح
خود تابع gotoxy از استاندارد فعلی حذف شده است ولی جایگزین آن setCursorPosition می باشد که 2 آرگومان میگیرد, یکی هندل خروجی که با استفاده از getStdHandle بدست می آید و یکی دیگر داده ای از نوع coord که دارای مختصات می باشد , در برنامه زیر gotoxy را شبیه سازی کردم :

#include<iostream>
using std::cout;

#include<conio.h>


#include <windows.h>

void gotoxy ( short x, short y )
{
COORD coord = {x, y};
SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );
}


int main() {

gotoxy(12,20);
cout<<"this is a test";
getch();

return 0;
}

deopen
جمعه 20 شهریور 1388, 04:11 صبح
پیشنهاد میکنم از کامپایلر VC++ 2008 express edition استفاده کنید , با توجه به رنگ کد شما بنظر از کامپایلر خوبی استفاده نکردید چون رنگها استاندارد نیستند.

armintirand
جمعه 20 شهریور 1388, 10:52 صبح
دوست عزیز از راه جالب شما تشکر میکنم و فعلا کارم راه می افته ولی مثلا اگه من میخواستم باری لینوکس این برنامه رو بنویسم با مشکل مواجه میشدم چون سورسم دیگه ÷ورتابل نبود(البته فکر کنم) برای اون موقع بجای gotoxy چی باید بذارم.
ممنون

Nima_NF
جمعه 20 شهریور 1388, 11:28 صبح
خود تابع gotoxy از استاندارد فعلی حذف شده است ولی جایگزین آن setCursorPosition می باشد که 2 آرگومان میگیردتصحیح کنم که gotoxy هیچ وقت جز استاندار نبوده که اکنون حذف شده باشد، این یک تابع بود که در زمان DOS توسط کتابخانه های همراه برلند منتشر می شد.



دوست عزیز از راه جالب شما تشکر میکنم و فعلا کارم راه می افته ولی مثلا اگه من میخواستم باری لینوکس این برنامه رو بنویسم با مشکل مواجه میشدم چون سورسم دیگه ÷ورتابل نبود(البته فکر کنم) برای اون موقع بجای gotoxy چی باید بذارم.برای سیستم عامل های 32/64 بیتی امروزی باید از API های مخصوص کنسول همان سیستم عامل استفاده کنید که در ویندوز setCursorPosition هست. در لینوکس هم روش های مختلفی در اینترنت دیدم:




void gotoxy(int x, int y)
{
printf("\033[%d;%df", y, x);
fflush(stdout);
}

یا
تابع move در <curses.h>
یا
یک command با نام tput

armintirand
جمعه 20 شهریور 1388, 23:49 عصر
دوست عزیز این برام خیلی مهم بود حتما تو اولین زمان تستش میکنم.

armintirand
شنبه 21 شهریور 1388, 19:05 عصر
خود تابع gotoxy از استاندارد فعلی حذف شده است ولی جایگزین آن setCursorPosition می باشد که 2 آرگومان میگیرد, یکی هندل خروجی که با استفاده از getStdHandle بدست می آید و یکی دیگر داده ای از نوع coord که دارای مختصات می باشد , در برنامه زیر gotoxy را شبیه سازی کردم :

#include<iostream>
using std::cout;

#include<conio.h>


#include <windows.h>

void gotoxy ( short x, short y )
{
COORD coord = {x, y};
SetConsoleCursorPosition ( GetStdHandle ( STD_OUTPUT_HANDLE ), coord );
}


int main() {

gotoxy(12,20);
cout<<"this is a test";
getch();

return 0;
}
میشه به صورت جزیی تر این api رو توضیح بدید.
ممنون