انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: 🇬🇧بریتانیای کبیر🇬🇧 در 03 خرداد 1401، 02:22 ب‌ظ

عنوان: خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 03 خرداد 1401، 02:22 ب‌ظ

سلام. چرا وقتی از getche و getch  استفاده می‌کنم خطای عجيبی  میده ولی در ویندوز با همین کد خطایی نمیده؟
زبان سی
لینوکس کالی
جی سی سی
main()
{
char a;
a=getche();
}
[/size]
عنوان: پاسخ : خطا هنگام استفاده از getche و getch
ارسال شده توسط: ɴɪᴍᴀ در 03 خرداد 1401، 02:35 ب‌ظ
خب خطارو بفرستید تا بدونیم چی شده
عنوان: پاسخ : خطا هنگام استفاده از getche و getch
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 03 خرداد 1401، 02:43 ب‌ظ
خب خطارو بفرستید تا بدونیم چی شده
    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
عنوان: پاسخ : خطا هنگام استفاده از getche و getch
ارسال شده توسط: دانیال بهزادی در 03 خرداد 1401، 02:45 ب‌ظ
لطفاً موضوع رو ویرایش کنید و با قلم درستی بنویسید که بشه خوند. هم‌چنین بگید که دارید به چه زبانی کد می‌نویسید و محیطتون چیه. متن کد و متن خطا هم فراموش نشه.
عنوان: پاسخ : خطا هنگام استفاده از getche و getch
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 03 خرداد 1401، 05:06 ب‌ظ
لطفاً موضوع رو ویرایش کنید و با قلم درستی بنویسید که بشه خوند. هم‌چنین بگید که دارید به چه زبانی کد می‌نویسید و محیطتون چیه. متن کد و متن خطا هم فراموش نشه.
کد و متن خطا را قرار دادم و زبان هم زبان سی است و بستر هم لینوکس کالی با gcc 10
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: Dragon- در 03 خرداد 1401، 06:06 ب‌ظ
پس include اش کجاست؟
اینو به اول کد برنامه اضافه کنید.
#include <stdio.h>چرا نوع تابع main مشخص نشده؟ main معمولا از جنس int هست.
فکر کنم زیادی به IDE عادت کردید چون معمولا IDE خودش اول کار stdio.h رو include می‌کنه، تابع main رو از جنس int تعریف می‌کنه، یه return 0 هم آخر تابع main قرار میده.
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 03 خرداد 1401، 06:24 ب‌ظ
پس include اش کجاست؟
اینو به اول کد برنامه اضافه کنید.
#include <stdio.h>چرا نوع تابع main مشخص نشده؟ main معمولا از جنس int هست.
فکر کنم زیادی به IDE عادت کردید چون معمولا IDE خودش اول کار stdio.h رو include می‌کنه، تابع main رو از جنس int تعریف می‌کنه، یه return 0 هم آخر تابع main قرار میده.
اینا اصلا مهم نیست و مربوط میشه به نوع استاندارد برنامه نویسی. من تا حالا چند تا برنامه را اینجوری کامپایل و اجرا هم کردم ولی نمی‌دونم چرا تابع getche و getch در لینوکس خطا ایجاد میکنه ولی در ویندوز با همین کد و کامپایلر  خطایی نمیده؟
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: دانیال بهزادی در 04 خرداد 1401، 01:57 ق‌ظ
خب اگه چنین برنامه‌ای اجرا شده، مشکل از کامپایلر بوده.
برای استفاده از خانوادهٔ getch در gcc باید از کتابخونهٔ ncurses استفاده کنی:
https://tldp.org/HOWTO/NCURSES-Programming-HOWTO/scanw.html
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: esmaeelE در 04 خرداد 1401، 02:55 ق‌ظ
ابتدا برنامه را اصلاح کنید و تورفتگی‌ها را رعایت کنید.

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 در لینوکس کالی
ارسال شده توسط: Dragon- در 05 خرداد 1401، 07:25 ب‌ظ
اینا اصلا مهم نیست و مربوط میشه به نوع استاندارد برنامه نویسی. من تا حالا چند تا برنامه را اینجوری کامپایل و اجرا هم کردم ولی نمی‌دونم چرا تابع getche و getch در لینوکس خطا ایجاد میکنه ولی در ویندوز با همین کد و کامپایلر  خطایی نمیده؟
اینا خیلی مهمه. من هیچ جایی ندیدم اینجوری کد c بنویسند و کامپایل بشه، چجوری میگید به استاندارد برنامه‌نویسی ربط داره؟
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 05 خرداد 1401، 08:02 ب‌ظ
اینا اصلا مهم نیست و مربوط میشه به نوع استاندارد برنامه نویسی. من تا حالا چند تا برنامه را اینجوری کامپایل و اجرا هم کردم ولی نمی‌دونم چرا تابع getche و getch در لینوکس خطا ایجاد میکنه ولی در ویندوز با همین کد و کامپایلر  خطایی نمیده؟
اینا خیلی مهمه. من هیچ جایی ندیدم اینجوری کد c بنویسند و کامپایل بشه، چجوری میگید به استاندارد برنامه‌نویسی ربط داره؟
منظور من این بود که این ها بله که مهمه ، صد درصد هم مهمه ولی برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست و البته این چیزایی که حتما باید تابع تعيين نوع بشه و مثلا تهش یک مقداری را برگرداند مربوط به استاندارد ها است. تازه من تازه شروع کردم و تو همه چیز نوبم  ((:
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: nixoeen در 05 خرداد 1401، 08:29 ب‌ظ
برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست
به نظر میاد هنوز با پایه‌های زبان سی آشنا نیستید. پیشنهاد می‌کنم برنامه‌نویسی سی رو با یک کتاب دیگه شروع کنید. همچنین از یک توزیع معقول مثل اوبونتو یا دبیان برای کار استفاده کنید.
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: #unknown# در 05 خرداد 1401، 09:07 ب‌ظ
این فاصله ها به نظر معنی دار نیستن ، چون هردو رو امتحان کردم یک خروجی رو داد.
#include <stdio.h>
int main()
{
char a=0;
a=getchar();
printf("you enter: %c", a);
return 0;
}
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: 🇬🇧بریتانیای کبیر🇬🇧 در 05 خرداد 1401، 09:12 ب‌ظ
برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست
به نظر میاد هنوز با پایه‌های زبان سی آشنا نیستید. پیشنهاد می‌کنم برنامه‌نویسی سی رو با یک کتاب دیگه شروع کنید. همچنین از یک توزیع معقول مثل اوبونتو یا دبیان برای کار استفاده کنید.
ممنون از توصیه تون. در ادامه کتابی که دارم می‌‌خونم به این ها هم می‌رسم. کالی را انتخاب  کردم چون هم سبک تره هم ابزار های خوبی را داره
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: ɴɪᴍᴀ در 05 خرداد 1401، 10:08 ب‌ظ
اصلا انتخاب درستی نیست! تو کالی ابزار های خیلی اضافه ای هست  و نصبش در بیرون از ماشین مجازی کار درستی نیست مگر در شرایط خاص، پیشنهاد من اوبونتو هست.
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: Dragon- در 06 خرداد 1401، 12:39 ق‌ظ
منظور من این بود که این ها بله که مهمه ، صد درصد هم مهمه ولی برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست و البته این چیزایی که حتما باید تابع تعيين نوع بشه و مثلا تهش یک مقداری را برگرداند مربوط به استاندارد ها است. تازه من تازه شروع کردم و تو همه چیز نوبم  ((:
توی c، نوع تابع حتما باید تعیین بشه وگرنه کامپایلر خطا میده. اگه نمی‌خواهید یه تابع چیزی رو برگردونه، از جنس void تعریفش کنید. هرچند یکم عجیبه که تابع main از جنس void تعریف بشه چون چیزی که برنامه رو اجرا می‌کنه انتظار داره که برنامه بعد از به پایان رسیدن یه مقداری رو برگردونه.

این فاصله ها به نظر معنی دار نیستن ، چون هردو رو امتحان کردم یک خروجی رو داد.
#include <stdio.h>
int main()
{
char a=0;
a=getchar();
printf("you enter: %c", a);
return 0;
}
از نظر کامپایلر c، اون اولی با این چیزی که الان نوشتید هیچ فرقی ندارند. خوندن و متوجه شدن اولی راحت‌تره.

کالی را انتخاب  کردم چون هم سبک تره هم ابزار های خوبی را داره
در مورد سبک بودن فکر کنم درست میگید چون کالی از میزکار (تا حدودی همون محیط گرافیکی ولی نه دقیقا) xfce استفاده می‌کنه. xfce هم یکی از میزکار‌های سبک هست.
ولی در مورد ابزارهاش، همه اون ابزار‌ها رو می‌تونید روی بقیه توزیع‌ها هم نصب کنید. خیلی از اون ابزار‌ها برای تست نفوذ و اینجور کار‌ها هستند که بعیده به درد شما بخورند.
عنوان: پاسخ : خطا هنگام استفاده از getche در لینوکس کالی
ارسال شده توسط: دانیال بهزادی در 06 خرداد 1401، 12:01 ب‌ظ
ممنون از توصیه تون. در ادامه کتابی که دارم می‌‌خونم به این ها هم می‌رسم.
اگه اون کتاب گفته «برای برنامه های بسیار ساده زمیمه کردن فایل های هیدر مهم نیست»، کتاب غلطیه و بهتره هرچه زودتر بندازیش تو سطل آشغال و یه کتاب درست رو بخونی.