Arama butonu
Bu konudaki kullanıcılar: 1 misafir
9
Cevap
565
Tıklama
0
Öne Çıkarma
Array hakkında bi soru (c)
B
13 yıl (1450 mesaj)
Binbaşı
Konu Sahibi

Merhaba arkadaşlar.

Bi ödevim var fakat arrayle alakalı bir yerde takıldım.

Fonksiyonla array in içeriğini oluşturup bu array i mainde (veya başka bir fonksiyonda) kullanarak başka işlem yapmam lazım.

Arrayin içeriğini oluşturmakta sıkıntım yok, fakat bu içerikleri array i oluşturduğum fonksiyonun dışında veya mainde kullanamıyorum.

Bunu nasıl yapabilirim?

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



S
13 yıl (344 mesaj)
Yüzbaşı

Array'ı oluşturduğun fonksiyonun geriye değer döndürmesi gerekiyor, dizi neyse o. Tamsayı dizisiyse int karakter dizisiyse char döndürecek.

Atıyorum

int f_array(){
//icerigini olusturdun
return diziAdi;
}

main'de çağırmak çok basit

main(){
int dizim[elemanSayisi] = f_array();
}

kolay gelsin





< Bu mesaj bu kişi tarafından değiştirildi someonewhoaintbelongshere -- 22 Nisan 2014; 21:01:38 >

H
13 yıl (109 mesaj)
Teğmen

array tanımını programın en üstünde define kısmında tanımlarsan her yerde kullanırsın.


Bu mesaja 1 cevap geldi.
A
13 yıl (15267 mesaj)
Yarbay

Array'in adresini yolla. Array'in type'ı ne?



B
13 yıl (1450 mesaj)
Binbaşı
Konu Sahibi

Teşekkür ederim cevaplar için. En üstte tanımladığımda main'de arrayin elemanları yazdırmaya çalıştığımda değerler 0 olarak gözüküyor.

@Ata, adres yollayarak yapmam daha iyi olacaktır ödev açısından fakat yapamamıştım. integer ve tek boyutlu bi array.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Ata
A
13 yıl (15267 mesaj)
Yarbay

quote:

Orijinalden alıntı: srgn03

Teşekkür ederim cevaplar için. En üstte tanımladığımda main'de arrayin elemanları yazdırmaya çalıştığımda değerler 0 olarak gözüküyor.

@Ata, adres yollayarak yapmam daha iyi olacaktır ödev açısından fakat yapamamıştım. integer ve tek boyutlu bi array.

Pointer nedir biliyor musun? Ona göre anlatayım.


Bu mesaja 1 cevap geldi.
B
13 yıl (1450 mesaj)
Binbaşı
Konu Sahibi

quote:

Orijinalden alıntı: Ata

quote:

Orijinalden alıntı: srgn03

Teşekkür ederim cevaplar için. En üstte tanımladığımda main'de arrayin elemanları yazdırmaya çalıştığımda değerler 0 olarak gözüküyor.

@Ata, adres yollayarak yapmam daha iyi olacaktır ödev açısından fakat yapamamıştım. integer ve tek boyutlu bi array.

Pointer nedir biliyor musun? Ona göre anlatayım.

Evet biliyorum.



< Bu ileti tablet sürüm kullanılarak atıldı >
Bu mesaja 1 cevap geldi.
A
13 yıl (15267 mesaj)
Yarbay

quote:

Orijinalden alıntı: srgn03


quote:

Orijinalden alıntı: Ata

quote:

Orijinalden alıntı: srgn03

Teşekkür ederim cevaplar için. En üstte tanımladığımda main'de arrayin elemanları yazdırmaya çalıştığımda değerler 0 olarak gözüküyor.

@Ata, adres yollayarak yapmam daha iyi olacaktır ödev açısından fakat yapamamıştım. integer ve tek boyutlu bi array.

Pointer nedir biliyor musun? Ona göre anlatayım.

Evet biliyorum.


C'de pointerlar işleri oldukça kolaylaştırabilir.
#include <stdio.h> 
#include <stdlib.h>

void addFive(int *, int);


int main()
{
int array[3];
array[0] = 0;
array[1] = 1;
array[2] = 2;

//Şimdi array'deki elemanlara 5'ekleyeceğiz
//Bunun için addFive fonksiyonunu çağırıyoruz
addFive(array, 3);

//Array'de neler değişmiş ???
int i;
for(i=0; i<3; i++)
{
printf("array[%d]=%d\n", i, array[i]);
}

//system("pause");
return 0;
}


void addFive(int *array, int array_size)
{
int i;
for(i=0; i<array_size; i++)
{
array[i] += 5;
}
}



İki çeşit array vardır:
1- Static array
2- Dynamic array

Static array'in size'ı bellidir ve değiştirilemez. Stack memory'de compile time'da oluşturulurlar. Yani programı derlediğinde belleğin stack için ayrılmış kısmında oluşturulurlar.
Örnek:
int integer[2];
char character[9];

Dynamic array'in size'ı değiştirilebilir. Heap memory'de runtime'da oluşturulur. Yani program çalışırken herhangi bir dynamic array oluşturulduğunda belleğin heap için ayrılmış kısmında oluşturulur. Kullanıldıktan sonra "free" edilmelidir. Aksi taktirde "memory leak" diye görünen hatalara neden olabilir.*
Örnek:
1-int *integer;
--->>> Burada integer isimli, int tipinde bir dynamic array(pointer) tanımladık. Fakat bu değişken memory'de hiç bir yeri göstermiyor. Dolayısıyla "null" değerine sahiptir. Bu değişkene memory'de allocation yapmazsan(bellekte yer açmazsan) NULL POINTER EXCEPTION alırsın.

2- integer = (int *)malloc(sizeof(int)*4);
NOT: *integer: tutulan değer, integer=tutulan adres
Şimdi adresimiz null dedik. Bu nedenle bir adres alma, bir de bu adresten itibaren kaç tane int tipi değer tutacağımızı 2. adımda yaptık.
--->>> (int *) : type casting, yani tipin ne olduğunu belirtiyoruz
--->>> malloc(ne kadar byte yer açılacak??): memory'de yer açar. Biz int*4 yani 16 bytelık yer açtık. Yani aşağıdaki gibi düşünürsek;

integer: 1200 (1. elemanın başlangıç adresi)
integer+4 : 1204 (2. elemanın başlangıç adresi)
integer+8: 1208 (3. elemanın başlangıç adresi)
integer+12: 1212 (4. elemanın başlangıç adresi)

şeklinde 4 tane int için bellekte yer açmış olduk.

Herhangi bir programla memory'deki adreslere her zaman ulaşabileceğimizi biliyoruz. Yani içinde N tane değer tutan bir array'in size'ını biliyorsak, ilk elemanın adresinden tüm elemanlarına ulaşabiliriz. Tek yapmamız gereken adresi taşımasını bilmek. Bunuda fonksiyona "<type> *" şeklinde vererek yapabiliriz. Yukarıda verdiğim kod örneğinde "int *" verdik.

Son olarak farklı stillerde static ya da dynamic bir array'i kullanma yollarını göstereceğim:

int arr[3];

a) arr[1] = 1;
b) *(arr +1) = 1;

İlk durumda array'in 1 numaralı index'indeki elemanı 1 yaptık. Aslında orada yapılan base adresten 1 int(type int olduğu için) kadar adresi ilerletip değeri koymak.
İkinci durumda'da bir üst satır anlattığım işlem açık olarak yapılmış. Parantez içindeki kısmın önceliği vardır. Base adres alınır, 1 eklenerek type neyse onun size'ı kadar adres ilerletilir. Parantez işlemi sonunda dışındaki *'da anlaşılacağı gibi söz konusu adrese denk gelen değer 1 olarak yerleştirilir.


Biraz düzenden mahrum anlattım ama anlamadığım kısım varsa sorabilirsin ;)


Bu mesaja 1 cevap geldi.
B
13 yıl (1450 mesaj)
Binbaşı
Konu Sahibi

Çok teşekkür ederim, birkaç güne deneyeceğim. Anlamadığım yer olursa sorarım. :)



L
13 yıl (388 mesaj)
Yüzbaşı

hocam mesela fonksiyon içinde deneme[] diye olsun bunu mesela global olarak bi işaretçin olsun bu işaretçi fonk içinde deneme'yi göstersin sonra o aldığı parametreleri yeni bir arraya aktattırman lazım çünkü fonk. Bittiğinde fonks içinde tanımlanan tüm alanlar temizlenir



< Bu ileti mini sürüm kullanılarak atıldı >

DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.