עבור לתוכן

ערב טוב, בעיה בקריאה לפונקציה חיצונית - שפת C

Featured Replies

פורסם

אהלן :xyxthumbs:

אני כותב תוכנית מסויימת באנליזה נומרית, ועל הדרך צריך להזכר בכללים הנוקשים של שפת C

החלק הראשון של התכנית הולך כך :

#include <stdio.h>

int find_rank()
{
int n;

printf("Please enter matrix rank:\n "); /* number of equations - 1 */
scanf("%d", &n);

return n;
}




int main()
{
int i=0;
int n = find_rank(); /* call an outside function since we cant declare an array with no finite number of components */
double b[n], d[n], c[n], a[n], x[n];


double denom=0; /* denom as a shortcuf for denominator = 'mechane' */



/*the first and last T's are constants*/
printf("Enter T0:\n ");
scanf("%lf", &b[1]

עצרתי במקום שבו התוכנה זיהתה שגיאה- נכתב שהשגיאה היא לפני ;

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

מה כתבתי לא נכון שגרם לו לדלג על הפונקציה find_rank ?

פורסם

הבעייה נובעת מכך שאין בC\C++ (למעט C99 שכן תומכת בזה בתקן, אבל אל תסתמך על זה) תמיכה במערך שמוגדר באופן דינמי על הstack (כלומר שהגודל שלו לא ידוע בזמן הקומפילצייה).

בשביל לפתור את הבעייה משתמשים באלוקצייה דינמית,aka malloc


double* pXArray=NULL;
int n = find_rank();
pxArray = (double *)malloc(n);

ואל תשכח לשחרר לאחר מכן את הזיכרון עם קריאה מתאימה ל free()

אם כל הנושא של אלוקצייה דינמית ומצביעים חדש לך אני ממליץ לך לעבור על ספר\מדריך בנושא, זה אחד הנושאים שאוכלים עליו הכי הרבה קש בC.

פורסם
  • מחבר

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

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

פורסם

בקיצור, הצורה הכללית היא מה ש-Moonblade אמר.

(אגב, Moonblade, ב-malloc צריך לזכור לכפול ב-sizeof של הטיפוס שאתה רוצה לאלקץ, כי הוא מאלקץ בבתים)

פורסם

לאלקץ

:-X

להקצות

פורסם

הבעייה נובעת מכך שאין בC\C++ (למעט C99 שכן תומכת בזה בתקן, אבל אל תסתמך על זה) תמיכה במערך שמוגדר באופן דינמי על הstack (כלומר שהגודל שלו לא ידוע בזמן הקומפילצייה).

בשביל לפתור את הבעייה משתמשים באלוקצייה דינמית,aka malloc


double* pXArray=NULL;
int n = find_rank();
pxArray = (double *)malloc(n);

איפה אתה רואה בקוד שלו מערך ?

ואל תשכח לשחרר לאחר מכן את הזיכרון עם קריאה מתאימה ל free()

אם כל הנושא של אלוקצייה דינמית ומצביעים חדש לך אני ממליץ לך לעבור על ספר\מדריך בנושא, זה אחד הנושאים שאוכלים עליו הכי הרבה קש בC.

פורסם

ב-main, מיד אחרי הקריאה ל-find_rank הוא מגדיר את המערכים b,d,c,a,x.

פורסם

נכון, סבבה, אחלה !

ארכיון

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

דיונים חדשים