עבור לתוכן

שאלה, תכנות ב C++

Featured Replies

פורסם
  • מחבר

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

בנימין, אם ה size הוא הגודל של המשתנה בבייטים, אז כמו שאמרתי, תעשה cast ל unsigned char * ל pointer ואז תעשה את שאר הפעולות.

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

פורסם

קראת את מה שהדגשתי ב bold במקרה ?

פורסם
  • מחבר

קראת את מה שהדגשתי ב bold במקרה ?

רק עכשיו, סליחה על השאלה הדבילית...

עריכה:

עכשיו יש לי בעיה אחרת, עם ה casting:


void sort(void *pointer, int size, int bytes, int (*bigger)(const void *a, const void *b))
{
unsigned char* pointer2 = pointer;
}

(העתקתי רק קטע מהפונקציה sort, רק היא המשמעותית כאן)

מה לא בסדר באיתחול הזה?

פורסם

שאתה לא מבצע את ההמרה של pointer באופן מפורש. אתה יכול בקוד הקודם פשוט לרשום (unsigned char *) לפני השימוש במילה pointer בשורה ההיא.

פורסם
  • מחבר

שיניתי את זה עכשיו, וזה לא מציג תקלות, אני מקווה שזה יעבוד, תודה רבה בינתיים!

עריכה:

שגיאות זה באמת לא מציג, הבעיה היא שהוא נתקע עם שגיאת הרצה...



void sort(void *pointer, int size, int bytes, int (*bigger)(const void *a, const void *b))
{
unsigned char* temp = NULL;
.... .....
memcpy(temp, (pointer2+j), bytes);
memcpy((pointer2+j), (pointer2+j+bytes), bytes);
memcpy((pointer2+j+bytes), temp, bytes);
.... .....
}

מישהו יכול להסביר לי למה הוא מתפרע?

פורסם

הוא לא מתפרע, אתה מתפרע, כדאי גם שתלמד להשתמש בדיבאגר ולעקוב אחרי ריצת התוכנית.. אתה מריץ MEMCPY לתוך משתנה לא מוקצה (TEMP).

פורסם
  • מחבר

כנראה שלא הבנתי כ"כ טוב איך עובדת הפונקציה memcpy, תוכל להסביר לי?

פורסם

היא מעתיקה כמות מסיימת של מידע בזיכרון למקום אחר. בשביל זה צריך לתת לה גודל, כתובת מקור וכתובת יעד. אתה העברת לה את NULL ככתובת יעד דבר שלא יתכן. אתה צריך להעביר לה כתובת שהקצת לה זיכרון (בין אם זה משתנה בפונקציה שזה STACK או בזיכרון הגלובלי ה HEAP ע"י פעולות כמו MALLOC ו NEW).

פורסם
  • מחבר

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

איך בדיוק אני כותב של שורת ה new שלי?

פורסם
unsigned char *temp = new unsigned char[bytes];

פורסם
  • מחבר

תודה רבה yousux, זה באמת עזר לי!

פורסם

חשוב מאוד לשחרר את הזיכרון שמוקצה באופן דינאמי בסוף השימוש שלו ע"י שימוש בפקודה delete[] כדי למנוע דליפות זיכרון. במקרה שלך עדיף לך להגדיר את temp למשל כ


unsigned char temp[bytes];

בתוך הפונקציה וזהו.

פורסם

חשוב מאוד לשחרר את הזיכרון שמוקצה באופן דינאמי בסוף השימוש שלו ע"י שימוש בפקודה delete[] כדי למנוע דליפות זיכרון. במקרה שלך עדיף לך להגדיר את temp למשל כ


unsigned char temp[bytes];

בתוך הפונקציה וזהו.

זה יעבוד רק אם bytes הוא קבוע (או עם VLA ב-C99, עם קצת שינויים...).

לאחראי הפורום - אם לא נראה לכם שאנשים משתמשים ב-size tag אז פשוט תורידו אותו. אל תכניסו לי מילים לפה. .

פורסם
  • מחבר

סיימתי את התרגיל, תודה רבה לכל מי שעזר לי!

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים