בעיה בעייתית ביותר ב-c

MaorCS

New member
בעיה בעייתית ביותר ב-c

יש לי prototype:
int function(*a);​
בmain כתבתי:
int a = 0; int b; b=function(&a);​
וכשאני עובר עם הדיבאגר על התוכנית, המשתנה a מתאפס כמו שצריך בהגדרה אבל איך שהוא שולח אותו לפונקציה נהיה בו זבל!! למה?? זה פשוט הורס לי את כל הפונקציה.. איך אפשר לשלוח לי את a לפונקציה by reference (ככה כותבים רפרנס?) בלי שיהרס התוכן שלו? תודה מראש.. :)
 

IP yuval

New member
ה "a" בפונקציה הוא המיקום בזיכרון

של הa שאותו קיבלה הפונקציה. לפי מה שאני זוכר, הערך של a המקורי לא צריך להשתנות אם לא שינית אותו. שכחת גם את ה int *a בprototype...
 

MaorCS

New member
נכון, פה שכחתי את ה int

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

זויברג

New member
השארה,

אתה משנה את המשתנה a. מחוץ לפונקציה, המשתנה a הוא int, ומכיל ערך מספרי, ואתה פונה אליו כa. בפונקציה, המשתנה הוא *int, כלומר מצביע לערך מספרי, ולכן אתה אמור לפנות אליו כa*, אחרת הערך בa הוא לא המספר, אלא הכתובת בזיכרון של המספר. בכל מקרה, הגדרה נכונה של משתנה ref (אין לי מושג איך כותבים את המילה הזאת) היא כך: ההגדרה:
int function(int &a);​
והקריאה לפונקציה:
int a = 0; function(a);​
 

MaorCS

New member
טוב אז קודם כל

בתוך הפונקציה פניתי אליו כ: *a ודבר שני, עכשיו אני ינסה את מה שאתה אמרת.. :)
 

MaorCS

New member
טוב ניסיתי, וקיבלתי ארור:

expected )​
באותו מקום שהחלפתי בפרוטוטייפ את ה* ב-& (בלי ששיניתי שום סוגריים ושום כלום..) בכל מקרה לימדו אותי לשלוח משתנה לפונקציה by ref בדיוק בדרך שעשיתי.. עוד הצעות?
 

MaorCS

New member
הנה הקוד שלי:

דרך אגב לא הבנתי מה קורה בקוד שלך כי אין לי מושג מה זה static כנראה שעדיין לא למדנו בכל מקרה, התוכנית שלי מאוד ארוכה אז פשוט העתקתי את החלקים החשובים, שימו לב שהמשתנה שאני לא מצליח לשלוח לפונקציה by ref הוא count_try הקוד:
#include <stdio.h> #include <stdlib.h> #include <conio.h> typedef struct { char view; char value; int used; }box; #define BOARD_HEIGHT 3 #define BOARD_WIDTH 3 #define WALL_SIZE 1 int calculate_row_col(box game_board[BOARD_HEIGHT + 2 * WALL_SIZE] [BOARD_WIDTH + 2 * WALL_SIZE], int *count_try, int how_much_mines); void main() { box game_board[BOARD_HEIGHT + 2 * WALL_SIZE] [BOARD_WIDTH + 2 * WALL_SIZE]; int a; int count_try = 0; int how_much_mines = 0; a = calculate_row_col(game_board, &count_try, how_much_mines); } int calculate_row_col(box game_board[BOARD_HEIGHT + 2 * WALL_SIZE] [BOARD_WIDTH + 2 * WALL_SIZE], int *count_try, int how_much_mines) { *count_try++; }​
 

IP yuval

New member
עוד 4 שעות אני ער...

א. אתה לר צריך את conio.h. ב. main זה int. ג. פונקציה שהיא int, צריכה להחזיר ערך. ד (והחשוב). צריך לזכור את סדר האופרטורים בע"פ:
(*count_try)++;​
ה. צריך לדבג עם printf.
 

MaorCS

New member
א.כמו שאמרתי, העתקתי חלקים מהתוכנית

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

ahab

New member
כמה דברים...

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

Moridin

New member
בדיקה פשוטה של סדר האופרטורים

void func(int *pi) { (*pi)++; } int main(int argc, char *argv[]) { int i=2; func(&i); printf("%d",i); system("PAUSE"); return 0; }​
מדפיס 3
void func(int *pi) { *pi++; } int main(int argc, char *argv[]) { int i=2; func(&i); printf("%d",i); system("PAUSE"); return 0; }​
מדפיס 2.
 

MaorCS

New member
טוב זה מה שניסיתי לעשות:

שיניתי את הפרוטוטייפ של הפונקציה, ועשיתי דבר כזה:
int function(int *x);​
בקריאה לפונקציה, במקום ה-*X כתבתי: &count_try הרצתי עם הדיבגר, כרגיל בתחילת התוכנית הוא מאפס את count_try, ואיך שהוא מגיע לשורה של הפונקציה הוא כותב לי: undefined symbol 'count_try' כאילו בכלל לא הגדרתי אותו כשהפונקציה מסתיימת הוא חוזר לתוכנית כש count_try שווה 0, כלומר הוא לא נגע בו בכלל..
 

ahab

New member
תרשום את כל הקוד...

נשמע שאתה עושה משהו לא נכון. מחצאי תיאורים של מה שכתבת קשה להבין מה בדיוק הבעיה.
 

MaorCS

New member
ברוך השם הסתדרתי..

ישבתי היום עם המורה שלי והיא ישר קלטה מה הבעיה נראה לי שאמרו פה את הפיתרון.. כל מה שהייתי צריך לעשות זה:
(*count_try)++;​
תודה לכולם.. :)
 

Moridin

New member
למה לשם אתה מודה?

http://www.tapuz.co.il/tapuzforum/main/Viewmsg.asp?forum=89&msgid=40863801
 
למעלה