انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: 🇬🇧بریتانیای کبیر🇬🇧 در 03 خرداد 1401، 02:22 بظ
-
سلام. چرا وقتی از getche و getch استفاده میکنم خطای عجيبی میده ولی در ویندوز با همین کد خطایی نمیده؟
زبان سی
لینوکس کالی
جی سی سی
main()
{
char a;
a=getche();
}
[/size]
-
خب خطارو بفرستید تا بدونیم چی شده
-
خب خطارو بفرستید تا بدونیم چی شده
1 | main()
| ^~~~
main.c: In function ‘main’:
main.c:4:7: warning: implicit declaration of function ‘getche’ [-Wimplicit-function-declaration]
4 | a=getche();
| ^~~~~~
/usr/bin/ld: /tmp/ccJGeMlF.o: in function `main':
main.c:(.text+0x12): undefined reference to `getche'
collect2: error: ld returned 1 exit status
-
لطفاً موضوع رو ویرایش کنید و با قلم درستی بنویسید که بشه خوند. همچنین بگید که دارید به چه زبانی کد مینویسید و محیطتون چیه. متن کد و متن خطا هم فراموش نشه.
-
لطفاً موضوع رو ویرایش کنید و با قلم درستی بنویسید که بشه خوند. همچنین بگید که دارید به چه زبانی کد مینویسید و محیطتون چیه. متن کد و متن خطا هم فراموش نشه.
کد و متن خطا را قرار دادم و زبان هم زبان سی است و بستر هم لینوکس کالی با gcc 10
-
پس include اش کجاست؟
اینو به اول کد برنامه اضافه کنید.
#include <stdio.h>
چرا نوع تابع main مشخص نشده؟ main معمولا از جنس int هست.
فکر کنم زیادی به IDE عادت کردید چون معمولا IDE خودش اول کار stdio.h رو include میکنه، تابع main رو از جنس int تعریف میکنه، یه return 0 هم آخر تابع main قرار میده.
-
پس include اش کجاست؟
اینو به اول کد برنامه اضافه کنید.
#include <stdio.h>
چرا نوع تابع main مشخص نشده؟ main معمولا از جنس int هست.
فکر کنم زیادی به IDE عادت کردید چون معمولا IDE خودش اول کار stdio.h رو include میکنه، تابع main رو از جنس int تعریف میکنه، یه return 0 هم آخر تابع main قرار میده.
اینا اصلا مهم نیست و مربوط میشه به نوع استاندارد برنامه نویسی. من تا حالا چند تا برنامه را اینجوری کامپایل و اجرا هم کردم ولی نمیدونم چرا تابع getche و getch در لینوکس خطا ایجاد میکنه ولی در ویندوز با همین کد و کامپایلر خطایی نمیده؟
-
خب اگه چنین برنامهای اجرا شده، مشکل از کامپایلر بوده.
برای استفاده از خانوادهٔ getch در gcc باید از کتابخونهٔ ncurses استفاده کنی:
https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/scanw.html
-
ابتدا برنامه را اصلاح کنید و تورفتگیها را رعایت کنید.
main()
{
char a;
a=getche();
}
بهتر بود دستور کامپایل را هم مینوشتید.
$ gcc -Wall code.c -o code
اجرا با
./code
به هشدارهای کامپایلر توجه کنید.
اگر میخواهید فقط یک کاراکتر از ورودی بخوانید برنامه را به این شکل اصلاح کنید.
#include <stdio.h>
int main()
{
char a=0;
a=getchar();
printf("you enter: %c", a);
return 0;
}
تابع getch در هیچ استانداردی از زبان C وجود نداره نباید از اون استفاده کنید.
تابع استاندارد getchar است.
برای اطلاعات بیشتر صفحهٔ man را ببینید.
man getchar
NAME
fgetc, fgets, getc, getchar, ungetc - input of characters and strings
SYNOPSIS
#include <stdio.h>
int fgetc(FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int getc(FILE *stream);
int getchar(void);
int ungetc(int c, FILE *stream);
DESCRIPTION
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF
on end of file or error.
getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream
more than once.
getchar() is equivalent to getc(stdin).
اگر کتب یا منابع شما به شکل نخستین برنامه است توصیه میکنم در اونها تجدید نظر کنید.
اینجا (https://forum.ubuntu-ir.org/index.php?topic=150453.msg1169817#msg1169817) دو منبع معرفی شده است.
کتاب زیر هم میتونم به اون دو تا اضافه کنم.
Modern C for Absolute Beginners
A Friendly Introduction to the C Programming Language
Slobodan Dmitrović
Apress
-
اینا اصلا مهم نیست و مربوط میشه به نوع استاندارد برنامه نویسی. من تا حالا چند تا برنامه را اینجوری کامپایل و اجرا هم کردم ولی نمیدونم چرا تابع getche و getch در لینوکس خطا ایجاد میکنه ولی در ویندوز با همین کد و کامپایلر خطایی نمیده؟
اینا خیلی مهمه. من هیچ جایی ندیدم اینجوری کد c بنویسند و کامپایل بشه، چجوری میگید به استاندارد برنامهنویسی ربط داره؟
-
اینا اصلا مهم نیست و مربوط میشه به نوع استاندارد برنامه نویسی. من تا حالا چند تا برنامه را اینجوری کامپایل و اجرا هم کردم ولی نمیدونم چرا تابع getche و getch در لینوکس خطا ایجاد میکنه ولی در ویندوز با همین کد و کامپایلر خطایی نمیده؟
اینا خیلی مهمه. من هیچ جایی ندیدم اینجوری کد c بنویسند و کامپایل بشه، چجوری میگید به استاندارد برنامهنویسی ربط داره؟
منظور من این بود که این ها بله که مهمه ، صد درصد هم مهمه ولی برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست و البته این چیزایی که حتما باید تابع تعيين نوع بشه و مثلا تهش یک مقداری را برگرداند مربوط به استاندارد ها است. تازه من تازه شروع کردم و تو همه چیز نوبم ((:
-
برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست
به نظر میاد هنوز با پایههای زبان سی آشنا نیستید. پیشنهاد میکنم برنامهنویسی سی رو با یک کتاب دیگه شروع کنید. همچنین از یک توزیع معقول مثل اوبونتو یا دبیان برای کار استفاده کنید.
-
این فاصله ها به نظر معنی دار نیستن ، چون هردو رو امتحان کردم یک خروجی رو داد.
#include <stdio.h>
int main()
{
char a=0;
a=getchar();
printf("you enter: %c", a);
return 0;
}
-
برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست
به نظر میاد هنوز با پایههای زبان سی آشنا نیستید. پیشنهاد میکنم برنامهنویسی سی رو با یک کتاب دیگه شروع کنید. همچنین از یک توزیع معقول مثل اوبونتو یا دبیان برای کار استفاده کنید.
ممنون از توصیه تون. در ادامه کتابی که دارم میخونم به این ها هم میرسم. کالی را انتخاب کردم چون هم سبک تره هم ابزار های خوبی را داره
-
اصلا انتخاب درستی نیست! تو کالی ابزار های خیلی اضافه ای هست و نصبش در بیرون از ماشین مجازی کار درستی نیست مگر در شرایط خاص، پیشنهاد من اوبونتو هست.
-
منظور من این بود که این ها بله که مهمه ، صد درصد هم مهمه ولی برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست و البته این چیزایی که حتما باید تابع تعيين نوع بشه و مثلا تهش یک مقداری را برگرداند مربوط به استاندارد ها است. تازه من تازه شروع کردم و تو همه چیز نوبم ((:
توی c، نوع تابع حتما باید تعیین بشه وگرنه کامپایلر خطا میده. اگه نمیخواهید یه تابع چیزی رو برگردونه، از جنس void تعریفش کنید. هرچند یکم عجیبه که تابع main از جنس void تعریف بشه چون چیزی که برنامه رو اجرا میکنه انتظار داره که برنامه بعد از به پایان رسیدن یه مقداری رو برگردونه.
این فاصله ها به نظر معنی دار نیستن ، چون هردو رو امتحان کردم یک خروجی رو داد.
#include <stdio.h>
int main()
{
char a=0;
a=getchar();
printf("you enter: %c", a);
return 0;
}
از نظر کامپایلر c، اون اولی با این چیزی که الان نوشتید هیچ فرقی ندارند. خوندن و متوجه شدن اولی راحتتره.
کالی را انتخاب کردم چون هم سبک تره هم ابزار های خوبی را داره
در مورد سبک بودن فکر کنم درست میگید چون کالی از میزکار (تا حدودی همون محیط گرافیکی ولی نه دقیقا) xfce استفاده میکنه. xfce هم یکی از میزکارهای سبک هست.
ولی در مورد ابزارهاش، همه اون ابزارها رو میتونید روی بقیه توزیعها هم نصب کنید. خیلی از اون ابزارها برای تست نفوذ و اینجور کارها هستند که بعیده به درد شما بخورند.
-
ممنون از توصیه تون. در ادامه کتابی که دارم میخونم به این ها هم میرسم.
اگه اون کتاب گفته «برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست»، کتاب غلطیه و بهتره هرچه زودتر بندازیش تو سطل آشغال و یه کتاب درست رو بخونی.