פורסם: 20/05/2015 - 09:49
נושא ההודעה: שפת C | מחפש תחליף ל-conio.h בלינוקס
|
אני הבנתי ש-conio.h היא ספרייה של DOS ולכן היא אינה קיימת בלינוקס. אך לצערי לא הצלחתי להפעיל משהו אחר במקומה. בחיפוש קצר בברווז מצאתי את הספריות: curses/ncurses. אך גם הם לא "נמצאו" במהדר. וזה למרות שמחיפוש קצר במנהל החבילות העלה שהן מותקנות (אבל יכול להיות שחסר משהו).
אני די מתחיל וזה הקוד שקיבלתי בספר ואני צריך עזרה כדי להסב אותו למשהו תקין ועובד תחת לינוקס.
קוד: | #include <stdio.h>
#include <conio.h>
#include <dos.h>
int main(int argc, char **argv)
{
int i;
clrscr();
for(i=1;i<=80;i++){
gotoxy(i,1);
putchar('*');
gotoxy(i,20);
putchar('*');
}
for(i=2;i<20;i++){
gotoxy(1,i);
putchar('*');
gotoxy(80,i);
putchar('*');
}
for(i=70;i>5;i--){
gotoxy(i,10);
printf("Hello ");
delay(30);
}
return 0;
} |
תודה מראש לעוזרים!
|
|
חזרה לתוכן הדיון |
פורסם: 20/05/2015 - 10:15
נושא ההודעה:
|
|
|
חזרה לתוכן הדיון |
פורסם: 20/05/2015 - 14:49
נושא ההודעה:
|
לא מה ששאלת אבל פתרון טוב יותר:
תלמד מספר נורמלי, לדוגמה K&R The C Programming Language
או משהו כזה, ולא מספר שמלמד אותך על דוס...
|
|
חזרה לתוכן הדיון |
פורסם: 20/05/2015 - 17:39
נושא ההודעה:
|
Anonymous : | לא מה ששאלת אבל פתרון טוב יותר:
תלמד מספר נורמלי, לדוגמה K&R The C Programming Language
או משהו כזה, ולא מספר שמלמד אותך על דוס... |
הוא לומד מהספר "ללמוד C" שבאופן כללי הוא ספר מעולה, חוץ מהספריה הזאת, אבל זה בקטנה, בייחוד שהספר בעברית וזה לא מובן מאליו.
|
|
חזרה לתוכן הדיון |
פורסם: 20/05/2015 - 22:04
נושא ההודעה:
|
|
|
חזרה לתוכן הדיון |
פורסם: 21/05/2015 - 11:16
נושא ההודעה:
|
לכל המתעניינים, כן אני לומד מהספר בעברית של הוד עמי (מהדורה 3), וזה לא פעם ראשונה שאני נתקל "בחומר" שקיים רק בחלונות. בד"כ אני מוצא פתרון במקרה הזה דרוש קצת יותר ידע בשפת C תקנית. למרות הפתרונות שמצאתי וקיבלתי הקוד מסרב לעבוד. אני אחזור לזה בהמשך מה גם שזה לא כל-כך חשוב לדעתי לפחות.
ולמי שיכול לעזור לי זה הקוד שיצא לי (לא לצחוק... ניסיתי לגבש קוד ראוי מרחבי הברווז זה מה יצא )
קוד: | #include <stdio.h>
#include <curses.h>
#include <unistd.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int i;
system("clear");
for(i=1;i<=80;i++){
move(i,1);
putchar('*');
move(i,20);
putchar('*');
}
for(i=2;i<20;i++){
move(1,i);
putchar('*');
move(80,i);
putchar('*');
}
for(i=70;i>5;i--){
move(i,10);
printf("Hello ");
sleep(30);
}
return 0;
} |
|
|
חזרה לתוכן הדיון |
פורסם: 21/05/2015 - 12:11
נושא ההודעה:
|
ראשית, כדאי לך לקרוא ל- initscr כשמתחילים לעבוד עם curses.
לאחר מכן אין צורך להריץ פקודת clear, זה מאוד "יקר". אתה יכול פשוט לקרוא ל- clear של curses עצמו (ולאחר מכן refresh).
|
|
חזרה לתוכן הדיון |
פורסם: 21/05/2015 - 12:57
נושא ההודעה:
|
על איזו הפצה אתה עובד?
ב-Debian, Ubuntu ושאר המשפחה הזו, קבצי הכותר (h) של הספריות והתיעוד שלהן מופרדות מחבילה המכילה את הבינארי (so) של הספרייה עצמה, כך שאם אתה רוצה לקמפל יישום שמשתמש בספרייה מסוימת, עליך להתקין את חבילת הפיתוח שלה, שבד"כ נקראת כמו החבילה המקורית בתוספת dev-
ספציפית לגבי ncurses אתה צריך את libncurses5-dev זאת כאמור על מערכת מבוססת Debian.
אני אל בטוח מה שיטת השמות הנהוגה בהפצות RPM ואחרות.
--לב
|
|
חזרה לתוכן הדיון |
פורסם: 21/05/2015 - 14:32
נושא ההודעה:
|
ראיתי שהשואל הראשון פתר בעצמו את השאלה בעזרת curses. לדעתי זה באמת הפיתרון היותר טוב. אני מביא פה גם פתרון ללא ספריה חיצונית, המבוסס על תקן ecma. הפתרון הזה יעבוד רק במסופים שמקיימים את התקן, אבל רוב המסופים בלינוקס מקיימים את התקן. כדי לבצע פעולה במסוף ( ניקוי, הזזת סמן ... ) שולחים תו esc ואח"כ את הפקודה.
קוד: | #include <stdio.h>
/* ECMA-48 Control Sequence Introducer - ESC[ */
#define CSI "\033["
/* 2J - clear the screen */
void clrscr() {
printf("%s2J", CSI);
}
/* (row);(col)H - move cursor */
void gotoxy(int x, int y) {
printf("%s%d;%dH", CSI, y, x);
}
int main(int argc, char* argv[])
{
clrscr();
gotoxy(10,2);
printf("hello world\n");
return 0;
} |
על התקן והפקודות בויקיפדיה:
http://en.wikipedia.org/wiki/ANSI_escape_code
|
|
חזרה לתוכן הדיון |
פורסם: 22/05/2015 - 11:25
נושא ההודעה:
|
מה שאומר שהפתרון הבא "אמור" לעבוד בכל מקום (מתקמפל אצלי בלינוקס, ואחרי תיקונים מחדש ייתכן ויעבוד חלונות).\ קוד: |
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
#include <curses.h>
#include <unistd.h>
#elif __linux__
/* ECMA-48 Control Sequence Introducer - ESC[ */
#define CSI "\033["
/* 2J - clear the screen */
void clrscr() {
printf("%s2J", CSI);
}
/* (row);(col)H - move cursor */
void gotoxy(int x, int y) {
printf("%s%d;%dH", CSI, y, x);
}
#endif
int main(int argc, char **argv)
{
int i;
clrscr();
for(i=1;i<=80;i++){
gotoxy(i,1);
putchar('*');
gotoxy(i,20);
putchar('*');
}
for(i=2;i<20;i++){
gotoxy(1,i);
putchar('*');
gotoxy(80,i);
putchar('*');
}
for(i=70;i>5;i--){
gotoxy(i,10);
printf("Hello ");
sleep(30);
}
return 0;
} |
|
|
חזרה לתוכן הדיון |
פורסם: 22/05/2015 - 13:17
נושא ההודעה:
|
|
|
חזרה לתוכן הדיון |
פורסם: 22/05/2015 - 14:50
נושא ההודעה:
|
Anonymous : | oz_nahum : |
אלוהים אדירים, אל תלמד C מהספר הזה. זה אולי אחד הספרים הגרועים ביותר למתחילים. ובאופן כללי זה ספר מיושן, ששווה לקרוא במחלקה לארכיאולוגיה.
הספר הזה הוא נהדר בתור מדריך לאיך דברים עובדים, אי אפשר להכחיש. אבל הוא משעמם, והסטנדרט של סי השתנה המון מאז שהספר הזה נכתב. ועל כן, אל תלמד מהספר הזה. |
אתה יכול לציין שלושה דברים שהשתמשת בהם ב-C בשנה האחרונה ושלא קיימים ב-K&R?
ההבדלים בין התקנים האחרונים לבין ANSI C הם קטנים מאוד. יכולת להגדיר משתנים באמצע בלוק, מערכים בגודל משתנה, איתחול של structs על פי שם. לא עולה בדעתי עוד דברים. כל השפה עצמה מתפקדת בדיוק כמו ש-K&R (המהדורה השניה, כמובן) מגדיר. את ההבדלים האלו אתה משלים בחמש דקות.
שחר |
בדיוק. יש עוד כמה הבדלים קלים גם בקדם-מהדר, ועוד כמה פונקציות ספריה, אבל כמו שאמרת, לא משהו שאי אפשר להשלים.
בנוגע לספר עצמו: הוא קצר מאוד, וממש לא משעמם. קראתי אותו בתור מתחיל, ושוב בתור מתכנת מנוסה, הוא היה טוב בשני המקרים.
|
|
חזרה לתוכן הדיון |
|