זקוק לעזרה באלגוריתם לריבוע קסם שכתבתי: שגיאת LINKER ERROR... מה לעזאזל? - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

זקוק לעזרה באלגוריתם לריבוע קסם שכתבתי: שגיאת LINKER ERROR... מה לעזאזל?


Vega

Recommended Posts

משימה:

כתוב תכנית מודולרית שמגדירה מערך דו-ממדי בגודל NxN (n יוגדר כקבוע(.

התוכנית תאתחל את המערך במספרים אקראיים שבין 100-0. התוכנית תדפיס על המסך את ההודעה "ריבוע קסם". אם סכום כל השורות, כל העמודות ושני האלכסונים בעלי ערך זהה.

תת-משימות:

יש לבנות תוכנית שכולה בנויה מפונקציות, כלומר שבפונקציית main יהיו רק זימונים וקריאות למשתנים. את הערך N יש להגדיר ב-define על מנת שיהיה קל לעשות tweaking לתוכנה.

פונקציות נדרשות:

פונקציית איפוס פונקציה זו מכניסה ערכים אקראיים בין 1-100 בתוך כל אחד מהתאים במטריצה.

פונקציית שורה בודק את סכום שורה מסויימת במטריצה

פונקציית עמודה בודק סכום עמודה מסויימת במטריצה

פונקציית אלכסון בודק את סכום האלכסון משמאל-לימין

פונקציית אלכנוס בודקת את סכום האלכנוס (ימין->שמאל)

בפונקציית main יש להריץ לולאות:

לולאה שתרוץ מ-0 עד n ותעשה השמה של סכום העמודות במשתנה sum1.

לולאה שתרוץ מ-0 עד n ותעשה השמה של סכום השורות בשמתנה sum2.

בדיקת if:

תנאי לוגי: אםsum1  שווה לsum2 וגם אלכסון שווה לאלכנוס

הדפס("ריבוע קסם!")

**לא סיימתי את פונקציית InitSqr.

שפת C **מעודכן**:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

    #define N 3 /*Sets the number of ColummsxRows [nXn]*/

  void initSqr(int a[N][N]);     /*Inserts random values in the Matrix*/

  int colSum(int a[N][N],int col); /* Receives the Matrix and returns the sum of a given columm*/

  int rowSum(int a[N][N],int row);  /* Receives the Matrix and return a given row's sum.

  int mainDiag(int a[N][N]);     /*Calculates the sum of the left-to-right diag.*/

  int ScndDiag(int a[N][N]);     /*Calculates the sum of the right-to-left diag.*/

    void main()

  {

int a[N][N];

int sum1=0, sum2=0,h,x, trigger=2;

int i;

  initSqr(a); /*Inserts random values*/

for(i=0;i<N;i++)

  sum1=sum1+ colSum(a,i);  /*Calls the loop to check all of the Columms.*/

for (i=0;i<N;i++)

  sum2=sum2+rowSum(a,i);

    if (mainDiag(a)==ScndDiag(a))

      trigger=1;

    if (sum1==sum2  && trigger==1)

      printf("Ribua Qesem!");

  }

int colSum(int a[N][N], int col)

      {

  int i,sum=0;

for(i=0;i<N;i++)

  sum=sum+a[col];

return(sum);

      }

int rowSum(int a[N][N], int row)

      {

  int i,sum=0;

for(i=0;i<n;i++)

  sum=sum+a[row];

return(sum);

      }

int mainDiag(int a[N][N])

      {

  int i,sum=0;

      for(i=0;i<n;i++)

sum=sum+a;

return(sum);

      }

int scndDiag(int a[N][N])

      {

  int i,j=n,sum=0;

for(i=0;i<n;i--)

  {

   sum=sum+a[j];

   j++;

  }

return(sum);

      }

void initSqr(int a)

      {

  int i,j;

for(i=0;i<n;i++)

       {

     for(j=;j<n;j++)

   {

    /*randomize(0-100) a[j]; */

   }

שגיאות debugger **מעודכן**:

1. error 25: function 'mainDiag' shuold have a prototype in function main()

2. error 28 Expression syntax in function main()

3. warning 31: 'trigger' is an assigned value that is never used

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

תודה!

קישור לתוכן
שתף באתרים אחרים

תתחיל מלשנות את הn בdefine לאות גדולה וליישר את הקוד כמו שצריך

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

int rowSum(int a[n][n],row) -> int rowSum(int a[n][n],int row)

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

sum2=sum2+rowSum(a[n][n],i) -> sum2=sum2+rowSum(a,i);

קישור לתוכן
שתף באתרים אחרים

הפונקציה init פעם אחרת קראת לה init ופעם initsqr

וגם בפונקציה עצמה (לא ההצהרה על הפונקציה,אלא למטה איפה שהפונקציה כתובה)

חסר לך Int בסוגריים לפני המשתנה a (חסרה הצהרה איזה סוג משתנה זה)

+מה שHOLY כתב

בקשר לשאר השגיאות,

מצטער אבל אין לי כוח להסתכל על התוכנית עכשיו

זה מעצבן להסתכל על זה ככה (יישור לשמאל! תסדר אותו בבקשה)

וגם אין לי קומפיילר C כרגע אז אני לא יכול לבדוק את הקוד

קישור לתוכן
שתף באתרים אחרים

זה מעצבן להסתכל על זה ככה (יישור לשמאל! תסדר אותו בבקשה)

אממ.. נשבע לך שיישרתי את זה לשמאל, אני מסתכל על הדיון ברגע זה ורואה שהקוד מוצמד לצד שמאל של השורה.. זה רק אצלי ככה?

עשיתי איזה 20 פעם "תצוגה מקדימה" עד שזה יצא נורמלי.

קישור לתוכן
שתף באתרים אחרים

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

**** את הקוד ששמתי פה עכשיו אני מוסיף להודעה הראשונה כך שיהיה קל לקרוא, וגם בקוד הזה יש שינויים אז אני מוסיף את תלונות הdebugger גם פה וגם בהודעה הראשונה***

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

    #define N 3 /*Sets the number of ColummsxRows [nXn]*/

  void initSqr(int a[N][N]);     /*Inserts random values in the Matrix*/

  int colSum(int a[N][N],int col); /* Receives the Matrix and returns the sum of a given columm*/

  int rowSum(int a[N][N],int row);  /* Receives the Matrix and return a given row's sum.

  int mainDiag(int a[N][N]);     /*Calculates the sum of the left-to-right diag.*/

  int ScndDiag(int a[N][N]);     /*Calculates the sum of the right-to-left diag.*/

    void main()

  {

int a[N][N];

int sum1=0, sum2=0,h,x, trigger=2;

int i;

  initSqr(a); /*Inserts random values*/

for(i=0;i<N;i++)

  sum1=sum1+ colSum(a,i);  /*Calls the loop to check all of the Columms.*/

for (i=0;i<N;i++)

  sum2=sum2+rowSum(a,i);

    if (mainDiag(a)==ScndDiag(a))

      trigger=1;

    if (sum1==sum2&&sum2==sum3 && trigger==1)

      printf("Ribua Qesem!");

  }

int colSum(int a[N][N], int col)

      {

  int i,sum=0;

for(i=0;i<N;i++)

  sum=sum+a[col];

return(sum);

      }

int rowSum(int a[N][N], int row)

      {

  int i,sum=0;

for(i=0;i<n;i++)

  sum=sum+a[row];

return(sum);

      }

int mainDiag(int a[N][N])

      {

  int i,sum=0;

      for(i=0;i<n;i++)

sum=sum+a;

return(sum);

      }

int scndDiag(int a[N][N])

      {

  int i,j=n,sum=0;

for(i=0;i<n;i--)

  {

   sum=sum+a[j];

   j++;

  }

return(sum);

      }

void initSqr(int a)

      {

  int i,j;

for(i=0;i<n;i++)

       {

     for(j=;j<n;j++)

   {

    /*randomize(0-100) a[j]; */

   }

debugger:

1. error 25: function 'mainDiag' shuold have a prototype in function main()

2. error 28 Expression syntax in function main()

3. warning 31: 'trigger' is an assigned value that is never used

חבר'ה, אם זה עדיין בלתי-קריא תגידו לי, I'm trying my best...

קישור לתוכן
שתף באתרים אחרים

לגבי 2 הטעויות הראשונות שהוא נותן,אין לי מושג...

לגבי השלישית,

זאת לא באמת טעות

הוא פשוט אומר שאתה נותן לtrigger ערך (2) שאף

פעם לא משתמשים בו,אבל זה לא קריטי

זה ירוץ בלי קשר לזה

עכשיו הייתי מנסה את התוכנית שכתבת בקומפיילר אבל אין

לי אז אני מצטער שאני לא יכול לעזור בקשר ל-2 השגיאות האחרות

יכול להיות שהטעות השנייה היא בשורה הזאת:

(sum1==sum2&&sum2==sum3 && trigger==1) => (sum1==sum2 && sum2==sum3 && trigger==1)

חסר לך רווחים שם,תנסה עם התיקון ששמתי ותראה אם זה יעבוד

אבל עדיין אין לי מושג מה הבעיה הראשונה שהוא מדווח עליה

קישור לתוכן
שתף באתרים אחרים

תיקנתי את ה-if ועכשיו יש לי רק שגיאה אחת, שאני ממש לא מבין מה הבעיה:

Error 25: Function 'mainDiag' should have a prototype in function main

השורה המדוברת היא:

if(mainDiag)a)==ScndDiag(a))

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

תודה

קישור לתוכן
שתף באתרים אחרים

בשורה

int rowSum(int a[N][N],int row);  /* Receives the Matrix and return a given row's sum.

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

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

קישור לתוכן
שתף באתרים אחרים

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

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

האם תוכל להמליץ לי על סביבה גרפית מסוימת עבור XP? אני משתמש כרגע ב-Turbo C.

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

Vega.

קישור לתוכן
שתף באתרים אחרים

יש לי עכשיו בעיה שאני מקבל שגיאה שנקראת Linker error.

הקוד הוא:

#include<stdio.h>

#include<stdlib.h>

#include<conio.h>

    #define N 3 /*Sets the number of ColummsxRows [nXn]*/

  void initSqr(int a[N][N]);     /*Inserts random values in the Matrix*/

  int colSum(int a[N][N],int col); /* Receives the Matrix and returns the sum of a given columm*/

  int rowSum(int a[N][N],int row);  /* Receives the Matrix and return a given row's sum.

  int mainDiag(int a[N][N]);     /*Calculates the sum of the left-to-right diag.*/

  int ScndDiag(int a[N][N]);     /*Calculates the sum of the right-to-left diag.*/

    void main()

  {

int a[N][N];

int sum1=0, sum2=0,h,x, trigger=2;

int i;

  initSqr(a); /*Inserts random values*/

for(i=0;i<N;i++)

  sum1=sum1+ colSum(a,i);  /*Calls the loop to check all of the Columms.*/

for (i=0;i<N;i++)

  sum2=sum2+rowSum(a,i);

    if (mainDiag(a)==ScndDiag(a))

      trigger=1;

    if (sum1==sum2&&sum2==sum3 && trigger==1)

      printf("Ribua Qesem!");

  }

int colSum(int a[N][N], int col)

      {

  int i,sum=0;

for(i=0;i<N;i++)

  sum=sum+a[col];

return(sum);

      }

int rowSum(int a[N][N], int row)

      {

  int i,sum=0;

for(i=0;i<n;i++)

  sum=sum+a[row];

return(sum);

      }

int mainDiag(int a[N][N])

      {

  int i,sum=0;

      for(i=0;i<n;i++)

sum=sum+a;

return(sum);

      }

int scndDiag(int a[N][N])

      {

  int i,j=n,sum=0;

for(i=0;i<n;i--)

  {

   sum=sum+a[j];

   j++;

  }

return(sum);

      }

void initSqr(int a)

      {

  int i,j;

for(i=0;i<n;i++)

       {

     for(j=;j<n;j++)

   {

    /*randomize(0-100) a[j]; */

   }

השגיאה היא: Linker error: undefined symbol ScndDiag(int[3]near*) in module a:\qesem.cpp

אין לי מושג מה זה linker ובכלל מאיפה באה השגיאה הזו.. מישהו מוכן להאיר את עיניי?

קישור לתוכן
שתף באתרים אחרים

יש לך כמויות של שגיאות, אי אפשר לעבור איתך עליהן אחת אחת, אתה צריך לעבור על הקוד שלך

סתם לדוגמא sum3 לא מוגדר, השתמשת בלולאה ב-n במקום N, לא סגרת את הפונקציה האחרונה, הפונקציה initSqr מוצהרת כמקבלת a[N][N] אבל במימוש מקבלת רק a ועוד מלא שגיעות

המטרה של הפורום הזה הוא לא להיות פורום דיבאגינג

קישור לתוכן
שתף באתרים אחרים

אני באמת מתנצל על ההצפה, ובגלל זה גם לא פתחתי לדיון חדש כמו ששמת לב - פשוט שיניתי כותרת. בכל אופן ביקשתי מלא מעט חברים שלי לבדוק את הקוד ולעבור עליו, ובאמת שאין לי מושג מה זה Linker error. בקשר לsum3 זה כבר לא קיים, מחקתי אותו מזמן, זה פשוט היה ניסיון לשיטה אחרת שחשבתי עליה. בכל מקרה, אתה רוצה תנעל, מצידי תעשה מה שבראש שלך. אני אמשיך לחפש ברשת וב-IRC מה לעזאזל פשר ה-linker error הזה.

שיהיה לך המשך עבודה נעימה

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...