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

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



  #1  
ישן 10-10-2008, 03:40
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
[C] שגיאת Assertion בזמן ריצה

כתבתי קוד קטן וזה חלק ממנו:

קוד:
char test(int num) { char *myStr; int n; n = sprintf(myStr, "%s", num); // a bit more code here... }


זו השגיאה שמוצגת לי:
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

אין לי מושג מה רוצים ממני שם...
בהתחלה, המשתנה ששמו "myStr" היה לו השם "str". שיניתי את השם כי חשבתי שאולי זה הגורם לבעיה...
לא כתבתי בקוד שום דבר עם NULL.
הספריות שכללתי הם:
קוד:
#include "stdafx.h" #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h>


אני כותב את הקוד ב- Visual Studio 2005

אז מה הבעיה?

תודה!

עריכה:

נזכרתי בעוד דבר קטן שהיה לי.
לפני כן הקוד היה כזה:
קוד:
char buff[50], *myStr; int n; n = sprintf(buff, "%s", num); myStr =& buff;

וקיבלתי שגיאה בזמן קימפול:
ציטוט:

error C2440: '=' : cannot convert from 'char (*)[50]' to 'char *'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast


למה הבעיה הזו? המצביע והמערך הם מאותו סוג - char.

נערך לאחרונה ע"י dorM בתאריך 10-10-2008 בשעה 03:47.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 10-10-2008, 12:43
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 2 שנכתבה על ידי maind שמתחילה ב "קודם כל אתה רשמת בפרמטר פורמט..."

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

"%s"

, מה שאומר שsprintf תצפה שפרמטר הבא יהיה מסוג מחרוזת (char *) ואתה הבאת לו משתנה מסוג int ולכן אתה מקבל את השגיאה...


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

בפרמטר הראשון הצבתי מצביע מסוג char, כי ראיתי בעמוד הבא: http://www.cplusplus.com/reference/...io/sprintf.html שהם כותבים על הפונקציה:
קוד:
int sprintf ( char * str, const char * format, ... );

משמע שהפרמטר הראשון צריך להיות מצביע מסוג char ...

אח"כ הצבתי בפרמטר הראשון מערך, וזה עבד טוב.
הצבתי במצביע מסוג char את הכתובת של המערך ואז עברתי עליו עם המצביע (שזה מה שרציתי לעשות).
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #5  
ישן 10-10-2008, 12:40
  rlsf rlsf אינו מחובר  
מנהל
 
חבר מתאריך: 09.10.04
הודעות: 15,910
בתגובה להודעה מספר 1 שנכתבה על ידי dorM שמתחילה ב "[C] שגיאת Assertion בזמן ריצה"

בנוסף, אתה לא יכול פשוט לכתוב לתוך הכתובת של המצביע בלי לאתחל את הזיכרון עליו הוא מצביע, אתה יוצר כאן מריחת זיכרון.
הפונקציה sprintf לא מקצה את המקום אליו היא כותבת, ולכן אם אתה כותב למקום לא מאותחל אתה מייצר שגיאת ריצה.
יש שני פתרונות לבעיה הזאת - האחד הוא להשתמש במערך מוקצה מראש (כמו בקוד המקורי שלך), השני הוא להקצות את הזיכרון (שים לב שיש לשחרר אותו בסוף התוכנית) לשם כך אפשר להשתמש בפונקציה asprintf שמקצה את הזיכרון למצביע שהיא מקבלת או להקצות ע"י malloc או calloc לפני הקריאה ל sprintf.
אגב, מומלץ תמיד לאתחל משתנים לפני תחילת הריצה (לדוגמא לאתחל את המצביע ל NULL ואת המספר ל 0)
_____________________________________
הראל

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #6  
ישן 10-10-2008, 13:02
  משתמש זכר dorM dorM אינו מחובר  
מנהל
 
חבר מתאריך: 26.07.08
הודעות: 6,473
בתגובה להודעה מספר 5 שנכתבה על ידי rlsf שמתחילה ב "בנוסף, אתה לא יכול פשוט לכתוב..."

ההקצאה של הזיכרון מוסיפה בתא האחרון את התו '0\' (null character) ?
כי אאל"ט, איפשהו קראתי על הוספה אוטומטית של 0\ בתא האחרון....אולי זה היה במערך מאותחל(?)

ציטוט:
בנוסף, אתה לא יכול פשוט לכתוב לתוך הכתובת של המצביע בלי לאתחל את הזיכרון עליו הוא מצביע, אתה יוצר כאן מריחת זיכרון.

אתה מתכוון דריסת זיכרון?

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


הממ... אני מניח שהדרך העדיפה היא פשוט להשתמש במערך מאותחל ולהצהיר על מצביע שיצביע עליו.

תודה!
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
תגובה

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

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

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

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



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

הדף נוצר ב 0.04 שניות עם 12 שאילתות

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

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