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

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



  #1  
ישן 25-12-2011, 19:32
צלמית המשתמש של Army_Boy
  Army_Boy Army_Boy אינו מחובר  
 
חבר מתאריך: 14.07.06
הודעות: 2,115
התוכנית רצה כמו שצריך במצב Debug אבל לא במצב Release

קוד ראשון:
בהנתן לוח NxN אנחנו צריכים למצוא איפה ניתן להציב עליו מלכות (שחמט)
המשתמש מכניס ערך מסויים לדוגמא 60
ואנחנו צריכים למצוא את הפתרון ה60
בלוח לדוגמא 8 על 8
* בלוח 8 על 8 קיימים רק 92 פתרונות אפשריים

קוד:
void n_queens (int** board, int size, int solution_num) { solution(board,size,solution_num,0,0); PrintChessBoard(board,size,0,0); printf ("\n"); } int isLegit (int **board, int n, int x, int y, int iDir, int jDir) { if (x<0||x==n||y<0||y==n) // out of the board return 1; else if (board[x][y]==1) // met queen , not legal move return 0; x+=iDir; y+=jDir; isLegit(board,n,x,y,iDir,jDir); } int solution (int** board, int size, int solution_num, int col, int i) { if (col==size) return --solution_num; for (i=0;i<size;i++) { /* now we're checking 3 different directions, and if we receive 1 in all the three call we can put our queen here !!!!! */ if (isLegit(board,size,i,col,-1,-1)&& isLegit(board,size,i,col,0,-1)&& isLegit(board,size,i,col,1,-1)) { board[i][col]=1; solution_num=solution(board,size,solution_num,col+ 1,0); // promote col + 1 check the new column if (!solution_num) // checked already all possible solutions till the user's choice return solution_num; } board[i][col]=0; } return solution_num; } void PrintChessBoard (int **board, int size, int row, int col) { /* Print The user's solution chocie Chess board */ if (col==size) { col=0; row++; if (row==size) return; printf ("\n"); } printf ("%d ", board[row][col]); PrintChessBoard(board,size,row,col+1); }


קוד שני:
המשתמש מכניס 2 מחרוזות, ואנחנו צריכים לבדוק איך אפשר לשים את מחרוזת 1 מעל מחרוזת 2 כך שהאותיות יהיו אחת מעל השניה , אפשר להשתמש ברווחים ולהחזיר את המספר המקסימלי של האותיות שיכולות להיות אחת מעל השניה,
קודם לקחתי את גודל המחרוזות וחיברתי אותן ואז רצתי על המחרוזת והחזרתי את הערך הגדול ..
בDEBUG זה עובד מעולה אבל בRELEASE לא ... כמו גם התוכנית הראשונה.. מה יכולה להיות הסיבה לכך??

קוד:
void align_strings(char* str1, char* str2) { int st1=strlen(str1)-1; //get length of first string including 0 int st2=strlen(str2); strcat(str1,str2); // attach strings to one string printf ("the similarity of the strings is: %d\n", similarity(str1,st1,st2+st1,0,st1,st1)); } int similarity (char* str, int left_str, int tot_len, int like, int temp, int string1) { /************************************************** ** left_str --> size of first string tot_len --> size of first+second string like --> times we've found similarity temp --> size of first string if we checked all first string we put temp-->left_str string1 --> the last place we've found similarity ************************************************** **/ if (left_str<0) { left_str=temp; // Reload L_str to start check from the last cell in str1 tot_len--; // promote index by -1 in the total string } if (tot_len-temp<1) //if we reach the last index of the first string return like; /* IF FOUND 2 SIMILAR CHARECTERS */ if (*(str+tot_len)==*(str+left_str)) // string2 [ last Char ] == string1 [ last Char ] { like++; left_str--; tot_len--; string1=left_str; return similarity(str,left_str,tot_len,like,temp,string1) ; } else left_str--; // Keep searcing the similar char in string1 if (left_str>=0) similarity(str,left_str,tot_len,like,temp,string1) ; else // gone from the size of string, promote total string by -1 start search for new charcter /* Putting the last size of string1 because we're looking for similarity from the last cell we did find similarity */ similarity(str,string1,tot_len-1,like,temp,string1); }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #3  
ישן 25-12-2011, 23:57
צלמית המשתמש של Army_Boy
  Army_Boy Army_Boy אינו מחובר  
 
חבר מתאריך: 14.07.06
הודעות: 2,115
טוב ניסיתי לגשת בדרך טיפה שונה לתרגיל עם המחרוזות...
בתגובה להודעה מספר 1 שנכתבה על ידי Army_Boy שמתחילה ב "התוכנית רצה כמו שצריך במצב Debug אבל לא במצב Release"

אני עדיין לא מקבל פתרון נכון ... מה הבעיה??

קוד:
int iSimilar(char* str, int left, int total, int like, int flag, int res1, int res2, int x) { if (total-left<1||total<=flag) { x=-1; return like;} if (left<0) { left=flag; if(x==-1) left=x; total--;} if (*(str+total)==*(str+left)) { x=left; res1 = iSimilar(str,left-1,total-1,like+1,flag,0,res2,x);} res2 = iSimilar(str,left-1,total,0,flag,res1,res2,x); return MAX(res1,res2); } void align_strings(char* str1, char* str2) { int st1=strlen(str1)-1; //get length of first string including 0 int st2=strlen(str2); strcat(str1,str2); // attach strings to one string printf ("the similarity of the strings is: %d\n", iSimilar(str1,st1,st2+st1,0,st1,0,0,-1)); }


הרעיון שלי הוא כזה.. אני מקבל 2 מחרוזות... אני בודק מה האורך שלהן ואז מצמיד אותן אחת לשניה ... עכשיו אני רוצה לרוץ מהקצה הימני שזה הTOTAL ולהשוות אותו לקצה השמאלי שזה הLEFT
עכשיו יש כמה אפשרויות
*אני כל הזמן פוגש אות זהה והכל עובד בסדר
*כל פעם שאני לא פוגש אות אני מחסיר 1 מהLEFT וממשיך לבדוק... כשאני מוצא את האות אני מכניס אינדקס X שיזכור איפה מצאתי אות אחרונה
*כשאני מגיע לסוף הLEFT אני "טוען" אותו מחדש בעזרת FLAG אבל אני לא יכול להתחיל לחפש מתחילת המחרוזת כי כבר מצאתי אות מסויימת אז אני נעזר בX ומכניס לערך LEFT את X ובודק עבור אות חדשה...

עכשיו אני פשוט רוצה להחזיר את ערך הLIKE הכי גדול שקיבלתי ... הבעיה שזה לא עובד לדוגמא בקלט הבא:
1. aaabc
2, abcdaa
אני מקבל aaabc/abcdaa (אחרי שהצמדתי אותן..) אז פה אני יכול לקבל הכי הרבה LIKE=3 משום מה זה מגיע ל5 ואין לי מושג למה

נערך לאחרונה ע"י Army_Boy בתאריך 26-12-2011 בשעה 00:11.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #10  
ישן 27-12-2011, 19:44
צלמית המשתמש של Army_Boy
  Army_Boy Army_Boy אינו מחובר  
 
חבר מתאריך: 14.07.06
הודעות: 2,115
בתגובה להודעה מספר 9 שנכתבה על ידי פסטן שמתחילה ב "אתה רוצה שנקרא בקפה מה..."

מדובר במשימה 5

קוד:
void main() { char* str1; char* str2; int menu = 0; int size1, size2; int* arr1; int* arr2; int* product; // mission 5 int** board; int size; int solution; printf ("Enter the number of the question or 0 for exit\n"); scanf ("%d", &menu); switch (menu) { case 0: break;} //Bye bye


קוד:
case 5: { puts ("enter the size of the board"); scanf ("%d", &size); /* Allocating memory for Two-dimensional arrays */ board=(int**)malloc(size*sizeof(int*)); allocating(board,size,0); /* Initialization */ initialize(board,size,0,0); puts ("enter the number of the requested solution"); scanf ("%d", &solution); n_queens(board,size,solution); free(board); main(); //return to the main break; } default: main();


פונקציה שמקצא זכרון
קוד:
void allocating(int** arr, int size, int i) { /* allocate memory for the entire array */ if (i==size) return; *(arr+i)=(int*)malloc(size*sizeof(int)); i++; allocating(arr,size,i); } פונקציה שמאתחלת מערך דו ממדי ל0 void initialize(int** board, int size, int i, int j) { if (j==size) // move one line down { j=0; i++; } if (i==size) //out of the array return; board[i][j]=0; // initialize j++; initialize(board,size,i,j); } void n_queens (int** board, int size, int solution_num) { solution(board,size,solution_num,0,0); PrintChessBoard(board,size,0,0); printf ("\n"); } לפונקציה הזאת זה לא נכנס במצב RELEASE int isLegit (int **board, int n, int x, int y, int iDir, int jDir) { if(x<0 || x==n || y<0 || y==n) // out of the board return 1; else if (board[x][y]==1) // met queen , not legal move return 0; x+=iDir; y+=jDir; isLegit(board,n,x,y,iDir,jDir); } int solution (int** board, int size, int solution_num, int col, int i) { if (col==size) return solution_num-1; for (i=0;i<size;i++) { /* now we're checking 3 different directions, and if we receive 1 in all the three calls we can put our queen here !!!!! */ if (isLegit(board,size,i,col,-1,-1)&& isLegit(board,size,i,col,0,-1)&& isLegit(board,size,i,col,1,-1)) { board[i][col]=1; solution_num=solution(board,size,solution_num,col+ 1,0); // promote col + 1 check the new column if (!solution_num) // checked already all possible solutions till the user's choice return 0; else board[i][col]=0; } } return solution_num; } void PrintChessBoard (int **board, int size, int row, int col) { /* Print The user's solution chocie Chess board */ if (col==size) { col=0; row++; if (row==size) return; printf ("\n"); } printf ("%d ", board[row][col]); PrintChessBoard(board,size,row,col+1); }
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #11  
ישן 28-12-2011, 13:28
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 10 שנכתבה על ידי Army_Boy שמתחילה ב "מדובר במשימה 5 [CODE]void..."

ביקשתי קוד מלא או לא?
ביקשתי.

מה קיבלתי? בלאגן מזעזע שלקח לי 10 דקות לסדר אותו למשהו שמזכיר קוד קריא.

כואב לעשות הזחות? כואב.
כואב לשים רווחים בין שורות? כואב.
כואב לשמור על אחידות בקוד? כואב.
כואב לבחור את שמים סוגר-מסולסל-פותח בסוף שורה שפותחת בלוק או בתחילת השורה הבאה? כואב.
כואב לשים סוגר-מסולסל-סוגר בסוף פונקציה בשורה משלו במקום בסוף השורה הקודמת? כואב.
כואב פשוט להעלות את קבצי ה-H וה-CPP לפרש? כואב.

כואב למי שמנסה לעזור לך. אולי אתה לא באמת רוצה עזרה.


למרות זאת, לפנים ולפנים משורת הדין בדקתי את הקוד הזה, אחרי שגרמתי לו להתקמפל.
על VS2005PRO (זה מה שיש לי פה) הוא כן נכנס לפונקציה isLegit. כמו גדול. גם ב-release.
גם אם אני מוסיף שם printf, וגם אם אני מריץ בדיבאגר בלי ה-printf.

כל זה תחת ‎‎/O2. תחת ‎‎/Ox הוא לא נכנס לפונקציה. אבל אם אני מוסיף printf הוא כן נכנס לפונקציה.
למה?
רמז:
1>c:\...\main.cpp(44) : warning C4715: 'isLegit' : not all control paths return a value
מה זה אומר? נכון. זה אומר שיש לך פונקציה שאמורה להחזיר ערך, אבל לא עושה return. זה לא כל כך הגיוני. בתכלס זה אומר שערך ההחזרה אינו ידוע. ב-‎/Ox האופטימייזר החליט שאם הפונקציה הזו ממילא לא מחזירה ערך, אפשר לדלג עליה. ובצדק.
קודם עשית פונקציה רקורסיבית בלי תנאי עצירה. עכשיו יש לך פונקציה שלא טורחת להחזיר תוצאה...

אתה יכול לראות את התוצאות המשעשות של זה אם ב-solution תעשה משהו כזה:
int a = 9999; a = isLegit(board,size,i,col,-1,-1);
int b = 9999; b = isLegit(board,size,i,col,0,-1);
int c = 9999; c = isLegit(board,size,i,col,1,-1);
printf("XXXX: %d %d %d\r\n\r\n", a, b, c);
if (a && b && c)


אם, לדוגמה, אני משנה את השורה האחרונה ב-isLegit להיות:
isLegit(board,n,x,y,iDir,jDir);
הוא כן נכנס לפונקציה גם ב-release וגם תחת ‎/Ox, אבל אז כמובן שהתוכנה לא עובדת...

לפי התקן, התוצאה של מה שאתה עושה היא undefined behavior. ראה כאן:
http://stackoverflow.com/questions/...returning-value
הציטוט לעצלנים:
$6.6.3/2 - "Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function."

זה שזה רק לא נכנס לפונקציה ב-release זה כבר טוב. באותה מידה הקוד הזה יכול לשגר טיל גרעיני לעבר וושינגטון...

https://2011-uploaded.fresh.co.il/2...28/88262355.cpp


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

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #13  
ישן 01-01-2012, 23:32
צלמית המשתמש של פסטן
  פסטן פסטן אינו מחובר  
 
חבר מתאריך: 14.12.09
הודעות: 9,751
בתגובה להודעה מספר 12 שנכתבה על ידי Army_Boy שמתחילה ב "שמע תודה רבה על העזרה..."

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

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

אמר פסטן: שניהם גרועים, אבל עדיף להיות טיפש מאשר שקרן.
תמונה שהועלתה על ידי גולש באתר ולכן אין אנו יכולים לדעת מה היא מכילה

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

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

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

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

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



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

הדף נוצר ב 0.07 שניות עם 10 שאילתות

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

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