با سلام به دوستان
من می خواهم آرایه ای تعریف کنم که ابعاد آن در ابتدا معلوم نباشد و
بعد یکی یکی در خانه های آن عدد قرار دهم
آیا امکانپذیر هست ؟
در کل مشکل اینه که هنگام تعریف ابعاد آرایه را نمی دونم و بعدآ می خواهم
مقدار توی خانه هاش قرار بدم
با تشکر
با سلام
می تونی با تابع malloc این کارو بکنی به مثال زیر توجه کن :
کد:
float *p=(float *)malloc(n*sizef(float));
چون نوع خروجی تابع void هست خودمان نوعی برای آن تعیین میکنیمو چون حافظه پویا است و یک آرایه همان اشاره گر پس آرایه را اشاره گر تعریف می کنیم
و داخل آن را به اندازه float تقسیم می کنیم n*4 هم تعداد بایت هاست ,نوع float داخل آن آرایه را به بخشهای 4 بایتی تقسیم می کند
در ضمن تابع داخل هدر زیر است :
#include<malloc.h>
حامد جان من منظور شما رو نفهمیدم
حالا منظورم رو به یه شکل دیگه بیان می کنم
ببین ما کد زیر رو داریم
اگه من ندونم سایز آرایه a چیه باید چی کار کنم
کد:
#include <iostream.h>
void main()
{
int a[10];
for(int b=0;b<10;b++)
{
a[b]=b;
cout<<a[b]<<endl;
}
}
چیزی مثل ReDim Preserve وی بی تو C++ وجود نداره
که در ابتدا ابعاد آرایه رو تعریف نکنیم
می شه تو Vector در ابتدا ابعاد Vector رو تعریف نکرد
با سلام
آرایه ها خودشون اشاره گر هستند و این چیزی که شما می خواهیید یعنی حافظه پویا که بعد از کامپایل برنامه به ارایه داده بشه پس می آییم بصورت زیر عمل می کنیم :
یک اشاره گر بنام p تعریف می کنیم تا آدرس اولین خانه آرایه را در خود ذخیره کند و در ضمن نوع آرایه را هم float بیان می کنیم برای ذخیره اعداد اعشاری و با استفاده از تابع mallocاین آرایه را ایجاد می کنیم و چون نوع خروجی این تابع voidاست پس ما برای آن نوع float را انتخاب می کنیم و داخل تابع برای تعیین مقدار فضای آرایه یعنی اینکه چند بایت حافظه را به خود اختصاص دهد متعییر n را به مقدار حافظه ای که یک متغییر float اشغال می کند ضرب می کنیم و بدین صورت مقدار فضای لازم ایجاد می شود.
ئ در ضمن وقتی که ما خواستیم نوع خروجی تابع را عوض کنیم داخل آن را هم پارتیشن بندی کردیم یعنی به خانه های 4 بایتی تقسیم کردیم چون هر متغییر از نوع float 4 بایت فضا به خود اختصاص می دهد
ودر آخر اینکه این فضای بوجود آمده را باید در انتهای برنامه آزاد کنید با دستور زیر :
free(p);
حامد جان من یه چیزایی فهمیدم ولی نه به طور کامل !
اگه برات ممکنه صحبتت رو رو این کدی که دادم پیاده کن
با تشکر
کد:
#include <stdio.h>
#include <iostream.h>
#include <malloc.h>
void main()
{
// int a[10];
int c;
scanf("%d",&c);
int *p=(int *)malloc(c*sizeof(int));
for(int b=0;b<c;b++)
{
p[b]=b;
cout<<p[b]<<endl;
}
free(p);
}
حامد جان دمت گرم همین رو می خواستم
از اینکه به من کمک کردید ممنونم
خواهش می کنم
قابل شما رو نداشت
یه سوال برام پیش اومد و اون اینه که اگه ما این دستور رو در یک
تابع بکار ببریم یا به طور کل یک اشاره گر درون تابع تعریف کنیم
آیا نیازی به آزاد سازی حافظه با همون فیری وجود داره یا با اومدن
بیرون از تابع به طور خودکار فضا آزاد می شه
اگر در داخل همون تابع این آرایه رو بوجود آورده باشی بله مسلما خود به خود موقع خروج از بین خواهد رفت ولی کار از محکم کاری عیب نمی کنه بازه هم آزادش کن