ABA


"צריך עזרה ב-C++"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15977 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15977
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   15:40   12.07.10   
אל הפורום  
  צריך עזרה ב-C++  
 
   השאלה היא כזאת:
כתוב פונקציה SWAP שמחליפה בין 2 מחרוזות סטטיות שיתקבלו By Pointer
תוך כדי שאני כותב פרוטוטייפ אני מגלה שאני בכלל לא יכול לקבל פוינטר למערך שהוקצה סטטית...
ובלי קשר אין לי מושג איך לעשות את ה-swap הזה...
כל עזרה תתקבל בברכה


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  מכתב D-KinG 12.07.10 16:25 1
     אהאה.. זה בדיוק מה שהם רצו. ronen333  12.07.10 17:16 2
         לא הבנתי מה עשית פה D-KinG 12.07.10 17:25 3
             פרוטוטייפ רק נועד כדי שהקומפיילר יכיר את הפונקציה ronen333  12.07.10 21:13 4
                 את זה אני יודע, כנראה שלא הבנת אותי D-KinG 12.07.10 21:22 5
                     הבאתי לך דוגמה.. היא עובדת ronen333  12.07.10 21:24 6
                         זה עובד ב-C... ב-C++ זה לא עובד, תבדוק D-KinG 12.07.10 21:37 7
                             מכתב ronen333  12.07.10 21:48 8
                                 סבבה קמפלת ב-C++ אבל זה בעצם C טהור... D-KinG 12.07.10 22:01 9
                                     חחח גם אותי עיצבן שזה עובד ronen333  12.07.10 22:20 10
                                     לא בדקתי קומפילציה, אבל אני חושב שהבנתי מה אתה רוצה: ldan192  12.07.10 23:11 11
                                         לפי מה שהבנתי מימנו הוא לא רוצה להחליף בינהם תו תו ronen333  12.07.10 23:12 12
                                             כן, כי זה פויינטר של *const int אז אין בעיה ldan192  12.07.10 23:15 13
                                                 מכתב D-KinG 12.07.10 23:52 14
  בסוף מתברר שהייתה בעיה בניסוח של השאלה... תודה לכולם D-KinG 13.07.10 17:04 15

       
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   16:25   12.07.10   
אל הפורום  
  1. מכתב  
בתגובה להודעה מספר 0
 
   נראה לי שמה שהתכוונו זה שבקריאה לפונ' אני אצור 2 משתנים שהם char* ואשווה אותם למחרוזות הסטטיות
ואז אשלח את הכתובות שלהם...
אבל עדיין לא הצלחתי לבצע את ההחלפה...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   17:16   12.07.10   
אל הפורום  
  2. אהאה.. זה בדיוק מה שהם רצו.  
בתגובה להודעה מספר 1
 
   ומה לא הצלחת?

void swap(char *st1,char *st2)
{
char *temp;
temp=st1;
st1=st2;
st2=temp;
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   17:25   12.07.10   
אל הפורום  
  3. לא הבנתי מה עשית פה  
בתגובה להודעה מספר 2
 
   הפרוטוטייפ בכלל צריך להיות

void swap(char* str1,char* str2)

(משום מה הוא מעלים את הסוגריים המרובעים אחרי השמות str1/2.. ואתה לא שמת אותם גם בהודעה המקורית)
ובכלל מה שעשית שם לא עושה כלום כי אתה עובד עם העתקים...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   21:13   12.07.10   
אל הפורום  
  4. פרוטוטייפ רק נועד כדי שהקומפיילר יכיר את הפונקציה  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 12.07.10 בשעה 21:27 בברכה, ronen333
 
לכל אורך הקוד..
מן הסתם אם רשמתי

void swap(char *st1,char *st2)
{...}

אז הPROTOTYPE שלו הוא

void swap(char *st1,char *st2);

בכ"מ לא יודע מה עבר עלישרשמתי את זה... כנראה הייתי ממש עייף מהעבודה :|.
אי אפשר לשנות את כתובת ההתחלה של מערך.. מה שהם התכוונו זה שתשלח כנראה מצביע למצביע ואז תחליף בינהם.

ככה:


void swap(char **st1,char **st2)
{
char * temp=*st1;
*st1=*st2;
*st2=temp;
}

int main(void)
{
char a[5]={"aaa"};
char b[5]={"bbb"};
swap(&a,&b);
printf("array a in index 0 %c\n",a[0]);
printf("array b in index 0 %c\n",b[0]);

return 0;
}


סליחה על האי הבנה ממקודם.. הייתי הרוג מת


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   21:22   12.07.10   
אל הפורום  
  5. את זה אני יודע, כנראה שלא הבנת אותי  
בתגובה להודעה מספר 4
 
   הכוונה שלי הייתה שבלי כל קשר הפרוטוטייפ שלך לא נכון כי רשמתי שהפונ' מקבלת פוינטר לסטרינג, כאילו char** כזה אבל לא בדיוק כי הסטרינג מוקצה סטטית
אני אנסה להסביר לך את הקושי שבשאלה
הפונ' מקבלת פוינטר לסטרינג שמוקצה סטטית, אם זה היה מערך שהוקצה דינמית אז לא הייתה בעיה ובאמת הייתי משנה את התוכן של הפוינטר שקיבלתי וזהו
אבל בגלל שהוא מוקצה סטטית אני לא יכול לשנות את התוכן של הפוינטר כי זה מעין const שכזה... הבנת?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   21:24   12.07.10   
אל הפורום  
  6. הבאתי לך דוגמה.. היא עובדת  
בתגובה להודעה מספר 5
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   21:37   12.07.10   
אל הפורום  
  7. זה עובד ב-C... ב-C++ זה לא עובד, תבדוק  
בתגובה להודעה מספר 6
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   21:48   12.07.10   
אל הפורום  
  8. מכתב  
בתגובה להודעה מספר 7
 
   ערכתי לאחרונה בתאריך 12.07.10 בשעה 21:53 בברכה, ronen333
 
אני אגיד לך את האמת.. אני מרגיש מבויש על זה שאני כבר לא בטוח בעצמי לגבי C מרוב שלא נגעתי בזה הרבה זמן.

הנה סקין שוט, יקמפלתי בCPP:

נתת לי אחלה נורה אדומה שאסור לי להזניח את C וCPP.

מה הוא רושם לך?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   22:01   12.07.10   
אל הפורום  
  9. סבבה קמפלת ב-C++ אבל זה בעצם C טהור...  
בתגובה להודעה מספר 8
 
   למשל תיקח את הקוד הזה (הקוד שלך עם שינויים קלים)


#include<iostream>
using namespace std;

void swap(char **st1,char **st2)
{
char * temp=*st1;
*st1=*st2;
*st2=temp;
}

void main()
{
char a={"aaa"};
char b={"bbb"};
swap(&a,&b);
cout<<"array a in index 0"<<a <<endl;
cout<<"array b in index 0"<<b <<endl;
}

וזה לא עובר... צריך להעביר את a ו-b למשתנים אחרים שהם char* ואז לשלוח את הכתובות
ובלי קשר אני לא מבין איך זה אמור לעבוד...
כי הרי *st1 זה מערך שמוקצה סטטית אז איך אתה יכול לגעת בו בכלל? =\


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   22:20   12.07.10   
אל הפורום  
  10. חחח גם אותי עיצבן שזה עובד  
בתגובה להודעה מספר 9
 
   זה רק מראה כמה זמן לא נגעתי בזה :|

גם מה שרשמתי למה שהראתי זה די סותר.. חחח

אתה לא יכול.. לדעתי סתם בעיה בקומפילר.

קיצור זה לא אמור לתת לך.. אתה משנה ככה כתובת של מערך ואי אפשר.
אתה חייב לעשות את זה ככה:


char a={"aaa"};
char b={"bbb"};
char *ap=a;
char *bp=b;
swap(&ap,&bp);
printf("array a in index 0 %c\n",*ap);
printf("array b in index 0 %c\n",*bp);

וואי אני ממש לא בעניינים.. תחכה שאיזה תותח CPP יענה לך פה למה אצלי זה שחוק מת.. אני חייב לחזור על זה.. אני לא מאמין שאני נופל ככה על הבסיס.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:11   12.07.10   
אל הפורום  
  11. לא בדקתי קומפילציה, אבל אני חושב שהבנתי מה אתה רוצה:  
בתגובה להודעה מספר 9
 


#include <stdio.h>
#define MAX(X,Y) ((X) > (Y)) ? (X) : (y)

void swap(char *str1[],char *str2[])
{
long len = MAX(strlen(*str1), strlen(*str2));
unsigned i = 0;
while (i < len) {
char tmp = *str1[i];
*str1[i] = *str2[i];
*str2[i++] = tmp;
}
str1 = str2 = '\0';
}

int main()
{
char a[]= "aaa";
char b[]= "bbb";
swap(&a,&b);
printf("array a in index 0 %s\n", a);
printf("array b in index 0 %s\n", b);
return 0;
}


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

עדכן אותי אם זה התקמפל ופעל.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות
   23:12   12.07.10   
אל הפורום  
  12. לפי מה שהבנתי מימנו הוא לא רוצה להחליף בינהם תו תו  
בתגובה להודעה מספר 11
 
   אלא להחליף פשוט בין הכתובות.


זה יכול להתבצע רק ככה נכון?


void swap(char **st1,char **st2)
{
char * temp=*st1;
*st1=*st2;
*st2=temp;
}

int main(void)
{
char *a[] = {"aaa"};
char *b[]={"bbb"};

swap(a,b);

printf("array a in index 0 %c\n",*a[0]);
printf("array b in index 0 %c\n",*b[0]);

return 0;
}


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   23:15   12.07.10   
אל הפורום  
  13. כן, כי זה פויינטר של *const int אז אין בעיה  
בתגובה להודעה מספר 12
 
אבל ישירות - אסור בתכלית האיסור


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   23:52   12.07.10   
אל הפורום  
  14. מכתב  
בתגובה להודעה מספר 13
 
   הקוד האחרון שהבאתם באמת עובד. אבל זה לא מה שהתכוונו בשאלה,
כי אני צריך לכתוב עוד פונ' שעושה אותו דבר תחת אותו main רק עם מחרוזות דינמיות, הבעיה היא שהם מבקשים שיהיה לה את אותו שם בדיוק
ואז זה יוצא אותו פרוטוטייפ וזה בלתי אפשרי... =\
בנוסף הם מבקשים שהפונ' עם המחרוזות הדינמיות תהיה יעילה בעוד שעל הראשונה אין דרישות, כך שמה שנשאר זה באמת להעתיק תו תו, אבל אני לא יכול להסיק שום דבר על הגודל של המחרוזות, אז גם זה נפסל...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות
   17:04   13.07.10   
אל הפורום  
  15. בסוף מתברר שהייתה בעיה בניסוח של השאלה... תודה לכולם  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net