עבור לתוכן

בעיה בפונקציית free()

Featured Replies

פורסם

שלום,

בניתי פונקציה שמוצאת את כל המספרים הראשוניים עד המספר שאתה כותב לו (לפי הנפה של ארטוספן), אבל יש לי בעיה בשימוש בפונקציית free();

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

void main()
{
int i,j=0;
int *a;
double s,prime;
printf("Enter a prime number: ");
flushall();
scanf("%lf",′);
a=(int *)malloc((int) (prime-1));
for(i=1;i<prime;i++) a[i]=i;
s=sqrt(prime);
printf("The prime numbers till %.0f are: ",prime);
for(i=2;i<s;i++)
{
for(j=2;j<prime;j++)
if(j%i==0) a[j]=-1;
}
for(i=2;i<prime;i++)
if(a[i]!=-1)
printf("%d ",a[i]);
printf("\n");
free(a);
}

השגיאה:

כל פעם שאני מריץ את הפונקציה אני מקבל הודעת שגיאה בסופה:

errorxg.jpg

אם אני מוחק את השורה האחרונה של הfree() השגיאה המוזרה נעלמת....

תודה רבה לכל מי שיעזור!

פורסם

אתה משתמש לא נכון ב- malloc, תעבוד לפי התבנית הבאה:

malloc( sizeof(int) * n )

כאשר n הוא מס' ה- int-ים שאתה רוצה (אצלך זה 1)

כמו כן, שים לב שקיימת מגבלה על הגודל המקסימלי ש- int יכול להכיל.. מס' ראשוניים נוטים לגדול מהר.

פורסם
  • מחבר

אתה משתמש לא נכון ב- malloc, תעבוד לפי התבנית הבאה:

malloc( sizeof(int) * n )

כאשר n הוא מס' ה- int-ים שאתה רוצה (אצלך זה 1)

כמו כן, שים לב שקיימת מגבלה על הגודל המקסימלי ש- int יכול להכיל.. מס' ראשוניים נוטים לגדול מהר.

ניסיתי את זה קודם (לפני ששיניתי למה שזה עכשיו)... אבל זה עדיין לא עובד. הינה השורה:

a=(int *)malloc(((int) (prime-1))*sizeof(int));

פורסם

בהקצאה תשנה לשורה:

a=(int *)malloc(((int) (prime))*sizeof(int));כי אם אתה מקצה prime-1 מקומות כלומר האיבר האחרון במערך הוא prime-2 ובהמשך התוכנית אתה פונה לאיבר ה-prime -1 שלא קיים.(תוכל פשוט לא לפנות אליו ולוותר על הקצאת איבר נוסף אם אתה מניח שהמספר prime שאתה מקבל ראשוני, למרות שזה לא חובה, לא ממש משנה)שים לב שהאלגוריתם מחסיר חלק מהאיברים הראשוניים הראשונים.

חוץ מזה האלגוריתם לא ממש יעיל.

בלולאה יש להתחיל מ j=i ולא j=2. כי אם j<i אז j%i !=0 ממילא.

חוץ מזה, יש פתרון יעיל יותר. תכניס את 2 לאיבר הראשון במערך.

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

לשם הדוגמה: לקחתי את המספר 10000000.(מספר די גדול) חישבתי בעזרת האלגוריתם שלך את כל המספרים הראשוניים שקטנים ממנו וזה לקח 2:48 דקות.(אחרי התיקון 2:46 לא כזה הבדל..)

חישבתי את אותו דבר בעזרת האלגוריתם שהצעתי וזה לקח 31 שניות.

פורסם
  • מחבר

בהקצאה תשנה לשורה:

a=(int *)malloc(((int) (prime))*sizeof(int));כי אם אתה מקצה prime-1 מקומות כלומר האיבר האחרון במערך הוא prime-2 ובהמשך התוכנית אתה פונה לאיבר ה-prime -1 שלא קיים.(תוכל פשוט לא לפנות אליו ולוותר על הקצאת איבר נוסף אם אתה מניח שהמספר prime שאתה מקבל ראשוני, למרות שזה לא חובה, לא ממש משנה)שים לב שהאלגוריתם מחסיר חלק מהאיברים הראשוניים הראשונים.

חוץ מזה האלגוריתם לא ממש יעיל.

בלולאה יש להתחיל מ j=i ולא j=2. כי אם j<i אז j%i !=0 ממילא.

חוץ מזה, יש פתרון יעיל יותר. תכניס את 2 לאיבר הראשון במערך.

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

לשם הדוגמה: לקחתי את המספר 10000000.(מספר די גדול) חישבתי בעזרת האלגוריתם שלך את כל המספרים הראשוניים שקטנים ממנו וזה לקח 2:48 דקות.(אחרי התיקון 2:46 לא כזה הבדל..)

חישבתי את אותו דבר בעזרת האלגוריתם שהצעתי וזה לקח 31 שניות.

ניסיתי לעשות את מה שאמרת אבל לא הצלחתי...

אתה יכול לפרסם פה את התוכנית שיצרת?

ארכיון

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

דיונים חדשים