PDA

View Full Version : سوال: مشکل با ارایه در C



vb8334
شنبه 20 شهریور 1389, 18:03 عصر
با سلام به تمامی دوستان

من یه سوالی داشتم در مورد ارایه ها سوالم این بود که ما زمانی که
توی ویبی یه آرایه تعریف می کردیم بعد میشد تو برنامه اون رو redim کرد
می خواستم بدونم توی زبان C به چه صورت انجام میشه؟

ممنون

r00tkit
شنبه 20 شهریور 1389, 18:18 عصر
سلام من vb بلد نیست باتوجه به این

redim= کلمه کليدي براي تعريف آرايه هاي ديناميکي



int* r=new int[4];

شاید منظور شما این باشه

Salar Ashgi
شنبه 20 شهریور 1389, 18:33 عصر
توی ویبی یه آرایه تعریف می کردیم بعد میشد تو برنامه اون رو redim کرد
فکر کنم منظورتون تغییر سایز آرایه باشه ، که تو ++C آرایه ها معمولا به دو نوع تعریف میشوند :


Fixed Static
Dynamic

حالت اول به این معنا نیست که سایز آرایه محدود است ، شما در این حالت میتوانید هر سایزی مجاز برای
آرایه انتخاب کنید 10 ، 700 ، 1000 و ... ولی دیگر وقتی آرایه سایزش مشخص شد ، قابل تغییر نخواهد بود .

حالت دوم ، جهت ایجاد آرایه های پویاست ، آرایه هایی که طول آنها در حین اجرای برنامه یا در زمان
Runtime معلوم میشود ، در این حالت باز هم وقتی آرایه سایزش مشخص شد ،
دیگر قابل تغییر نخواهد بود .

ولی این قابلیت برای Vector ها وجود دارد که شما میتوانید سایزی برای آن در نظر گرفته و بعد آنرا تغییر
دهید که اینکار با متود resize انجام میشود ./

موفق باشید ./

r00tkit
شنبه 20 شهریور 1389, 18:41 عصر
نمی دونم redim کارش چیه چون این دو با هم فرق دارن

growable array, resizable array=Dynamic array (http://en.wikipedia.org/wiki/Dynamic_array)

dynamically-allocated array (http://en.wikipedia.org/wiki/Dynamic_memory_allocation)

Salar Ashgi
شنبه 20 شهریور 1389, 19:05 عصر
نمی دونم redim کارش چیه چون این دو با هم فرق دارن

ما هم نگفتیم یکی هستن ، تک تک بررسی کردیم !
ببینید دوست عزیز ، اگه از لحاظ تئوری وار بریم جلو ، میشه آرایه ها رو به 4 الی 5 بخش تقسیم کرد ،
از جمله : Dynamic,Fixed Stack Dynamic,Fixed Heap Dynamic,Fixed Stack Static, ...
ولی همه اینها که در همه زبانها پیاده سازی نشده اند و در زبان ++C,C دو نوع معمول وجود دارد که در بالا
ذکر کردم !
در ضمن در همین لینک ویکی شما گفته بنده دیده میشه :


C++ (http://en.wikipedia.org/wiki/C%2B%2B)'s std::vector (http://en.wikipedia.org/wiki/Vector_%28C%2B%2B%29) is an implementation of dynamic arrays

vb8334
شنبه 20 شهریور 1389, 19:13 عصر
فکر کنم منظورتون تغییر سایز آرایه باشه ، که تو ++C آرایه ها معمولا به دو نوع تعریف میشوند :


Fixed Static
Dynamic

حالت اول به این معنا نیست که سایز آرایه محدود است ، شما در این حالت میتوانید هر سایزی مجاز برای
آرایه انتخاب کنید 10 ، 700 ، 1000 و ... ولی دیگر وقتی آرایه سایزش مشخص شد ، قابل تغییر نخواهد بود .

حالت دوم ، جهت ایجاد آرایه های پویاست ، آرایه هایی که طول آنها در حین اجرای برنامه یا در زمان
Runtime معلوم میشود ، در این حالت باز هم وقتی آرایه سایزش مشخص شد ،
دیگر قابل تغییر نخواهد بود .

ولی این قابلیت برای Vector ها وجود دارد که شما میتوانید سایزی برای آن در نظر گرفته و بعد آنرا تغییر
دهید که اینکار با متود resize انجام میشود ./

موفق باشید ./

ممنون دوستان که پاسخ دادید

سالار جان میشه کدی که گفتی رو بزاری برای تغییر اندازه آرایه

لطفآ هر دو روش رو بگو هم حالت Runtime هم حالت Resize

البته من C کار می کنم ++C کار نکردم

ممنون

Salar Ashgi
شنبه 20 شهریور 1389, 19:18 عصر
برای تغییر اندازه آرایه
دوست عزیز ، من در بالا ذکر کردم ، اینکار بطور پیش فرض برای آرایه ها در ++C,C ممکن نیست ، ولی اگه
با STL یا (Standard Template Library) آشنایی داشته باشید ، گفتم میتونید از Vector ها استفاده کنید ./
یه مثال :
http://www.cplusplus.com/reference/stl/vector/resize/
--------------------


البته من C کار می کنم ++C کار نکردم

بارها من این نکته رو گفتم ، اینطور فکر نکنید که ++C یه زبان و یه دنیاست و C یه دنیای دیگر !
این دو مکمل یکدیگرند ! جدای اینکه ++C تکمیل یافته C میباشد ./

r00tkit
شنبه 20 شهریور 1389, 19:32 عصر
ما هم نگفتیم یکی هستن ، تک تک بررسی کردیم !
ببینید دوست عزیز ، اگه از لحاظ تئوری وار بریم جلو ، میشه آرایه ها رو به 4 الی 5 بخش تقسیم کرد ،
از جمله : Dynamic,Fixed Stack Dynamic,Fixed Heap Dynamic,Fixed Stack Static, ...
ولی همه اینها که در همه زبانها پیاده سازی نشده اند و در زبان ++C,C دو نوع معمول وجود دارد که در بالا
ذکر کردم !
در ضمن در همین لینک ویکی شما گفته بنده دیده میشه :


من پستم رو زمانی نوشتم که pageام رو reload نکرده بودم و ان زمان پست شما رو ندیده بودم


به قول خودتون :موفق باشید ./

Salar Ashgi
شنبه 20 شهریور 1389, 22:26 عصر
به قول خودتون :موفق باشید ./


موفقیت همه دوستان برنامه نویس ، آرزوی قلبی ماست و ما به این افتخار میکنیم !

PC2st
چهارشنبه 24 شهریور 1389, 22:30 عصر
می خواستم بدونم توی زبان C به چه صورت انجام میشه؟در C یا سی++ آرایه‌های خام (raw arrays) (یا ایجاد شده بر روی stack یا ایجاد شده بر روی free store)، تغییر اندازه نمی‌دهند. شما اگر آرایه‌ای را با اندازهٔ x ایجاد کنید، هیچگاه نمی‌توانید اندازهٔ آن را تغییر دهید. بنابراین، به عنوان راه حل، یک آرایهٔ جدید با طول جدید ایجاد می‌کنند و سپس اعضای موجود را از آرایهٔ قبلی در آرایهٔ جدید کپی کرده و آرایهٔ قبلی را نابود می‌کنند. در VB نیز اینکار صورت می‌گیرد اما بطور غیر مستقیم و دور از چشم برنامه‌نویس.

بنابراین، برای تغییر طول آرایه، باید یک آرایهٔ جدید را با طول جدید ایجاد کرده و اعضای آرایهٔ قبلی را در آرایهٔ جدید به ترتیب کپی کنید، سپس آرایهٔ قبلی را نابود کنید. در سی++ کلاس vector این کار را توسط تابع resize برای شما انجام می‌دهد، در زبان C نیز اینکار توسط تابع realloc صورت می‌گیرد، یا بدون استفاده از این تابع:



int* x = (int*)calloc(sizeof(int), 5);
x[0]=1;
x[1]=2;
x[2]=3;
x[3]=4;
x[4]=5;
int* y = (int*)calloc(sizeof(int), 10);
memcpy(y, x, sizeof(int) * 5);
free(x);
x = y;
y = NULL;
x[5]=6;
x[6]=7;
x[7]=8;
x[8]=9;
x[9]=10;

vb8334
شنبه 27 شهریور 1389, 17:54 عصر
ممنون PC2st (http://barnamenevis.org/forum/member.php?u=30917)

من از این کد استفاده میکنم


#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
int main() {
int* array;
int n, i;
printf("Enter the number of elements: ");
scanf("%d", &n);
array = (int*) malloc(n*sizeof(int));
for (i=0; i<n; i++) {
printf("Enter number %d: ", i);
scanf("%d", &array[i]);
}


حالا اگه بخوام همین رو به صورت دو بعدی در بیارم چه جوریه ؟

ممنون

PC2st
شنبه 27 شهریور 1389, 19:16 عصر
حالا اگه بخوام همین رو به صورت دو بعدی در بیارم چه جوریه ؟برای اینکار باید برعکس همین کار را انجام دهید!! یعنی آرایهٔ دوبعدی را بصورت آرایهٔ یک‌بعدی (معمولی) مورد استفاده قرار دهید، باتوجه به اینکه آرایه‌های دوبعدی در حقیقت (نحوهٔ چینش اعضای آنها در حافظه) همان آرایه‌های تک‌بعدی هستند، پس برای ایجاد یک آرایهٔ دو بعدی به اندازهٔ m در n خواهیم داشت:

array = (int*) malloc(m*n*sizeof(int));برای دسترسی به تمام اعضای این آرایه بر اساس اعضای موجود در سطر i ام و سطر j ام:

array[i*(m+1)+j]i از صفر تا m-1 و j از صفر تا n-1 (حداکثر طول آرایهٔ array برابر با m*n است)
بطور مثال برای دسترسی به عضو موجود در سطر اول (0) و ستون سوم (2) می‌نویسیم:

array[0*(m+1)+2] //array[0][2]

vb8334
شنبه 27 شهریور 1389, 19:49 عصر
ممنون

میشه شکل کلی کد رو بذارید من مبتدیم

ممنون

PC2st
شنبه 27 شهریور 1389, 22:06 عصر
#include <stdlib.h>
#include <stdio.h>

int main() {
int* array;
int m, n, i, j, x;
printf("Enter the number of elements: ");
scanf("%d", &m);
scanf("%d", &n);
array = (int*) malloc(m*n*sizeof(int));
for (i=0; i<m; i++) {
for (j=0; j<n; j++) {
printf("Enter number %d, %d: ", i, j);
scanf("%d", &array[i*(m + 1)+j]);
}}
for (x=0; x<m*n; ++x) {
printf("%d: %d\n",x, array[x]);
}
}