פויינטרים
אהה ?

פויינטרים ../images/Emo4.gif אהה ?

למה כשאני עושה *x=*x+1 הכל עובד מצויין וכשאני עושה *x++ זה לא :/ (אל תתיחסו למיקום של הפלוסים או הכוכביות, זה פשוט ישור של עיברית
)
 
ועוד דבר

לפי התיאוריה של הפויינטרים אני לא חייב להגדיר גודל של מערך המערכים כולם דינמים .. אפילו לא צריך להקצות בשבילם מקום בזכרון מראש. כמובן מישהוא יגיד שאני עלול לכתוב על תא זכרון שמכיל באמת משהוא, אבל לא נראה לי שזה אפשרי.. נסיתי מלאאאאאאא פעם להצליח להפריע לאיזה משתנה או משהוא כזה , על ידי כך שאני אכתוב בטעות לשם משהוא.. ואף פעם זה לא קרה, נראה לי מה שC נותנת למשתמש זה מין זכרון שהיא "המציאה" בשבילו, ואי אפשר לערוך ערכים של תוכניות אחרות .. הנה דוגמא לקוד שעובד מצויין, בלי בעיה של OVERFLOW
#include<stdio.h> int arrange() { return 0; } int main() { int arr[1], *a,i; a=arr; for (i=0;i<20;i++) { arr=i; printf("%d\n",*a); a++; } return 0; }
 
יותר מזה

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

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

זויברג

New member
לא אסמבלר, דיסאסמבלר...

בדרך כלל בשביל לכתוב תוכנה כזאת, משתמשים בתוכנה בשם disassembler (נראה לי ככה מאייתים). התוכנה בעיקרון לוקחת את קוד שפת המכונה בקובץ הexe והופכת אותו לקוד אסמבלי. אח"כ אפשר לעבוד על הקוד פקודה פקודה כמו שעושים בdebug, ואפשר לראות מתי משתנה ערך מסויים בתוך המשחק, למשך ברגע שאני מקבל עוד כסף, מתקיימת הפקודה:
mov ex:[bx],ax​
לכן אפשר ברוב המקרים להסיק שהכתובת של המשתנה לכסף הוא בBX עם כתובת בסיס ששמורה בEX. זאת דרך אחת לעשות את זה, את התוכנה לא חייבים לכתוב באסמבלי, אבל בדרך משמשים בדיסאסמבלר בשביל להכין תוכנות כאלו. עוד דוגמא, למשל כשמכינים no cd crack, כלומר קובץ שמריץ את המשחק, אבל מבטל את הדרישה להכניס את הדיסק המקורי, עובדים עם דיסאמבלר, בודקים איפה הפקודה, או הקפיצה לתת-שגרה שגורמת לבדיקת הדיסק, מוחקים אותה ומקמפלים מחדש. עכשיו המשחק לא יבקש את הדיסק. וככה מכינים crack. ברור שיש עוד הרבה שיטות, וגם אילו הרבה יותר מסובכות בפועל, אבל בכללי ככה זה נעשה. נ.ב. כותב ההודעה לא ממליץ בשום ואופן לכתוב או להשתמש בcrackים או כל מיני דברים לא חוקיים למיניהם, והודעה זאת היא לא המלצה או דירבון (וגם לא פרובוקציה או סתירה, רוחמה אברהם) לעבור על חוק זכויות היוצרים הדיגיטלי.
 

melatonin

New member
כמובן שהוא לא עובד על הזכרון האמיתי

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

IP yuval

New member
המערכת הפעלה לא נותנת לך לכתוב

על זיכרון של תוכניות אחרות, והורגת (Segmentation fault). זה שהתוכנית הזאת עובדת לך זה ממש במקרה (אצלי היא לא עובדת). אם תשים מספר יותר גבוה מ20 גם אצלך היא לא תעבוד. חוץ מזה, דברים כאלה (לא זה ספציפית...) כן גורמים לOVERFLOWS, קריסות ואי שינה בלילה כתוצאה מדיבוג תוכנית.
 

zagzagzag

New member
כי לא קראת על סדר קדימויות

של אופרטורים
קודם כל, יש קישורים ליישור קוד מתחת לחלון כתיבת הודעה. אם אתה רוצה להוסיף 1 ל-x*, זה צריך להיראות כך -
(*x)++;​
פשוט צריך ללמוד סדר קדימיות של אופרטורים.
 

זויברג

New member
תוכנית זאת ביצעה פעולה בלתי חוקית,

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