Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תיכנות בלינוקס - IDE טוב בשביל C

Anonymous - 13/06/2018 - 21:20
נושא ההודעה: IDE טוב בשביל C
אני לומד את C , ממש בהתחלה , עובר על הסינטקס הבסיסי ועובד עדיין עם המסוף .
NETBEANS תמיד היה לי הכי נוח , רק חבל שיש לי עכשיו בעיה קצת מוזרה איתו .
למשל קוד כזה .
קוד:
#include <stdio.h> 
int main() { 
  int age; 
   ineligible: 
   printf("You are not eligible to vote!\n"); 
 
   printf("Enter you age:\n"); 
   scanf("%d", &age); 
   if(age<18) 
        goto ineligible; 
   else 
        printf("You are eligible to vote!\n"); 
 
   return 0; 


אמור היה על ההתחלה להציג "הכנס את גילך " ומשום מה לא מציג אותו .
בעיה נוספת SCANF עד כמה שידוע לי קולט מחרוזת עד ENTER
ורק אחרי שאני לוחץ כמה פעמים על אנטר הוא סוף סוף ממשיך בקוד .

יש למישהו מושג מה יכולה להיות הבעיה ?
Anonymous - 14/06/2018 - 08:24
נושא ההודעה:
זה כי goto גרם למערכת שלך להתאבד.
Anonymous - 14/06/2018 - 10:09
נושא ההודעה:
goto היא הוראה ראויה ושימושית, רוב המשמיצים לא פגשו את הבעיות האמיתיות שלה אלא חוזרים באופן דתי על מה ששמעו. המאמר שכותרתו המקורית "A case against the goto statement" (ששונה ע"י עורך הג'ורנל לכותרת הקליק-בייט "goto considered harmful") דיבר על עולם אחר, שבו goto היא הצורה העיקרית לנהל זרימה של תוכנית, וברוב השפות, לא הייתה דרך לייצר בלוקים (ובקושי פונקציות).

בקרנל לינוקס, לדוגמא, יש כמה מאות שימושים ב- goto, ורובם מפשטים ומקצרים את הקוד משמעותית ביחס לאלטרנטיבה.

ולשאלתו של הפונה: יתכן שזה בגלל buffering שעושה netbeans, איני יודע. האם אותו הדבר קורה כאשר אתה מריץ את אותה פקודה מהטרמינל? (ללא redirection כמובן, כלומר, ללא שימוש בהוראות < | > וחברותיהן)

אם אתה מחפש IDE טוב ל- C, שווה לנסות את Visual Studio Code, למרות שהוא נכתב ע"י חברה עם אתיקה מפוקפקת ועבר פלילי - הוא בקוד פתוח לחלוטין, ועובד מצוין; באובונטו ניתן להתקין אותו בקלות ע"י umake. מומלץ מאוד לכבות telemetry אחרי שמתקינים אותו.
elcuco - 14/06/2018 - 14:16
נושא ההודעה:
Anonymous :
goto היא הוראה ראויה ושימושית, רוב המשמיצים לא פגשו את הבעיות האמיתיות שלה אלא חוזרים באופן דתי על מה ששמעו. המאמר שכותרתו המקורית "A case against the goto statement" (ששונה ע"י עורך הג'ורנל לכותרת הקליק-בייט "goto considered harmful") דיבר על עולם אחר, שבו goto היא הצורה העיקרית לנהל זרימה של תוכנית, וברוב השפות, לא הייתה דרך לייצר בלוקים (ובקושי פונקציות).

בקרנל לינוקס, לדוגמא, יש כמה מאות שימושים ב- goto, ורובם מפשטים ומקצרים את הקוד משמעותית ביחס לאלטרנטיבה.

ולשאלתו של הפונה: יתכן שזה בגלל buffering שעושה netbeans, איני יודע. האם אותו הדבר קורה כאשר אתה מריץ את אותה פקודה מהטרמינל? (ללא redirection כמובן, כלומר, ללא שימוש בהוראות < | > וחברותיהן)

אם אתה מחפש IDE טוב ל- C, שווה לנסות את Visual Studio Code, למרות שהוא נכתב ע"י חברה עם אתיקה מפוקפקת ועבר פלילי - הוא בקוד פתוח לחלוטין, ועובד מצוין; באובונטו ניתן להתקין אותו בקלות ע"י umake. מומלץ מאוד לכבות telemetry אחרי שמתקינים אותו.


חיבור שלו אל מערכת cmake לא טריויאלי. קראתי וקראתי, ולא הצלחתי ליישם.

מצד שני - אני יכול להמליץ על QtCreator.
Anonymous - 14/06/2018 - 15:43
נושא ההודעה: Re: IDE טוב בשביל C
יהודה :

אמור היה על ההתחלה להציג "הכנס את גילך " ומשום מה לא מציג אותו .
בעיה נוספת SCANF עד כמה שידוע לי קולט מחרוזת עד ENTER
ורק אחרי שאני לוחץ כמה פעמים על אנטר הוא סוף סוף ממשיך בקוד .

יש למישהו מושג מה יכולה להיות הבעיה ?


אמור זה שם של דג! Laughing

אני לא יודע למה אף אחד בשרשור עדיין לא אמר לך את זה, אבל הסיבה שיש לך בעיה עם הקוד היא שכתבת קוד לא נכון. נקודה.

לא משנה איזה IDE תפתח, התוצאה תהיה זהה.

אתה רשמת את שורת ההדפסה:
קוד:
printf("You are not eligible to vote!\n");


לפני הכל! לפני כל יתר הקוד שלך!

אז וודאי שהיא תופעל ראשונה, כי זה בדיוק מה שביקשת לעשות, אין פה שום שגיאה - מחשבים עדיין לא למדו לקרוא מחשבות.

באשר לבעיה שלך עם scanf, תן דוגמה לקלט שאתה מכניס.

ייתכן אגב, שאתה גם צריך לנקות את ה-buffer של stdin לפני ו\או אחרי שימוש ב-scanf תלוי במה שאתה ועשה.

--לב
Anonymous - 14/06/2018 - 17:16
נושא ההודעה:
תודה על התגובות ,
את הקוד העתקתי מהאתר הזה בלינק הזה
https://www.javatpoint.com/c-goto

העיניין הוא כאשר אני מריץ את הקוד הזה ב IDE ONLINE כמו באתר הזה
https://www.onlinegdb.com/online_c_compiler

הקוד עובד מצוין ,


ב NB עדיין אותם סימפטומים לא נפתרה הבעיה
בECLIPSE הקוד הזה גם לא עובד טוב ויש באגים בתצוגה .



ציטוט:
באשר לבעיה שלך עם scanf, תן דוגמה לקלט שאתה מכניס.

ייתכן אגב, שאתה גם צריך לנקות את ה-buffer של stdin לפני ו\או אחרי שימוש ב-scanf תלוי במה שאתה ועשה.


אולי תוכל לב לנסות לתקן בשבילי את הקוד הזה ?
borsood - 15/06/2018 - 07:21
נושא ההודעה:
ב IDE ONLINE הקוד "עובד" במקרה.
הקוד שכתוב לא מחוייב שיציג את מה שאתה חושב שהוא צריך לעשות.

שקול ללמוד את השפה ממקור אחר.
Anonymous - 15/06/2018 - 09:55
נושא ההודעה:
borsood :
ב IDE ONLINE הקוד "עובד" במקרה.
הקוד שכתוב לא מחוייב שיציג את מה שאתה חושב שהוא צריך לעשות.

שקול ללמוד את השפה ממקור אחר.


מה הבעיה בקוד? לי הוא נראה דווקא בסדר.
גם מתקמפל ורץ יפה ב-GCC
Anonymous - 15/06/2018 - 09:56
נושא ההודעה:
Anonymous :
borsood :
ב IDE ONLINE הקוד "עובד" במקרה.
הקוד שכתוב לא מחוייב שיציג את מה שאתה חושב שהוא צריך לעשות.

שקול ללמוד את השפה ממקור אחר.


מה הבעיה בקוד? לי הוא נראה דווקא בסדר.
גם מתקמפל ורץ יפה ב-GCC


* כמובן מבחינת ההרצה של הקוד
מבחינת הכתיבה, יש בשביל דברים כאלה while-ים Smile
Anonymous - 16/06/2018 - 16:41
נושא ההודעה:
ניסיתי להסביר למה זה אולי עובד בגרסה המקוונת וקצת הסתבכתי.

הנה תוכנית קצת יותר פשוטה:
קוד:

cat <<EOF >test.c
#include <stdio.h>

int main() {
        int num, success;

        while(1) {
                printf("Number: \n");
                success = scanf("%d", &num);
                if (!success)
                        break;
                printf("I got: %d\n", num);
        }
        return 0;
}

EOF

gcc -Wall -o test test.c

אם אני מריץ אותו אני מקבל התנהגות דומה לזו שתוארה קודם: אם המספרים מופרדים ברווחים או טאבים, לא מקבלים את ההתנהגות המצופה:
קוד:

$ ./test
Number:
1 2 3
I got: 1
Number:
I got: 2
Number:
I got: 3
Number:
4 f 5
I got: 4
Number:


לעומת זאת אם אני משחק קצת עם הגדרות המסוף אני מקבל כמעט את מה שרציתי: תגובה מיידית. אבל תצוגה מוזרה:
קוד:

$ stty raw; ./test; stty cooked
Number:
        1 I got: 1
                  Number:
                          2 I got: 2
                                    Number:
                                            3^MI got: 3
                                                       Number:
                                                               4 I got: 4
                                                                         Number:
                                                                                 f$

המדרגות הללו הן בגלל שיש רק מעברי שורה (newline) אולם אין חזרה לתחילת השורה (carrige return). יכול להיות שבתוכנית שמורצת באינטרנט הבעיה לא קיימת מכיוון שטקסט אינטרנטי כולל גם CR וגם NL בסוף כל שורה. שימו לב שלחיצת אנטר שלי מוצגת כאן כתו CR (כלומר: ‎^M). ניסיתי לשחק עוד קצת עם הפרמטרים של stty ולא הגעתי לתוצאה הרצויה.

למי שמשחק עם ההגדרות הללו, תזכורת למספר דרכים להחזיר את המסוף לימיו כקדם:
קוד:

stty sane
reset
echo ^O # echo ctrl-v ctrl-o enter
# the Enter key does not respond: try ^J: ctrl-v ctrl-j
clear # or ctrl-l
# ctrl-q , in case you pressed ctrl-s

Anonymous - 16/06/2018 - 16:43
נושא ההודעה:
ניסיתי להסביר למה זה אולי עובד בגרסה המקוונת וקצת הסתבכתי.

הנה תוכנית קצת יותר פשוטה:
קוד:

cat <<EOF >test.c
#include <stdio.h>

int main() {
        int num, success;

        while(1) {
                printf("Number: \n");
                success = scanf("%d", &num);
                if (!success)
                        break;
                printf("I got: %d\n", num);
        }
        return 0;
}

EOF

gcc -Wall -o test test.c

אם אני מריץ אותו אני מקבל התנהגות דומה לזו שתוארה קודם: אם המספרים מופרדים ברווחים או טאבים, לא מקבלים את ההתנהגות המצופה:
קוד:

$ ./test
Number:
1 2 3
I got: 1
Number:
I got: 2
Number:
I got: 3
Number:
4 f 5
I got: 4
Number:


לעומת זאת אם אני משחק קצת עם הגדרות המסוף אני מקבל כמעט את מה שרציתי: תגובה מיידית. אבל תצוגה מוזרה:
קוד:

$ stty raw; ./test; stty cooked
Number:
        1 I got: 1
                  Number:
                          2 I got: 2
                                    Number:
                                            3^MI got: 3
                                                       Number:
                                                               4 I got: 4
                                                                         Number:
                                                                                 f$

המדרגות הללו הן בגלל שיש רק מעברי שורה (newline) אולם אין חזרה לתחילת השורה (carrige return). יכול להיות שבתוכנית שמורצת באינטרנט הבעיה לא קיימת מכיוון שטקסט אינטרנטי כולל גם CR וגם NL בסוף כל שורה. שימו לב שלחיצת אנטר שלי מוצגת כאן כתו CR (כלומר: ‎^M). ניסיתי לשחק עוד קצת עם הפרמטרים של stty ולא הגעתי לתוצאה הרצויה.

למי שמשחק עם ההגדרות הללו, תזכורת למספר דרכים להחזיר את המסוף לימיו כקדם:
קוד:

stty sane
reset
echo ^O # echo ctrl-v ctrl-o enter
# the Enter key does not respond: try ^J: ctrl-v ctrl-j
clear # or ctrl-l
# ctrl-q , in case you pressed ctrl-s

Anonymous - 16/06/2018 - 18:40
נושא ההודעה:
כנראה יש בעיה אצלי עם הנטבינס והאקליפס כנראה משהו בהגדרות לא טוב .

גם קודים אחרים לא עובדים שמה טוב .

אני אנסה לעשות חיפוש איך צריכה להיות הגדרה טובה בשבילם
או שפשוט אשאר עם ה VISUAL STUDIO , הוא בנתיים עובד טוב אצלי .
borsood - 17/06/2018 - 07:18
נושא ההודעה: Re: IDE טוב בשביל C
לב כתב מה עיקר הבעיה בתכנית: אין טיפול נכון בbuffer של stdin או stdout.

Anonymous :
[באשר לבעיה שלך עם scanf, תן דוגמה לקלט שאתה מכניס.

ייתכן אגב, שאתה גם צריך לנקות את ה-buffer של stdin לפני ו\או אחרי שימוש ב-scanf תלוי במה שאתה ועשה.

--לב

Anonymous - 17/06/2018 - 13:57
נושא ההודעה: Re: IDE טוב בשביל C
borsood :
לב כתב מה עיקר הבעיה בתכנית: אין טיפול נכון בbuffer של stdin או stdout.

Anonymous :
[באשר לבעיה שלך עם scanf, תן דוגמה לקלט שאתה מכניס.

ייתכן אגב, שאתה גם צריך לנקות את ה-buffer של stdin לפני ו\או אחרי שימוש ב-scanf תלוי במה שאתה ועשה.

--לב


נראה לי שהבעיה שלו מגיעה מההדפסה, הוא לא מדפיס CR וחלק מהטרמינלים של IDE לא ינקו את באפר הפלט, כלומר, לא יציגו כלום, וזה נראה כאילו אין קלט....

לעניות דעתי זה בזבוז זמן לנתח את הבעיה מכיוון שבעל הבעיה לא מראה שום רצון להבין אותה אלא רק לדלג בין IDE. לא נסיון בטרמינל של ממש, לא הקשת רגע אחד של מחשבה לכך שכל הIDE מקמפלים עם GCC (בהנחה שלא נעשה משהו מיוחד כדי לשנות את זה....) ורק "תתקנו לי".
Anonymous - 17/06/2018 - 18:50
נושא ההודעה:
אני אכן דילגתי מ IDE ל IDE אבל ניסיתי לפתור כל בעיה ספציפית .
אני גם בעצמי משתדל , אם אין אני לי מי לי .

בינתיים הצלחתי לסדר את הנטבינס גם בווינדוס וגם בלינוקס (אובונטו )
VS עובד טוב ,
רק האקליפס בווינדוס לא עובד טוב יש באגים בתצוגה בטרמינל .

בקשר לבאפר סליחה אם לא התייחסתי לזה קודם , אני אעשה עכשיו קצת חיפושים לגבי זה
ואדווח על ההתקדמות , תודה לכל מי שעזר
Anonymous - 26/06/2018 - 12:23
נושא ההודעה:
שימוש ב-scanf הוא לא באמת פשוט (במיוחד לא למתחילים, שלא מבינים מה זה stream) אבל הבשורות הטובות הן ש"בחיים האמיתיים" כמעט לא משתמשים בו.

משתמשים בו רק כשמלמדים אנשים את שפת C, כי צריך דרך לקלוט נתונים מהמשתמש. זה לא צריך להפריע לך: במקום לקלוט נתונים מהמשתמש, קודד אותם בתוך התוכנית -- זה יהיה יותר נוח. או שתריץ תוכנית כזו מהטרמינל. אתה עדיין יכול לעבוד בתוך ה-IDE.
כל הזמנים הם GMT + 2 שעות