[חידה] תוכנית בשפת C [נפתרה]

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

מנהלים: Gordi, Radioactive Grandpa, Octarine, Og, אופיר

Og
מנהל
מנהל
הודעות: 12293
הצטרף: ו' מאי 28, 2004 10:34 am
מיקום: Delta Lyncis

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Og »

Octarine כתב:אני לא בטוח שאני אוהב, למרות ההמלצה הנמרצת של עוג. הנסיון שלי עם משחקי RPG (?) בחלל מסתכם ב-NOMAD, אני לא יודע איך הוא בהשוואה ל-Star Control אבל מהקצת שקראתי בויקי אני מבין שהקונספט דומה. הבעיה שהייתה לי ב-NOMAD היא באג שקורה בשלב מסוים ודי תוקע את המשחק, אז עזבתי אותו וחזרתי לקווסטים, אהבתי האמיתית.

איפה אפשר להשיג את Star Control היום? (להשיג חוקית, כמובן)
בוא נתחיל עם זה שSC הוא משחק שונה לגמרי (למרות שנוצר ע"י אותם אנשים), אנחנו מדברים על SC2.

הבסיס של SC2, מבחינת המשחקיות, ז"א, מבוסס (זו דרך עדינה לומר שהוא מועתק/גנוב) על משחק אחר ששכחתי את שמו (אבל זה לא NOMAD). אבל המשחקיות היא לא הסיבה שהמשחק הזה הפך להיות משחק ה cult המפורסם בעולם - העלילה והצורה בה היא מוצגת, הן הפלא האמיתי, ומהבחינה הזו, לא תמצא שום משחק שמתקרב אפילו.
Octarine כתב:משחקי RPG (?) בחלל
כן, זה בהחלט משחק RPG. אף אחד, כולל היוצרים לא מגדיר אותו ככה אבל אני אומר לך שזו בהחלט ההגדרה הטובה ביותר.

בקשר להשגת המשחק, TFB (החברה היוצרת) שחררו את הזכויות למשחק ואת קוד המקור וכיום הוא חינמי:
http://sc2.sourceforge.net" target="_blank

[נכתב לפני ההודעה של Sabre Runner]
Og
מנהל
מנהל
הודעות: 12293
הצטרף: ו' מאי 28, 2004 10:34 am
מיקום: Delta Lyncis

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Og »

אני מקווה שהפעם אף אחד לא יצליח להשחיל הודעה בזמן שאני כותב את זו...
Sabre Runner כתב:כן, זיהיתי את זה אחרי חצי דקה בערך בלי לקרוא אף אחת מהתגובות. ניסיתי להריץ את התוכנית בראש עד שהבנתי שלא הוגדרה SEEK_FUNCTION ואז פשוט ניסיתי לראות מה בדיוק קורה כאן. זה ה-999 שסגר את הפתרון.
זה בדיוק מה שקיוויתי שאנשים יעשו, תודה על החיזוק.
חבל רק שאי אפשר לשחזר את סגנון החידה ולהשליך אותו על משחקים אחרים (כי אני לא יכול לחשוב על עוד משחק שבו מדברים על תכנות של רובוט).
Sabre Runner כתב:כל פעם שצריך דוגמה למשחק נהדר שהוא מופת למשחקים, משהו שאפשר לחזור אליו עוד פעם ועוד פעם ועוד פעם ואחרי זה לשים על המדף כיצירת אמנות לדורות הבאים, אז אני אומר Star Control II - The Ur-Quan Masters.
כל מילה בסלע.
Sabre Runner כתב:ומאז שהקוד של המשחק שוחרר, יצאו כמה שכפולים שלו וכמה עיצובים מחדש. הטוב מכולם הוא, ללא ספק, The Ur-Quan Masters.
אם כבר שניניו נגענו בנושא, אני רוצה להרחיב קצת בקשר לעניין:
במקור המשחק יצא לPC בלבד, על תקליטונים והיה חסכוני מאד מבחינת גודל. יותר מאוחר הוא יצא במהדורת תקליטור אבל מבחינת תכן היא הייתה זהה לגרסת התקליטונים. אפילו יותר מאוחר הוא בא ביחד עם SC3 על התקליטור(ים) - שוב, למיטב ידיעתי זו אותה הגרסה.

אבל בין לבין, יצאה גם גרסה לקונסולת ה 3DO והיא שונה מהרבה בחינות, יותר מדי משאוכל לציין כאן אבל שווה להזכיר את הדיבוב המלא, את מערכת הZOOM החדשנית בקרבות ואת השינויים הרבים בממשק.

בתחילת שנות ה2000, Toys for Bob (החברה שנוסדה ע"י פרד פורד ופאול רייק השלישי - שני הגאונים מאחורי המשחק) החליטו לשחרר את המשחק ואת קוד המקור שלו, דא עקא, שני מכשולים עמדו בדרכם: ראשית, קוד המקור של גרסת הPC אבד ושנית, השם "Star Conrol" רשום לחברת Accolade ולכן מוגן בזכויות יוצרים. את הבעיה הראשונה פתרו ע"י שחרור קוד המקור של גרסת ה3DO, שכאמור שונה מהותית מגרסת הPC. את הבעיה השנייה לא ממש אפשר לפתור בלי $, אז המשחק שנמצא להורדה באתר, נחשב ללא-חינמי רק בגלל שהוא מכיל את הטקסט "Star Control".
זמן קצר לאחר השחרור של קוד המקור של גרסת ה3DO, צוות של אנשים מיומנים שחררו את הרימייק המדובר:
http://sc2.sourceforge.net/" target="_blank
שבתחילה הכיל משחק הזהה כמעט לחלוטין לגרסת ה3DO. מה שלא תמצא שם, לעומת זאת, זה את המילים Star Control מה שהופך את המשחק לחוקי לחלוטין.
במשך השנים הכניסו לרימייק שיפורים שלא היו קיימים במקור ותיקנו אינספור באגים. לשמחתי הרבה הכניסו גם את האפשרות לבחור חלק מהמאפיינים שהיו קיימים רק בגרסת הPC (לא כולם, לצערי).

על עוד פרוייקטים כאלה, בניגוד ל Sabre Runner, לא שמעתי (ואשמח לשמוע).

וזה, בקצרה, כל הסיפור מאחורי הרימייק.
סמל אישי של משתמש
C-man
מנהל
מנהל
הודעות: 4120
הצטרף: ד' דצמבר 24, 2003 12:13 pm

Re: [חידה] תוכנית בשפת C

שליחה על ידי C-man »

אני מתנצל שלא זיהיתי :blackeye: . התירוץ שלי הוא שלא זכרתי ממש את 'אגלוריתם' של ה probes ובפרט לא את המספר 999.
גם לי לא היה ברור מהקוד שהערכים של actionX היו priorities.
Og כתב:
C-man כתב:איפה הקונבנציות, איפה
על מה אתה מדבר? על זה שהפונקציה לא מוגדרת בתחילת התכנית?
האמת שהתכוונתי יותר לזה שאין אינדנטציה, שיש hard-coded values בקוד, וכו', אבל זה היה בצחוק (אגב, void main() אולי מתקמפל, אבל זה ממש לא חוקי).
Og כתב:
C-man כתב:כואב לי לנסות להבין את הכוונה בקוד הזה
למה? בגלל שאין צבעים? בכל מקרה, אתה לא אמור "להריץ" את התוכנית, אתה אמור להבין את הכוונה בלי להתאמץ יותר מדי, קח בחשבון שכיוונתי גם לאנשים שלא מבינים שפת C.
התכוונתי בעיקר לקוד שבפונקציה choose_action, לא בגלל סינטקס, אלה בגלל שהלוגיקה שלו מטעה ולא מסבירה אותו נכון.


למרות שלא זיהיתי, אהבתי את החידה :)
Og
מנהל
מנהל
הודעות: 12293
הצטרף: ו' מאי 28, 2004 10:34 am
מיקום: Delta Lyncis

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Og »

C-man כתב:אני מתנצל שלא זיהיתי :blackeye:
LOL, סתם התלוצצתי בקשר להתנצלות :wink:
C-man כתב:גם לי לא היה ברור מהקוד שהערכים של actionX היו priorities.
כי הם לא היו.. אבל תכננתי לעשות את זה יותר ברור עם המילה Priority באחד הרמזים. בכלל, התכנית הייתה לשנות את התכנית ברמזים עם דברים כגון פלט מפורמט:
printf("We come in peace!");
ועוד כל מני כאלה, פשוט לא הגענו לזה.
C-man כתב:אגב, void main() אולי מתקמפל, אבל זה ממש לא חוקי
אתה כנראה מתבלבל עם C++, שם זה באמת לא חוקי.
סמל אישי של משתמש
C-man
מנהל
מנהל
הודעות: 4120
הצטרף: ד' דצמבר 24, 2003 12:13 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי C-man »

יכולת להמשיך את החידה לטובת מי שלא פתר :P

[OT]
ב C יש רק שתי הגדרות חוקיות ל main

קוד: בחירת הכל

int main(void)
int main(int argc, const char const *argv[]) /* i might be wrong about one of the const's */
חוץ מזה לא מומלץ להצהיר ולהגדיר פונקציה עם רשימת פרמטרים ריקה, כי ב C הצהרה עם פונקציה בלי פרמטרים אומרת שמספר וסוג הפרמטרים אינו ידוע.
ב C++ הקווירק הלא-אינטואיטיבי הזה תוקן כך שהצהרה על פונקציה בלי פרמטרים שקולה להצהרה על פונקציה ש"מקבלת" void.
Og
מנהל
מנהל
הודעות: 12293
הצטרף: ו' מאי 28, 2004 10:34 am
מיקום: Delta Lyncis

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Og »

C-man כתב:ב C יש רק שתי הגדרות חוקיות ל main
אפשר לקבל מקור?
סמל אישי של משתמש
Yoyole
משתמש רשום
משתמש רשום
הודעות: 895
הצטרף: ב' דצמבר 24, 2007 4:26 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Yoyole »

Og כתב:
C-man כתב:ב C יש רק שתי הגדרות חוקיות ל main
אפשר לקבל מקור?
הוא לא מתכנת בצה"ל?
סמל אישי של משתמש
C-man
מנהל
מנהל
הודעות: 4120
הצטרף: ד' דצמבר 24, 2003 12:13 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי C-man »

חיפשתי ולא מצאתי מקור רשמי שמאשר את זה, אבל זה common knowledge ש void main() לא מתאים להגדרות השפה ועשוי להכשל בקומפיילרים פחות גמישים מ VS.
Og
מנהל
מנהל
הודעות: 12293
הצטרף: ו' מאי 28, 2004 10:34 am
מיקום: Delta Lyncis

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Og »

אני לא יודע מאיפה בא ה common knowledge שלך, אבל שלי אומר אחרת. ושוב, אני מדגיש שאני לא מדבר על C++ (ולמיטב ידיעתי, VS לא תומך ב-C, רק ב-C++ עם תמיכה לאחור מוגבלת. מעולם לא השתמשתי בו ל-C).

אני אניח ששפות התכנות שאתה משתמש בהן מיועדות למחשבים עם ארכיטקטורת x86 או x64 וכמויות אדירות של זכרון, אבל שפת C יכולה להתקמפל גם לדברים אחרים, כמו לדוגמה מיקרו בקרים (הכי מפורסם הוא ה- 8051) ובחלק מהם (אם כי היום כבר פחות ופחות) כמות הזכרון מוגבלת מאד. 2 בתים (הגודל של short singed int) יכולים להיות שמינית מכלל כל הזכרון שעומד לרשותך (!) וברוב המקרים, MAIN לא יכולה בכלל לקבל או להחזיר ערך (אין מערכת הפעלה או בקרת שגיאות) ולכן לא רק שזה חוקי, לעיתים זה הכרחי.
סמל אישי של משתמש
C-man
מנהל
מנהל
הודעות: 4120
הצטרף: ד' דצמבר 24, 2003 12:13 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי C-man »

Og כתב:אני אניח ששפות התכנות שאתה משתמש בהן מיועדות למחשבים עם ארכיטקטורת x86 או x64 וכמויות אדירות של זכרון, אבל שפת C יכולה להתקמפל גם לדברים אחרים
דווקא בדיוק לזה התכוונתי כשאמרתי "קומפיילרים אחרים".

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

אני עכשיו הולך לבדוק את זה ב-GCC, כי לפי מה שאני זוכר זה לא מתקמפל במצב שגיאות הכי מחמיר.
סמל אישי של משתמש
C-man
מנהל
מנהל
הודעות: 4120
הצטרף: ד' דצמבר 24, 2003 12:13 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי C-man »

gcc אכן לא אוהב את זה

קוד: בחירת הכל

*****@ubuntu:~/Desktop$ cat t.c
void main(void)
{
}
*****@ubuntu:~/Desktop$ gcc -Wall -Werror t.c
cc1: warnings being treated as errors
t.c:1: error: return type of ‘main’ is not ‘int’
סמל אישי של משתמש
הטופיק
משתמש רשום
משתמש רשום
הודעות: 518
הצטרף: ה' אפריל 22, 2004 4:20 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי הטופיק »

בדקתי קצת ברשת, בכל מקום מה ש C-man אומר תופס, בין היתר בויקיפדיה האנגלית שנראית לי די אמינה בקטע הזה...
אם תתעקשו אני מכיר אנשים שכותבים embedded ב-C, אפשר לוודות את זה...
Og
מנהל
מנהל
הודעות: 12293
הצטרף: ו' מאי 28, 2004 10:34 am
מיקום: Delta Lyncis

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Og »

זה שזה לא מתקמפל בGCC לא אומר כלום(על אחת כמה וכמה שזו לא שגיאה, רק אזהרה), בכלל, העברת את GCC למצב C ?
הטופיק כתב:בדקתי קצת ברשת, בכל מקום מה ש C-man אומר תופס, בין היתר בויקיפדיה האנגלית שנראית לי די אמינה בקטע הזה...
דווקא להיפך, ויקיפדיה תומכת יותר במה שאני אומר:
ויקיפדיה כתב:Other platform-dependent formats are also allowed by the C and C++ standards, except that in C++ the return type must stay int
C-man כתב:מה שאתה אומר בקשר לכמות הזיכרון נשמע לי די מוזר, כי במצב כזה יותר הגיוני לכתוב ישירות ב assembly או שפה יעודית כלשהי.
בוודאי שעדיף לכתוב ישירות באסמבלי! כמובן, עם השגה קטנה: אתה צריך לדעת אסמבלי בשביל לכתוב באסמבלי... כלומר, אסמבלי של 8051, או אסמבלי של PIC אם אתה עובר אליו, או אסמבלי של Z80 אם אתה עובר אליו, או אסמבלי של 68000 אם אתה עובר אליו, או אסמבלי של ARM (על כל סוגיו) אם אתה עובר אליו וכו' לגבי שאר עשרות המיקרו-בקרים הנפוצים.
או פשוט לדעת שפת C שמתקמפלת לכולם ובצורה די טובה... הכל תלוי בדרישות העבודה. רוב החברות הגדולות ידאגו שהעובדים שלהם ילמדו אסמבלי, מן הסתם, אבל לא כך חברות קטנות יותר או חובבנים.

בכל מקרה, זה ויכוח די טפשי... אני לא יודע אפילו אם יש ארגון שקובע מה "חוקי". לי היו שלושה מורים לשפת C וכולם השתמשו ב void main. אחד מהם, נחשב לאחד התותחים הגדולים לשפה בארץ (הוא ראש אגף באיזו אוניברסיטה או משהו כזה, לא זוכר בדיוק).

העובדה שזה מתקמפל, במיוחד בקומפיילרים ישנים, אמורה לומר משהו, לא? זה לא שסתם עקב באג בקומפיילר זה מתקמפל, הרי מישהו הכניס את זה בכוונה. זה אומר שזה משהו שלכל הפחות היה "חוקי" פעם. אולי היום כבר לא אבל אני מטיל ספק רציני בכך.
סמל אישי של משתמש
C-man
מנהל
מנהל
הודעות: 4120
הצטרף: ד' דצמבר 24, 2003 12:13 pm

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי C-man »

Og כתב: העברת את GCC למצב C ?
חשבתי שזה דיפולטית ב-C. אולי מחר אבדוק את זה שוב. [עריכה]כן, הוא ניחש שזה c לפי הסיומת[/עריכה]
Og כתב:בכל מקרה, זה ויכוח די טפשי...
נכון... אני לא אתנגד לדון בנושאים אחרים בתכנות :).
Og כתב:אני לא יודע אפילו אם יש ארגון שקובע מה "חוקי".
בחוקי הכוונה לנכון לפי הסטנדרט. אם אני לא טועה הסטנדרט האחרון/שרוב הקומפיילרים תומכים בו זה C99 (ואם אני לא טועה הוא נקבע ע"י ה ISO).
Og כתב:לי היו שלושה מורים לשפת C וכולם השתמשו ב void main. אחד מהם, נחשב לאחד התותחים הגדולים לשפה בארץ (הוא ראש אגף באיזו אוניברסיטה או משהו כזה, לא זוכר בדיוק).
אני דווקא שמעתי דברים בגנאי ההוראה של C באוניברסטאות, שמקנות הרגלים רעים רבים לסטודנטים. מצד שני המטרה שלהם היא לא ללמד לתכנת, אלא ללמד מדעי מחשב.
(אגב, אפשר לדעת את שם המורה התותח?)
Og כתב:העובדה שזה מתקמפל, במיוחד בקומפיילרים ישנים, אמורה לומר משהו, לא? זה לא שסתם עקב באג בקומפיילר זה מתקמפל, הרי מישהו הכניס את זה בכוונה. זה אומר שזה משהו שלכל הפחות היה "חוקי" פעם. אולי היום כבר לא אבל אני מטיל ספק רציני בכך.
עד כמה שאני יודע קומפיילרים ישנים כמו Turbo C תמכו בהרבה דברים לא-סטנדרטיים שא"כ התמיכה בהם נפסקה.
מה שכן, יכול להיות שזה כן היה בסטנדרט פעם והוצא ממנו, הרי יצאו מספר סטנדרטים במהלך השנים.

אגב, אתה מוזמן לפצל את ההודעות האחרונות אם אתה מרגיש שיש צורך
סמל אישי של משתמש
Gordi
מנהל ראשי
מנהל ראשי
הודעות: 6820
הצטרף: ו' ספטמבר 27, 2002 2:19 pm
מיקום: מאחוריך
איש קשר:

Re: [חידה] תוכנית בשפת C [נפתרה]

שליחה על ידי Gordi »

אם אני זוכר נכון, אזהרות הן בסך הכל "טיפים" של המערכת, לא? לא מדובר בשגיאות ממש.
קח למשל את הקוד הבא:

קוד: בחירת הכל

user@user-desktop:~/Desktop/temp$ cat a.c
void main() {
        int x;
        if (x=1){}
}
user@user-desktop:~/Desktop/temp$ gcc -Wall -Werror a.c -o a.out
cc1: warnings being treated as errors
a.c:1: warning: return type of ‘main’ is not ‘int’
a.c: In function ‘main’:
a.c:3: warning: suggest parentheses around assignment used as truth value
התנאי הוא חוקי לחלוטין, אבל המהדר מזהיר את המתכנת שאולי הוא שכח שם סימן "=" נוסף.
שלח תגובה הנושא הקודםהנושא הבא