שאלה בקשר לקובץ c++

AKAKAK

New member
שאלה בקשר לקובץ c++

זה קובץ main לקולט מחרוזת בלי גודל שקבוע מראש, והבעיה היא:
int main(char y,n) { . . . }​
הבעיה שמחרוזת לא מגיעה באותו גודל כל הזמן וכל פעם התוכנית מקבל מחרוזת בגודל אחר. כי התוכנית מחזירה אחד ורק אז נשלחת שוב לעבודה,כדי לא ליצור עומס על הכונן ושאר המשאבים. אז מה אני משנה בשורה של ה
int main(char y,n)​
? כדי שיקלוט כל פעם מחרוזת בגודל שונה והעם הn חיוני או שלא?
 

AKAKAK

New member
עוד פרט שצריך לציין וחשוב לציין

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

fatfish

New member
אם אתה עובד עם ++C

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

gilad_no

New member
אני כן אתפוס אותך,

אבל לא בגלל משהו אישי. אני מאמין שאם אפשר לעשות משהו בצורה סטנדרטית ולא ייחודית למהדר מסויים, אז עדיף לתמוך בה (אלא אם כן זה מסרבל בצורה קיצונית) ולכן במקרה הנ"ל, יש כמה פתרונות אפשריים: הראשון, כמו שזיו באמת אמר, להשתמש באובייקט מחרוזת. אם זה פרוייקט MFC אז אין בעיה להשתמש בCSTRING, אבל STL יהיה יותר אלגנטי (STRING). פתרון שני יהיה להעביר מערך בתים (CHAR*) ולחשב את אורך המחרוזת עם STRLEN.
 

fatfish

New member
הרעיון הוא...

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

אלדד28

New member
לקומפיילרים אין אובייקטים.

MFC הוא לא קומפיילר. זה שהוא מגיע עם VISUAL STUDIO שמגיעה כסביבת עבודה עם CL, שהוא הקומפיילר של MS, זה לא אומר של-CL יש אובייקט מחרוזת. אני לא ממש מכיר עוד הרבה ספריות שמגדירות מחדש string, חוץ מ-MS שהקונסיסטנטיות היחידה שבה הם דוגלים היא שבירת הקונסיסטנטיות של סטנדרטים רשמיים. יש string בתוך ++standard c (ולא בתוך STL, גלעד), ואפשר וצריך להשתמש בה ולא ב-CString של MFC.
 

fatfish

New member
נתקן את המושג...

סביבת פיתוח - סביבת עבודה וכו.... לא!!!! קומפיילר/מהדר ושמות מוזרים אחרים בסדר??? :)
 

fatfish

New member
ודבר נוסף...

OK, ספריה סטנדרטית <string> קיימת ב-++C. ורק לידיעה, קיימת גם ספרייה שנקראת cstring או בשמה המלא: C-style string functions שהיא חלק מהספריה string (דרך אגב) הספרייה string לא מאפשרת לנו להגדיר משתנה/אובייקט מסוג "מחרוזת" אלא נועדה לספק פונקציות עבור מחרוזות, כשההגדרה עדיין של מחרוזת היא מערך של char. אני הבאתי אובייקט נוסף, ממש מחרוזת, עם אפשרות לבצע עליו את כל מה שמאפשרת הספריה string לבצע על מערך char - למען הנוחות. תסכים איתי, שלעבוד עם משתנה מסוג מחרוזת, ללא ההתעסקות של הקצאות דינמיות, חוסך לך עבודה ונוח יותר מאשר לעבוד עם הפורמט המקורי. כמו כן, תוכל למצא ספריות נוספות של "מחרוזות" עבור סביבות עבודה נוספות... וכל המידע מגיע ממקום אחד בלבד (אני מקווה שכולכם תסכימו שהוא היחיד) :) הנה התמונה שלי...
 

אלדד28

New member
זיו, זיו,

cstring ב-++standard c היא ספריה המשמשת להגדרת כל פונקציות ה- *str, כמו strcpy, במקום string.h הישנה - בדומה ל-cstdio, cstdlib ועוד. אתה טועה. הקובץ "string" ב-++C (שים לב, string ולא string.h) מגדיר את ה - class שנקרא string ומאפשר הגדרת אובייקט מחרוזת. המקור שיש לך ביד הוא אמנם לא היחיד, אבל הוא אומר בדיוק את מה שכתבתי. תבדוק את עצמך.
 

AKAKAK

New member
כן אבל אני שולח מ vb זה הבעיה.

לא מקומפיילר של c++,זאת הבעיה. הקובץ כבר שולח את ההוראה לשני קבצים את המחרוזת ומפעיל אותם.
 

fatfish

New member
כשאתה אומר שאתה שולח מ-VB

הכוונה היא שאתה בונה ActiveX DLL? ב-VB? או ב-++C? בכל מקרה, משתנה מחרוזת שנשלח מ-VB, יתקבל על ידי CString בVisual C ולהפך...
 

AKAKAK

New member
לא יש תוכנה ב vb ויש שלושה קבצים

של c++ וקבץ של txt. ה vb רק שולח לא עושה כלום חוץ מזה שהוא מחכה לערך אחד. הקובץ של c++ ה main שולח del ואחרי שזה מחזיר לmain אחד,הcreate נכנס לפעולה של יצירת המחרוזת שהיא למעשה נתיב(תקייה) שהוא יוצר מחדש. עכשיו זה מחזיר לmain אחד. עכשיו ה main מחזיר אחד ל vb וברגע שה vb מקבל מתחיל הכל שוב אחרי שעובר שורה ואז הכל מתחיל שוב. עקרונית כל התוכנית של הc++ היא למעשה כבר תוכנית exe.* אחרי ההכנה של כל הקבצים. זה מסכם הכל,הפונקציות מה מקבלות?
int del(char * y) { . . . } וה int create(char * y) { . . . }​
ובפתיחת כל אחת מהפונקציות ה strlen תופיע?
 

gilad_no

New member
אתה ממש לא מובן

תנסה להסביר בפשטות ובלי קיצורים. מה אתה מנסה לעשות?
 

AKAKAK

New member
אז הנה הפירוט המלא:

אז ככה יש תוכנה ב vb ויש שלושה קבציםו של c++ וקבץ של txt. ה vb רק שולח לא עושה כלום חוץ מזה שהוא מחכה לערך אחד. הקובץ של c++ ה main שולח del ואחרי שזה מחזיר לmain אחד,הcreate נכנס לפעולה של יצירת המחרוזת שהיא למעשה נתיב(תקייה) שהוא יוצר מחדש. עכשיו זה מחזיר לmain אחד. עכשיו ה main מחזיר אחד ל vb וברגע שה vb מקבל מתחיל הכל שוב אחרי שעובר שורה ואז הכל מתחיל שוב. עקרונית כל התוכנית של הc++ היא למעשה כבר תוכנית exe.* אחרי ההכנה של כל הקבצים.
int del(char * y) { . . . } וה int create(char * y) { . . . }​
העם בפתיחת כל אחת מהפונקציות ה strlen תופיע או שאין צורך לשלוח ואפשר לשלוח מחרזות עם המרה למחרוזת רגילה ולא עם מצביע? הכוונה אחרי שקובץ ה main יקבל וימצא את האורך בעזרת strlen לעשות המרה למחרוזת מקומית,שהיא תשלח לשני הקבצים האחרים או שלא להסתכן ולהשאיר את זה כמחזורת עם מצביע *y ?
 

fatfish

New member
אם הוא מפעיל אותם סתם - ככקובץ...

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

AKAKAK

New member
זה יחזיר ככה:

f1=*​
ככה הוא מחזיר ערך ל vb דומה לשפת c++ או c
 
למעלה