Tam Sürümünü Görmek İçin : Matris sorunu
aysesule
15/05/2008, 14:42
Şöyle bi şey uygulamak istiyorum kişiden kaclık bir kare matris olusturulacagı alınacak yanı n'i aldım mesela sonra;
int dizi[n-1][n-1];
dediğimde hata oluşuyo?
daha sonra;
a=dizi[0][0]+rand()%dizi[n-1][n-1] diye bi yer belirlemek istiyorum matrisin içinde ve bu a nın satır ve sutun degerlerını almak sonra...Bu randomu dogru mu kullanıyorum?basit uygulamalarda kullanımı boyle oluyo ona uyarlamaya calıştım.burdaki a nın pointer olması gerekıyo dı mı???ve a'nın satır ve sutun degerını nasıl elde edebılırım??
görünen o ki pointer kullanman gerekecek, bol bol da malloc() yapacaksınız.
int **matris;
şeklinde bir tanımlama kullandıktan sonra,
sonra ister matris[i][j] şeklinde, ister *(*(matris + i) + j) şeklinde kullanabilirsiniz.
Tabi bu satır ve sütunlara bir başlatma işlemi olarak malloc ile int kadar yer ayırmak gerekecektir.
Gerçi ben satır sütunu hep karıştırırım, yanlışsam biri düzeltsin :p
Bildiğim kadarıyla matris satır ve sütun boyutlarını C'de sizin belirlemeniz ve unutmamanız lazım, çünkü öğrenemezsiniz.
aysesule
15/05/2008, 15:25
Doğrusu tam olarak ne yapmam gerektiğini söylediğini anlayamadım yada bilmediğim için anlayamıyorum.Ben yeniden özetleyeyim yapmak istediğimi bana malloc kullanmaya gerek yokmuş gibi geldi de.
1)Öncelikle kaclık bi matris oldugunu alıyom dısardan (n)
2)sonra n*nlik bi matris tanımlıyom(yukardaki gibi ama hata veriyo)
3)sonra rasgele matriste bi yer belirliyom ve a ya atıyom(örn dizi[3][4] cıktı random sonucu ve en önemlisi bunun(a'nın) satır 3 ve sutun 4 degerını alabılmek istiyom?)
sekizbit
15/05/2008, 19:19
Bildigim kadari ile dizi tanimlamalarinda dizinin kac elemanli olacagi derleme sirasinda belli olmasi gerekiyor. Ancak bazi derleyiciler yukardaki islemi yapmaniza izin veriyor bazilari vermiyor. O yuzden hata aliyorsunuzdur.
Diziniz 2 boyutlu oldugu icin pointer`a pointer yapmaniz gerekir.
int **a ; gibi, daha sonra kullanicidan aldiginiz n`e gore bu pointerlara bellek uzerinde yer alirsiniz.
Bunu, eger C++ kullaniyorsaniz "new" ile yapabilirsiniz, yada "malloc" kullanmaniz gerekir.
"new" ile yaptigimizi dusunursek, Matris`in her satiri ayri bir dizi olacagi icin buralari teker teker almamiz gerekir. yani ;
a = new int*[n] ;
for(i=0;i<n;i++)
a[i] = new int[n] ;
Bundan sonra dizinin her elemanina a[i][j] = 5; gibi ulasabilirsiniz.
quasimodo
15/05/2008, 21:22
Bildigim kadari ile dizi tanimlamalarinda dizinin kac elemanli olacagi derleme sirasinda belli olmasi gerekiyor. Ancak bazi derleyiciler yukardaki islemi yapmaniza izin veriyor bazilari vermiyor. O yuzden hata aliyorsunuzdur.
Aslinda her nekadar derleyicisi olmasada C99 standartinda, yerel dizileri boyutu derleme zamaninda belli olmayabilir.
acehreli
15/05/2008, 21:32
sekizbit, quasimodo'nun dedigi gibi dizi boyutunun sabit olmasi derleyiciden cok standarda bagli.
Bu henuz C++'ta yasal degil ama dedigin gibi, C++ icin de ek olanak olarak bulunabiliyor. aysesule'nin hangi dili kullandigini bilmiyoruz ama C++ herhalde... Tabii oyleyse vector kullanmak daha dogru olur ama daha ogrenmemislerdir...
Ali
aysesule
15/05/2008, 22:34
C de yazmam gerekiyor,anladığım kadarıyla n*n lik bir matris tanımlayabilmem için once onun için bellekte yer ayırmam gerekıyor ok.randomun yukardaki gibi kullanımı dogru mu?Bi de int **a;tanımı int a; eşit olmuyo mu??
acehreli
15/05/2008, 23:16
int n = rand() % N;
yazdigin zaman [0,N-1] araliginda ve ancak bir odev icin kabul edilebilecek kadar rassal bir deger elde edersin. O degeri nasil kullanacagini bilmiyoruz ama herhangi baska bir deger olarak kullanabilirsin.
int** "int isaretcisi isaretcisi" anlamindadir:
int a = 0; /* <-- bir int */
int * p = &a; /* <-- bir int'i gosteren isaretci */
int ** pp = &p; /* <-- bir int isaretcisini gosteren isaretci */
Ali
sekizbit
16/05/2008, 03:50
sekizbit, quasimodo'nun dedigi gibi dizi boyutunun sabit olmasi derleyiciden cok standarda bagli.
Bu henuz C++'ta yasal degil ama dedigin gibi, C++ icin de ek olanak olarak bulunabiliyor. aysesule'nin hangi dili kullandigini bilmiyoruz ama C++ herhalde... Tabii oyleyse vector kullanmak daha dogru olur ama daha ogrenmemislerdir...
Ali
Evet standart ama derleyicilerin bazen standartlari yok saydigini gormustum :) Mesela ayni kodu dizi olayi yuzunden Visual Studio`nun C derleyicisi derlemezken, GCC derliyordu.
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.