PDA

View Full Version : مشکل در گرافیک



mohamad007
پنج شنبه 31 فروردین 1385, 05:26 صبح
سلام خسته نباشید:
با Turbo C++ 3.0 تحت داس یک برنامۀ خیلی سادۀ گرافیکی در حد باز کردن صفحۀ گرافیکی

می نویسم. برنامه بدون غلط کامپایل می شود ولی وقتی می خواهم برنامه را Run کنم با Error

مواجه می شوم و کامپایلر پیام هایی مبنی بر عدم تعریف شدن توابعی مثل initgraph صادر می

کند .که روبروی آن نوشته شده Linker Error:این در حالیست که فایلBGI وفایل های

Header لازم در مسیر خود قرار دارند .لطفا بنده را راهنمایی کنید.

مهدی رحیم زاده
جمعه 01 اردیبهشت 1385, 21:01 عصر
بهتره که فایل Egavga.bgi رو در شاخه tc و شاخه Bin کپی کنی . بعد برنامه رو اجرا کن احتمالا درست بشه .
___________________________
www.iranmsb.pershianblog.com

Mahdi_Delphi
شنبه 02 اردیبهشت 1385, 08:55 صبح
پارامتر سوم تابع initgraph رو چی میدید ؟

باید این باشه "C:\\TC\\BGI"

یا میتونید این پارامتر رو خالی بزارید و همونطور که دوستمون گفتند فایل Egavga.bgi رو از پوشه BGI منتقل کنید به پوشه bin

daneshjoye_azad
پنج شنبه 14 اردیبهشت 1385, 18:21 عصر
سلام
ببین ، دستوراتی که لازم است شما وارد کنید تا موتور گرافیک را معرفی کنید به صورت زیر است...
int gdriver,gmode
initgraph(&gdriver,&gmode,"c:\\tc\\bgi

امیدوارم که این توضیح مشکل شما رو بر طرف کرده باشد.

active66
دوشنبه 18 اردیبهشت 1385, 23:45 عصر
حرف دانشجوی ازاد رو تا یید می کنم

hercules_3d
سه شنبه 19 اردیبهشت 1385, 16:27 عصر
با سلام
من یه مشکل اساسی در گرافیک داشتم . زمانی که میخواهم محتوی یه متغییر رو به خروجی ببرم رنگ default خاکستریه حالا اگه بخوام این رنگ رو تغییر بدم باید چیکار کنم؟ چون تابع setcolor رنگ اشکال یا رشته هایی که توسط outtext نشون داده میشه رو عوض میکنه ؟

Mahdi_Delphi
سه شنبه 19 اردیبهشت 1385, 18:38 عصر
مگه شما توی محیط گرافیک با چی متغیرتون رو به خروجی میبرید؟؟
در حالت متنی برای متن رنگی میتونید با استفاده از دستور textcolor یک رنگ برای خروجی در نظر بگیرید و با دستور cprintf متغیر رو نمایش بدید.
فقط باید سرفایل conio.h رو اینکلود کنید.
موفق باشید

hercules_3d
سه شنبه 19 اردیبهشت 1385, 19:00 عصر
با cout یا printf یا cprintf با هر کدوم از اینها تست کردم جواب نداد!
راستی تو محیط متنی چی میشه اگه متغیر رو با cout نشون داد (با textcolor)؟

Mahdi_Delphi
سه شنبه 19 اردیبهشت 1385, 19:21 عصر
با cout یا printf یا cprintf با هر کدوم از اینها تست کردم جواب نداد!

با cprintf حتما میشه. ولی متغیرتون باید رشته ای باشه.


textcolor(5);
cprintf("Mahdi_Delphi");

اینو امتحان کنید ببینید جواب میده یا نه.

Mahdi_Delphi
سه شنبه 19 اردیبهشت 1385, 19:22 عصر
راستی تو محیط متنی چی میشه اگه متغیر رو با cout نشون داد (با textcolor)؟
رنگش عوض نمیشه.

hercules_3d
چهارشنبه 20 اردیبهشت 1385, 05:47 صبح
من میخواهم این شکلی شه یعنی تو محیط گرافیک این کار رو بکنم
int n;
cin >> n;(با فرض اینکه محتوای د باشه 20)
setcolor(14);
cprintf("%d",n);

hercules_3d
چهارشنبه 20 اردیبهشت 1385, 05:49 صبح
در واقع چه طور میتونم محتوای رو رنگی نشون بدم؟(البته تو محیط گرافیکی)

Mahdi_Delphi
چهارشنبه 20 اردیبهشت 1385, 09:16 صبح
ببینید نوشتن و خواندن کاراکترها در محیط گرافیک شکلها رو خراب میکنه!
بهتره از outtext برای نمایش خروجی در حالت گرافیک استفاده کنید.
اگه هم خروجیتون رشته ای نبود میتونید به رشته تبدیلش کنید.
برای خوندن هم میتونید از یه حلقه و دستور getch استفاده کنید.

hercules_3d
پنج شنبه 21 اردیبهشت 1385, 07:17 صبح
شما گفتین که برای خوندن کاراکتر ها از getch() استفاده کنم حالا اگه بخواهم موقع وارد کردن کاراکتر ها اونا رو ؛ رو مونیتور ببینم باید از getche() استفاده کنم ولی با وجود استفاده از این تابع باز هم موقع وارد کردن کارکتر ها اونا رو نمی بینم چرا چنین اتفاقی می افته؟

Mahdi_Delphi
پنج شنبه 21 اردیبهشت 1385, 11:36 صبح
من خودم دو سال پیش با همین مشکل مواجه بودم و کلی فکرم رو درگیر کرده بود.
یه راهش اینه که کاراکترها رو با getch بگیری و بعد اونها رو به یه رشته اضافه کنی و اون رشته رو با outtext در محیط گرافیکی نمایش بدی.اون موقع کلی فکر کردم تا به این نتیجه رسیدم.
راه دیگش اینه که بی خیال خوندن در محیط گرافیکی بشی!
به جای اون محیط گرافیکی رو با دستورات textbackground و textcolor در محیط متنی شبیه سازی کنی.
مثلا textbackground رو آبی بزار و توی کل صفحه نمایش فضای خالی چاپ کن تا بک گراندت کلا آبی بشه.

ali_kolahdoozan
پنج شنبه 21 اردیبهشت 1385, 15:53 عصر
از cscanf و cprintf استفاده کنید

hercules_3d
پنج شنبه 21 اردیبهشت 1385, 16:02 عصر
خوب میشه عوض اینکه کل صفحه رو فضای خالی چاپ کرد این شکلی نوشت

#include <conio.h>
#include <iostream.h>
int main()
{
textbackground(3);
textcolor(14);
clrscr();
int n ;
cin>>n;
cout<<n;
getch();
return 0;}
حالا یه پشت زمینه آبی با رنگ فونت زرد داریم همون طور که می بینید خروجی رو با cout نشون دادم و رنگش هم عوض شده منتهامن دو تا مشکل با اینا دارم
1. اینکه وقتی میخواهم سه تا window رنگی برای ایجاد یه window سایه دار درست کنم(مثلا کل صفحه آبی بعد یه window مشکی برای ایجاد سایه و بعد یه window خاکستری به عنوان پنجره فعال ) موقعی که از رو خود کد ؛ برنامه رو اجرا میکنم جواب میده ولی وقتی از رو فایل اجرایی که ایجاد کرده بخواهم اجرا کنم فقط پنجره صورتی رو نشون میده اگه ممکنه یه نگاه به برنامه زیر بکنین تا متوجه حرفام بشین یه بار از رو کد اجرا کنید یه بار هم از رو فایل exe اجرا کنید
2. وقتی یه window با مختصاتی کوچکتر از مختصات اصلی تعریف میکنیم نباید بعد از تعریف این window هر عمل خوندن یا چاپ کردن داخل همون window جدید انجام شه؟؟؟ متاسفانه تو این برنامه رشته enter و خوندن عدد داخل window صورتی انجام میشه ولی چاپ اون عدد خارجه این window صورتیه !
من این کارا رو قبلا در پاسکال انجام داده بودم و مشکل 2 رو توش نداشتم حالا در++c چرا جواب نمیده خدا می دونه البته مشکل 1 رو قبلا هم در پاسکال داشتم:گریه:

hercules_3d
پنج شنبه 21 اردیبهشت 1385, 16:20 عصر
این برنامه رو در c++ تحت داس انجام بدین

#include <conio.h>
#include <iostream.h>
int main()
{
window (1,1,80,50);
textbackground(1);
clrscr();
window (6,5,78,48);
textbackground(0);
clrscr();
window (4,3,74,46);
textbackground(5);
clrscr();
int n ;
textcolor(14+128);
clrscr();
cout << "Enter : ";
cin>>n;
cout<<n;
getch();
return 0;}
آقا شدیدا به کمک نیاز دارم !!

hercules_3d
پنج شنبه 21 اردیبهشت 1385, 16:31 عصر
اقا cprintf و cscanf در محیط گرافیک جواب نمیده:گریه:

ali_kolahdoozan
پنج شنبه 21 اردیبهشت 1385, 16:42 عصر
اگه دوست داری یکبار درست منو حالیم کن می خواهی چیکار کنی تا مشگلت رو حل کنم

sasan_vm
پنج شنبه 21 اردیبهشت 1385, 17:03 عصر
اگه این کارت و راه میندازه میتونی
از کلاسهای اماده TurboVision استفاده کنی.

hercules_3d
پنج شنبه 21 اردیبهشت 1385, 17:20 عصر
ببینید علی آقا من می خواهم در محیط گرافیکی یه داده ای رو از کاربر بگیرم و اونو چاپ کنم البته این کار رو میشه با دستورات cin , cout انجام داد ولی با این دستورات رنگ فونت داده ای که کاربر وارد میکنه و اون داده ای که چاپ میشه خاکستریه و من میخواهم این رنگ رو عوض کنم که برای تعویض رنگ در محیط گرافیکی از setcolor استفاده میشه ولی این تابع فقط رنگ اشکال و رشته هایی که توسط outtext چاپ شده رو عوض میکنه و رنگ فونت خروجی که توسط cout نشون داده شده یا ورودی که توسط cin گرفته شده رو تغییر نمیده دستورات cprintf ,cscanf که اصلا در محیط گرافیک کار نمیکنه و وضعیت دستورات printf ,scanf هم مثل cin , cout هستش بازم تاکید میکنم که میخواهم این کارو تو محیط گرافیکی انجام بدم و برای انجام این کار در محیط متنی 2 تا مشکل دارم که اونا رو هم در پست قبلیم گفتم
امیدوارم که تونسته باشم سوالم رو فهمونده باشم

ali_kolahdoozan
پنج شنبه 21 اردیبهشت 1385, 17:28 عصر
نمیشه یه کلکی بزنی . اول در mode متنی به صورت رنگی بگیر . بعد محیط رو گرافیکی کن و نشونش بده . اگه محدودیت خاصی نداری این کار شدنی است

hercules_3d
پنج شنبه 21 اردیبهشت 1385, 18:02 عصر
نمیشه. اقای mahdi_delphi گفتن که این کارو با getche انجام بدم ولی این کار یه ایرادی داره اونم اینه که موقع خوندن ؛ نمیتونم کاراکتر هامو ببینم (البته در محیط گرافیکی نمیتونم ببینم ) ایشون برای حل این مشکل پیشنهاد دادن هر کاراکتری رو که میخونم با outtext نشون بدم ولی اگه بنا به دلایلی یکی از کاراکتر ها رو اشتباه وارد کنم و بخواهم پاک کنم خود کاراکتر پاک میشه ولی چاپ شدش نه!!!!!! حالا نمیشه تو محیط گرافیکی بدون هیچ کلکی این کارارو انجام بدم؟؟

ali_kolahdoozan
پنج شنبه 21 اردیبهشت 1385, 22:20 عصر
چرا نمیشه . شما در محیط text رنگی تایپ کنید و بعد می رید توی گرافیک . مگر اینکه این اتفاق مثلا وسط برنامه بخاد رخ بده . زود جواب بدید تا اگه اینطوره یک راه دیگه پیدا کنیم

hercules_3d
جمعه 22 اردیبهشت 1385, 09:11 صبح
من منظور شما رو فهمیدم ولی این کاری که گفتین به درد من نمیخوره !

Mahdi_Delphi
جمعه 22 اردیبهشت 1385, 10:23 صبح
نمیشه. اقای mahdi_delphi گفتن که این کارو با getche انجام بدم ولی این کار یه ایرادی داره اونم اینه که موقع خوندن ؛ نمیتونم کاراکتر هامو ببینم (البته در محیط گرافیکی نمیتونم ببینم ) ایشون برای حل این مشکل پیشنهاد دادن هر کاراکتری رو که میخونم با outtext نشون بدم ولی اگه بنا به دلایلی یکی از کاراکتر ها رو اشتباه وارد کنم و بخواهم پاک کنم خود کاراکتر پاک میشه ولی چاپ شدش نه!!!!!! حالا نمیشه تو محیط گرافیکی بدون هیچ کلکی این کارارو انجام بدم؟؟

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

Mahdi_Delphi
جمعه 22 اردیبهشت 1385, 10:27 صبح
اقای mahdi_delphi گفتن که این کارو با getche انجام بدم

من گفتم با getch نه با getche

ali_kolahdoozan
جمعه 22 اردیبهشت 1385, 10:37 صبح
خوب ایشون دنبال یه راه خیلی سادس حوصله این کارها رو نداره . احتمالا پروژه دانشجویی است . من دقیقا گرفتم چی میگید . راهتون درسته

hercules_3d
جمعه 22 اردیبهشت 1385, 12:38 عصر
ببینید بحث این که بخواهم کلکی در برنامه بزنم یا اینکه حوصله ندارم نیست (انجام دادن این کارا چیزی نیست که نیاز به حوصله داشته باشه ) من فقط میخواهم عین همون که تو محیط متنی میتونم با cin یه عدد یا رشته رو بخونم و خیلی راحت قبل از اینکه کلید اینتر رو زده باشم کاراکتر ها و اعداد نوشته شده رو با کلید بک اسپیس پاک کنم . راستی آقای mahdi_delphi اون برنامه ای رو که با textcolor و textbackground نوشتم تست کردین ؟ ممکنه جواب مشکلام رو بدین
با تشکر از لطف آقایون

Mahdi_Delphi
جمعه 22 اردیبهشت 1385, 16:18 عصر
ببینید بحث این که بخواهم کلکی در برنامه بزنم یا اینکه حوصله ندارم نیست (انجام دادن این کارا چیزی نیست که نیاز به حوصله داشته باشه ) من فقط میخواهم عین همون که تو محیط متنی میتونم با cin یه عدد یا رشته رو بخونم و خیلی راحت قبل از اینکه کلید اینتر رو زده باشم کاراکتر ها و اعداد نوشته شده رو با کلید بک اسپیس پاک کنم . راستی آقای mahdi_delphi اون برنامه ای رو که با textcolor و textbackground نوشتم تست کردین ؟ ممکنه جواب مشکلام رو بدین
با تشکر از لطف آقایون


حالا نمیشه تو محیط گرافیکی بدون هیچ کلکی این کارارو انجام بدم؟؟

من که گفتم در محیط گرافیکی چطور این کار رو بکنید !
اصلا اون روشی رو که گفتم پیاده سازی کردین؟
تابعش رو اینجا میزارم تا استفاده کنید .

اینم تابعی که من واسه خوندن رشته توی محیط گرافیکی نوشته بودم :


/*
Author: Mahdi Khosravi
Date : 1383/05/15
Description: This function read and show
a string in graphic mode.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This function needs follow headers :

#include<graphics.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prototype :

char* grcin(int,int,int,int=0);

*/

char* grcin(int x,int y,int color,int bkcolor=0)
{
char *str="",ch;
int temp=getcolor();
int size;
setcolor(color);
ch=getch();
while(ch != 13)
{
if(isalnum(ch))
{
size=strlen(str);
if(size<=254) //max length of a string
{
str[size]=ch;
str[size+1]='\0'; //adding ch to end of string
outtextxy(x,y,str); //showing string
}
}
else if(ch == 8)
{
setcolor(bkcolor);
outtextxy(x,y,str);
size=strlen(str);
if(size>=1)
str[size-1]='\0';
setcolor(color);
outtextxy(x,y,str);
}
ch=getch();

}//end of while

setcolor(temp);
return str;
}


این هم یه برنامه که از اون تابع استفاده کرده :


#include<iostream.h>
#include<graphics.h>
#include<conio.h>
#include<string.h>
#include<ctype.h>


char* grcin(int,int,int,int=0);

int main()
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"C:\\tc\\bgi");

setcolor(5);
rectangle(10,10,400,400);
circle(50,50,150);

char * s;
s=grcin(51,50,2);

cleardevice();
closegraph();
cout<<"string is >"<<s;

getch();

return 0;
}

char* grcin(int x,int y,int color,int bkcolor)
{
char *str="",ch;
int temp=getcolor();
int size;
setcolor(color);
ch=getch();
while(ch != 13)
{
if(isalnum(ch))
{
size=strlen(str);
if(size<=254) //max length of a string
{
str[size]=ch;
str[size+1]='\0'; //adding ch to end of string
outtextxy(x,y,str); //showing string
}
}
else if(ch == 8)
{
setcolor(bkcolor);
outtextxy(x,y,str);
size=strlen(str);
if(size>=1)
str[size-1]='\0';
setcolor(color);
outtextxy(x,y,str);
}
ch=getch();

}//end of while

setcolor(temp);
return str;
}


موفق باشد
مهدی

hercules_3d
جمعه 22 اردیبهشت 1385, 17:08 عصر
آقا مهدی از بابت این تابع ازت ممنونم
راستی یه سوال در مورد همین تابع که نوشتین تابع isalnum به چه دردی می خوره ببخشید این همه سوال میکنم !! آخه من تازه کارم و همش دو ماه شروع کردم
با توجه به بحث های شده به این نتیجه ی اخلاقی می رسم که در محیط گرافیکی نمی تونم با توابع cin , cout ورودی رو گرفته و خروجی رو چاپ کنم در حالی که رنگ فونت من چیزی غیر از خاکستری باشه !

Mahdi_Delphi
جمعه 22 اردیبهشت 1385, 17:18 عصر
آقا مهدی از بابت این تابع ازت ممنونم

قابلی نداشت.امتحانش کردی؟


راستی یه سوال در مورد همین تابع که نوشتین تابع isalnum به چه دردی می خوره ببخشید این همه سوال میکنم !! آخه من تازه کارم و همش دو ماه شروع کردم

این تابع باعث میشه فقط حروف الفبا و اعداد پذیرفته بشن.
به تناسب نیازتون میتونید این شرط رو تغییر بدید.
اگه توی دوماه این همه اطلاعات کسب کردید خیلی خوبه.


با توجه به بحث های شده به این نتیجه ی اخلاقی می رسم که در محیط گرافیکی نمی تونم با توابع cin , cout ورودی رو گرفته و خروجی رو چاپ کنم در حالی که رنگ فونت من چیزی غیر از خاکستری باشه !

کلا این دستورات گرافیکتون رو داغون میکنه.

hercules_3d
جمعه 22 اردیبهشت 1385, 17:33 عصر
بله امتحان کردم از لطفتون ممنون

mustang
دوشنبه 01 خرداد 1385, 17:27 عصر
من میدونم
برو توی
Options->Linker->Libraries
و بعد گزینه ی روبرو رو تیک بزن و بعد ok کن graphics library

prog_2006
دوشنبه 01 خرداد 1385, 21:58 عصر
تحت ویندوز نمیشه برنامه گرافیکی نوشت
من با visual c++ کار میکنم ولی موقع استفاده در توابع گرافیکی error میگیره با اینکه تمام توابع کتابخانه ایش در مسیرش قرار دارند