C'de Fonksiyon Argümanında 2 Boyutlu Dizi Sorunu

Başlatan bahadirhtp, 23 Aralık 2011 - 15:36:43

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

bahadirhtp

#include <stdio.h>
#include <stdlib.h>
#define N_row 10
#define N_col 10
void f2(int x[][]);void f3(int data[][]);
int main()
{
    int data[N_row][N_col],letter;
   
    f2(data);
    f3(data);

   
   

 
  system("PAUSE");   
  return 0;
}
void f2(int x[][]){int i,j;for(i=0;i<N_row;i++){for(j=0;j<N_col;j++){scanf("%d",&x[i][j]);} return ;}
void f3(int data[][]){int i;for(i=0;i<N_row;i++){data[i][1]=data[i][0];printf("%d \t",data[i][0]);}; return ;}


                 
                           
GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

alquirel


bahadirhtp

GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

travego0403

C de Dizileri fonksiyonlara aktarırken (2 boyutluları)  2. dizinin boyutunu derleyiciye bildirmelisin.
int x[][N_row]
şeklinde düzeltirsen çalışır. Bir kaçtanede parantez ve ; hatanda var. Kodlardaki girinti kullanarak yazmayıda alışkanlık edin. :)


Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 23 Aralık 2011 - 15:52:58

Yanlış yazmışım şöyle olacak
void f2(int x[][N_row])
;)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

bahadirhtp

#4
void f2(int x[][N_col]){

çalıştı ama çok saçma geldi. neden ikinciyi tanımlıyınca çalıştı???

void f2(int x[][N_col]){
     int i,j;for(i=0;i<N_row;i++){
       
                              scanf("%d",&x[i][0]);};
                               return ;
                               }

ki buydu yapmak istedigima ma hala sorum geçerliliğini koruyor.
GOD'S A KID WITH AN ANT FARM LADY HE'S NOT PLANNING ANYTHIN'

travego0403

Nesne Yönelimli C++ Programlama Kılavuzu(Robert Lafore) adlı kitaptan alıntı:
Alıntı Yap
Niçin fonksiyon ilk boyutun büyüklüğüne ihtiyaç duymaz? İki boyutlu dizinin, dizilerin dizisi olduğunu hatırlayın.Fonksiyon öncelikle argümanın, bölgeleri tutan bir dizi olduğunu düşünür. Fonksiyonun kaç tane bölge olduğunu bilmesi gerekmez, fakat bölge elemanlarının her birinin hangi büyüklükte olduğunu bilmelidir. Böylece belirli bir elemanın bellekte nerede olduğunu hesaplayabilir

"Asıl anahtar kelime yukarıda koyu harflerle yazdığım kısımdır.Bizim burada iki boyutlu tanımladığımız dizi bellekte düz bir şekilde bulunur. 2.dizinin elemanlarına ulaşabilmek içinde yukarıdaki gibi 2.dizinin boyutunu bildirmemiz gerekir" diye düşünüyorum. Aslında bellek işlemleriyle fazla uğraşmadım, eğer bellek işlemleriyle tecrübeli arkadaşlar görürse daha ayrıntılı bilgi verebilirler.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sem

@travego0403;  "sanırım" birinci dizinin elemanlaırna ulaşabilmek için ikinci dizinin elemanlarını bilmek gerekiyor

örneğin şöyle bir diziler serisi olsun;

BELLEKTEKİ A NOKTASI: {0,0,0,0,0,0,0}
BELLEKTEKİ B NOKTASI: {1,1,1,1,1,1,1}
BELLEKTEKİ C NOKTASI: {2,2,666,2,2,2,2}
BELLEKTEKİ D NOKTASI: {3,3,3,3,3,3,3}
BELLEKTEKİ E NOKTASI: {4,4,4,4,4,4,4}

bu durumda dizim şu şekilde ifade edilir boyut olarak; "int dizi[5][6]" şeklinde bir dizi tanımlayıp yukarıdaki şekilde içerisini doldurdum diyleim... Bu durumda başlangıç adresi belli.. BELLEKTEKİ A NOKTASI... Yani "dizi = BELLEKTEKİ A NOKTASI " oldu..

Bu durumda BELLEKTEKİ B NOKTASI = dizi + (7 * sizeof(int)) değerini alır... Dizinin diğer indexdeki elemanlarına ulaşabilmek için bu hesabı yapabilmek gerekiyor... Yani dizi + (INDEX * (7 * sizeof(int))) ifadesi ile birinci ideksimi değiştirebilirim;

0. indeksin adresini INDEX yerine sıfır koyarak bulalım;

dizi + (0 * (7 * sizeof(int)))  ===>>>Bu eşitlik şuna denk olacak;  diziye denk olacak... Yani dizi adresi benim ilk adresim...  Ve bu doğru... Birinci indexi hesaplayacak olursak;

dizi + (1 * (7 * sizeof(int))) ===>>> Evet, (ikinci diznin boyutu) * 1 değerini 0. index'e eklersem birnci indeksi bulmuş olurum... Hali ile;


if( dizi[2][3] == 666)

doğru olarak dönmesi gerekir fakat dizi uzunluğunu bilmeden ikinci indekse gitmek mümkün değildir... Neye göre 2 =) İlk adresten itiabaren kaç basamak sonra 2?

sanırım durum bu =)
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

travego0403

Evet kitaptan alıntı yaptığım yerin devamında senin bahsettiğin hesaptan bahsediyor.Tabi kitap C++ kitabı olduğu için sizeof() lar ile değilde her eleman için gerekli byte'ı indeks ile çarparak elemana erişilir şeklinde anlatılmış. Kısaca derleyiciye elemanların sayısını değilde, her elemanın boyutunu bildirmemiz gerekir.
:)

Bu açıklamalar @bahadirhtp için yeterli sanırım.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

sem

Şu kitabı alamadım gitti.. Başlığı da vardı o kitabın ama daha kitabı almaya da C++'ı ilerletmeye de vakit olmadı =)



Mesaj tekrarı yüzünden mesajınız birleştirildi. Bu mesajın gönderim tarihi : 23 Aralık 2011 - 22:53:31

EK: Başlıktaki 2D aslında 2B olsa daha anlaşılır olur... Hatta 2 boyutlu dizi veya matris desek daha uygun olur... hash gibi bir yapı olsa hadi neyse de array'in karşılığı mevcut...

Hash'in karşılığı nedir bu arada?
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

alquirel

Alıntı yapılan: sem0900 - 23 Aralık 2011 - 22:51:58
EK: Başlıktaki 2D aslında 2B olsa daha anlaşılır olur... Hatta 2 boyutlu dizi veya matris desek daha uygun olur... hash gibi bir yapı olsa hadi neyse de array'in karşılığı mevcut...

Sen istersin de yapmaz mıyız ;)