עזרה בתוכנית בC - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה בתוכנית בC


BedB0y

Recommended Posts

זה הקוד שניסיתי לעשות: http://dl.dropbox.com/u/24303191/func.txt

התוכנית צריכה לקלוט מחרוזות ואז דרך פונקציה להחליף את המחרוזת הבאה במחרוזת שקודמת לה.

במקום מחרוזת 0 תהיה מחרוזת 1

במקום מחרוזת 1 תהיה מחרוזת 2 וכו'..

אני מנסה להעביר את המערך של הכתובות בתור פרמטר פלט (שזה המטרה העיקרית של התוכנית..לקלוט את הרעיון של להעביר מערכים כפרמטרי פלט)

אין בעיה בקליטה של המחרוזות.

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

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

תודה רבה

קישור לתוכן
שתף באתרים אחרים

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

אבל חוץ מזה, אתה בכלל לא צריך להעביר את strings ל-Func באמצעות מצביע. אתה יכול לעשות ש-Func תקבל **char ולהעביר את strings כמו שהוא, בלי &. אם היית רוצה ש-Func תוכל לשנות את strings (כלומר את הערך של המצביע עצמו, ולא את התוכן של מה שהוא מצביע עליו) אז כן היית צריך לעשות ככה.

עוד כמה הערות:

א. כתוב int main, ולא void main, ובסוף ה-main רשום return 0. זו הדרך התקנית.

ב. הביטוי הזה:

*(strings[j]+i)

שקול לזה:

strings[j][i]

שכמובן הרבה יותר קריא וברור.

ג. למה אתה משתמש בלולאות while איפה שלולאות for יתאימו יותר?

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

קישור לתוכן
שתף באתרים אחרים

עכשיו עובד, תודה על ההערות.

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

בעניין של להעביר כפרמטר פלט, אני לא בטוח שהבנתי.

נגיד ש strings הוא מערך של מצביעים. רק אם אני משנה את הכתובות שיושבות בstrings אז להעביר כפרמטר פלט?

קישור לתוכן
שתף באתרים אחרים

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

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

בעניין של להעביר כפרמטר פלט, אני לא בטוח שהבנתי.

נגיד ש strings הוא מערך של מצביעים. רק אם אני משנה את הכתובות שיושבות בstrings אז להעביר כפרמטר פלט?

נניח שיש לך פונקציה (void f(int x. אתה צריך ש-x יעבור כ"פרמטר פלט" רק אם אתה מתכנן לשנות את הערך שלו בתוך הפונקציה, כלומר שאיפשהו בפונקציה רצית שתהיה לך שורה כזו: x = blabla. במקרה כזה, צריך לעשות (void f(int *x ואז בגוף הפונקציה x = blabla*.

באותו אופן, יש לך כאן (void f(char** strings. אז strings צריך להיות "פרמטר פלט" (כלומר עטוף בעוד רמה של הצבעה) רק אם אתה מתכנן לשנות לו את הערך, כלומר לעשות strings = blabla. כיוון שאתה לא עושה את זה, אתה יכול להעביר אותו כרגיל.

קישור לתוכן
שתף באתרים אחרים

ומה קורה נגיד במצב שלא ידוע לי אורך שורה מקסימלי של כל מחרוזת?

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

במצב כזה להעביר כפרמטר פלט או לא? מבלבל כל הדבר הזה.. :s05:

קישור לתוכן
שתף באתרים אחרים

באופן כללי, אם a הוא מערך ו-j הוא מספר אז

a[j]

זה בדיוק

*(a+j)

.

ובאופן משעשע גם בדיוק

*(j+a)

שזה בדיוק

j[a]

.

לא שאני ממליץ למישהו לכתוב כך, אבל זה משהו ששווה לדעת. :)

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...