انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: بی نام تا اطلاع ثانوی در 08 شهریور 1392، 03:10 بظ
-
سلام
یه برنامه با C نوشتم و با gcc کامپایلش کردم. حالا که میخوام برنامه رو اجرا کنم خطای زیر رو میده
Segmentation fault (core dumped)
مشکل از کجاست؟ ???
-
دقیقا این مشکل هم برای من پیش اومد دلیلش هم این بود که طول آرایه ای که انتخاب کرده بودم خیلی زیاد بود ، البته وقتی با یه کامپایلر غیر آزاد هم این کار رو کردم اینجوری شد ولی طول حداکثری که برای آرایه انتخاب کردم بیشتر بود فکر کنم مشکل توی تخصیص حافظه باشه من هم نفهمیدم دقیقا چشه ! اگه کسی هست راهنمایی کنه
شما متن برنامه رو بگذار ببینیم چی هست مشکل کجاست ؟ البته اگر برنامتون تحت GPL منتشر می شه ؟!
-
دقیقا این مشکل هم برای من پیش اومد دلیلش هم این بود که طول آرایه ای که انتخاب کرده بودم خیلی زیاد بود ، البته وقتی با یه کامپایلر غیر آزاد هم این کار رو کردم اینجوری شد ولی طول حداکثری که برای آرایه انتخاب کردم بیشتر بود فکر کنم مشکل توی تخصیص حافظه باشه من هم نفهمیدم دقیقا چشه ! اگه کسی هست راهنمایی کنه
شما متن برنامه رو بگذار ببینیم چی هست مشکل کجاست ؟ البته اگر برنامتون تحت GPL منتشر می شه ؟!
یکی از دوستام یه سوال برام فرستاد گفت برنامهاش رو بنویس (گویا ترم تابستان برداشته و این تکلیفشه)
طول آرایه مشخص نیست، از ورودی دریافت میکنه
#include <stdio.h>
#include <string.h>
main()
{
int n, i, j, x[n], s, w, rr, f, mf, a, b, c, r, xxx, bmm, kmmm, k;
char add, mul, factn, kmm, sortac, sortdc, print, new, end, cmd;
printf("enter n: ");
scanf("%d", &n);
for(i=0 ; i<n ; ++i)
{
printf("\nenter numbers: ");
scanf("%d", &x[i]);
}
while(1)
{
printf("\nEnter your commands:");
scanf("%s", cmd);
switch(cmd)
{
case 'add':
for(i=0 ; i<n; ++i)
{
s=0;
s+=x[i];
}
break;
case 'mul':
for(i=0 ; i<n ; ++i)
{
s=1;
s*=x[i];
}
break;
case 'factn':
for(i=0 ; i<n ; ++i)
{
mf=0;
xxx=1;
while(xxx>0)
{
w=1;
f=1;
rr=x[i]/w%10;
f*=r;
mf+=f;
w*=10;
xxx=x[i]/w;
}
}
break;
case 'kmm':
for(i=0 ; i<n-2 ; ++i)
{
a=x[i]; b=x[i+1];
xxx=1;
while(r>0)
{
r=a%b;
a=b;
b=r;
bmm=a;
}
kmmm=x[i]*x[i+1]/bmm;
a=kmmm; b=x[i+2];
while(r>0)
{
r=a%b;
a=b;
b=r;
bmm=a;
}
kmmm=kmmm*x[i+2]/bmm;
}
break;
case 'sortac':
for(i=0 ; i<n-1 ; ++i)
for(j=i+1 ; j<n ; ++j)
if(strcmp(x[i],x[j])>0)
{
k=x[i];
x[i]=x[j];
x[j]=k;
}
break;
case 'sortdc':
for(i=0 ; i<n-1 ; ++i)
for(j=i+1 ; j<n ; ++j)
if(strcmp(x[i],x[j])>0)
{
k=x[i];
x[i]=x[j];
x[j]=k;
}
break;
case 'print':
for(i=n ; i>0 ; --i)
printf("%d ", x[i]);
break;
case 'new':
{
printf("\fEnter new numbers: ");
for(i=0 ; i<n ; ++i)
scanf("%d", &x[i]);
printf("\nNunbers changed.");
}
break;
case 'end':
break;
default:
printf("\nWrong command, try again");
continue;
}
}
return 0;
}
-
مشکل همون اولشه طول آرایه در زبان C باید کاملا مشخص باشه ! پس نمی شه نوشت
x[n]
اگر هم می خوای از
x[n]
استفاده کنی باید قبل از شروع main با constant int n=10 حتما تعریفش کنی و بهش مقدار بدی ! ۱۰ حالا مثاله
اون n هم باید از لیست int هات پاک کنی !
استاد برنامه نویسی ما خودش ازاین قضیه کلافه بود که چرا نمی شه طول آرایه متغییر باشه حالا حال و روزش رو می فهمم جالب تر اینکه طول آرایه هم یه حدی داره و بیشتر هم بشه همین error شما رو می ده من خودم کلافم چون یه برنامه نوشتن که n امین عدد اول را با الگورتیم غربال حساب می کرد مشکل این بود که باید عددهای اول یه جایی ذخیره می شدن و این محدودیت برای کار من ایجاد می کرد چون تا اونجایی که می خواستم نمی تونستم عدد اول ذخیره کنم.
-
قراره طول آرایه رو از ورودی دریافت کنه. من که نمیدونم کاربر چه عددی رو وارد میکنه!
-
این مشکل زبان c هست دیگه شما باید حداکثر مقدار n رو پیش بینی کنی !
البته اینجا یک برنامه پیدا کردم که این مشکل رو نداشت از * استفاده کرده بود
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i;
int* i_array; // this will be the array
int j;
// find out how many integers are required
printf("How many integers? ");
scanf("%d",&i);
// Now allocate memory space
i_array = (int*)malloc(i*sizeof(int)); // allocate storage for the array
// code that uses the new array
for (j=0;j<i;j++)
{
i_array[j]=j; // the pointer can be used as an array
printf("%d\n",i_array[j]);
}
free((void*) i_array); // free up memory for reuse.
system("pause");
return 0;
}
http://www.phy225.dept.shef.ac.uk/mediawiki/index.php/Arrays,_dynamic_array_allocation
-
این مشکل زبان c هست دیگه شما باید حداکثر مقدار n رو پیش بینی کنی !
عجب!!! نمیدونستم. ممنون از راهنماییتون
-
اگه میخوای طول آرایه رو کاربر وارد کنه باید اول n رو تعریف کنی و مقدارش از کاربر گرفته بشه ، بعدشم میتونی آرایه رو تعریف کنی با طول n که اینجا n یه عدد مشخصه که کاربر واردش کرده...
اینجوری :int n;
scanf("%d",&n);
int x[n];
اگه اینجوری حل نشه باید به تعداد n براش حافظه اختصاص بدی که در این صورت باید قبلش آرایه رو با * (اشاره گر) تعریف کرده باشی...
-
اگه میخوای طول آرایه رو کاربر وارد کنه باید اول n رو تعریف کنی و مقدارش از کاربر گرفته بشه ، بعدشم میتونی آرایه رو تعریف کنی با طول n که اینجا n یه عدد مشخصه که کاربر واردش کرده...
اینجوری :int n;
scanf("%d",&n);
int x[n];
اگه اینجوری حل نشه باید به تعداد n براش حافظه اختصاص بدی که در این صورت باید قبلش آرایه رو با * (اشاره گر) تعریف کرده باشی...
بله مشکل حل شد. اول باید n رو دریافت میکردم. ممنون
-
بله مشکل حل شد. اول باید n رو دریافت میکردم. ممنون
قابل نداشت
(حل شد) تو عنوان تاپیک فراموش نشه یه وقت (:
-
بله مشکل حل شد. اول باید n رو دریافت میکردم. ممنون
استاد ما می گفت حتی نمی شه همچین کاری کرد ، دیگه به حرف هیچ استادی اعتماد نمی کنم