לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #3  
ישן 29-09-2008, 00:44
צלמית המשתמש של Zorro26
  Zorro26 Zorro26 אינו מחובר  
 
חבר מתאריך: 07.04.04
הודעות: 552
בתגובה להודעה מספר 2 שנכתבה על ידי ayalshimoni שמתחילה ב "צריכה להיות סיבה שזה קורה......"

נסה להריץ את הקוד הבא (מ visual studio 2005 ומעלה):
תוכנית קונסול. התוכנית מבצעת הקצאה דינאמית של הכנסת נתוני סטודנטים לטבלה
ע"י הקשת קוד סטודנט, רווח, שם סטודנט ואז לחיצה על Enter
לאחר שאני מזין למשל שדה ראשון ולאחר מכן בוחר בתפריט 2 שזה להציג
את נתוני הטבלה עד עכשיו אני מקבל את מה שהזנתי בנוסף לג'יבריש.
אשמח מאוד אם מישהו ימצא לזה פתרון.
הנה יש לכם אתגר מאחר והפתרון הקודם לא עוזר !
אני יודע שיש איזו שורת קוד שעושה סוג של ניקוי מאגר זכרון אשר אמור למנוע
תופעה זו אך שכחתי מה הקוד ואם יש לכם דרך אחרת אשמח לדעת.
תודה מראש.

קוד:
#include "stdafx.h" #include "string.h" #include "malloc.h" struct stu { char id[10]; char name[10]; }; struct stu *table; int size; int menu() { int choice; printf("Menu:\n0.Exit\n1.Add new\n2.Show table\n"); scanf("%d",&choice); return choice; } void add() { char id[10],name[10]; printf("Please type student id and student name: "); scanf("%s%s",id,name); table=(struct stu*)realloc(table,sizeof(struct stu)*size); strcpy(table[size-1].id,id); strcpy(table[size-1].name,name); size++; } void print() { int i; for(i=0;i<size;i++) printf("%s %s\n",table[i].id,table[i].name); } void main() { int i; table=NULL; size=1; i=menu(); while(i) { if(i==1) add(); else if(i==2) print(); i=menu(); } }

_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה כי ביתי בית תפילה יקרא לכל העמים תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 29-09-2008, 08:18
צלמית המשתמש של Zorro26
  Zorro26 Zorro26 אינו מחובר  
 
חבר מתאריך: 07.04.04
הודעות: 552
בתגובה להודעה מספר 4 שנכתבה על ידי yoavmatchulsky שמתחילה ב "לא נראה לי שזה הגיוני לעשות..."

ציטוט:
במקור נכתב על ידי yoavmatchulsky
לא נראה לי שזה הגיוני לעשות scanf("%s%s")
איך הפונקציה תדע מתי להפסיק את המחרוזת הראשונה ולהתחיל את השנייה? היא לא קוראת את מחשבות המשתמש..
תשים רווח ביניהם, או פסיק או משהו להפריד, ואז אולי לא תקבל בעיות בהדפסה.

לא עברתי על כל הקוד שלך, אבל אני לא דיבאגר. תעבור עם דיבאגר ותראה איפה נכנס זבל למחרוזת שלך, ואיפה אתה לא סוגר את המחרוזת עם \0


מותר לעשות scanf %s%s מאחר וכאשר אתה משתמש בפקודת scanf לקליטת מחרוזת ואח"כ
אתה עושה רווח זה נחשב כאילו שעשית ENTER וסיימת לקלוט מחרוזת ראשונה ואח"כ אותו
דבר אתה קולט את השניה רק שבסוף אתה מקיש ENTER.
מהתשובה שאתה מציג לא הרצת בכלל את הקוד. נכון שמומלץ יותר להשתמש בפקודת gets
שבה אתה יכול גם להקיש רווח במחרוזת וכך יצא משפט. אך כאן לא הייתי צריך gets מאחר
וה s% הראשון קולט ברצף מספרים ללא רווחים ביניהם ואח"כ אתה לוחץ רווח שזה כאילו ENTER
ואתה קולט את שם הסטודנט שזה ה s% השני.
תריצו את הקוד לפני שאתם באים להתעמת איתי ותראו שהתוכנית אכן עובדת אך מדוע גם
נוסף הג'יבריש ?
תודה.
_____________________________________
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה כי ביתי בית תפילה יקרא לכל העמים תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה


נערך לאחרונה ע"י Zorro26 בתאריך 29-09-2008 בשעה 08:20. סיבה: תיקון
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #8  
ישן 29-09-2008, 13:19
  משתמש זכר Web Web אינו מחובר  
 
חבר מתאריך: 07.12.04
הודעות: 2,153
שלח הודעה דרך ICQ אל Web שלח הודעה דרך MSN אל Web Facebook profile
נכון, באמת יש בעיות בקוד אבל לא שאלת: "איך לכתוב את הקוד נכון יותר?.."
בתגובה להודעה מספר 7 שנכתבה על ידי Zorro26 שמתחילה ב "[QUOTE=rlsf]זה קורה לך גם..."

ולכן אני אענה יותר לגופו של עניין...

הבעיה שלך היא בשורת ה-for..
שים לב, זה מה שעשית:
קוד:
for(i=0;i<size;i++)


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

הפיתרון:
קוד:
for(i=0;i<size - 1;i++)


מסקנה:
אני ממליץ בחום לאתחל את כל המשתנים שלך בתחילת התוכנית כך שלא יכילו זבל לא ברור. מה שקורה זה שהמקום לא אותחל. ה"סטרינגים" שלך הם למעשה פוינטרים למקום כלשהו בזיכרון שהוא char, אבל המחשב לא שומר בשום מקום את אורכו ולכן הדרך היחידה לזהות את סופו היא לרוץ בלולאה עד שמגיעים ל-NULL הראשון. התוצאה היא אינה "גיבריש", אלא רצף בתים אקראי ששכב בזיכרון שהתחלת לקרוא ממנו עד לאיזה NULL שנמצא גם הוא ממש במקרה איפשהו בזיכרון. לכן אם המקום היה מאותחל ל-0-ים כבר בהתחלה אז אומנם הייתה עדיין קיימת השגיאה אבל היה מודפס סטרינג ריק שזה קצת פחות נורא..

נערך לאחרונה ע"י Web בתאריך 29-09-2008 בשעה 13:21.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 03:28

הדף נוצר ב 0.06 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר