iki boyutlu dizilerin byte sınırı ?

Başlatan ziyaretci, 29 Mayıs 2012, 00:12:00

ziyaretci

 merhaba

2 boyutlu dizilerin byte sınırı varmı?

mesela ben;

int abc[][]={
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)},
{ 0x00,0x00,0x00,0x00....(32 byte)}};

bu şekilde kullandığımda  aşağıdaki gibi bir hata alıyorum. PCW derleyiciside bytelar arasındaki virgülü işaretliyor.




sizce sorun nedir?

yamak

Ne kadar eleman kullanıyosan onu belirtmelisin örneği 2 satır 3 sütunluk bir matrisin varsa
int f[2][3] şeklinde tanımlama yapmalısın.Bir de bu tanımlamayı global yapmalısın yerel yaparsan hata alırsın.Yani bir fonksiyonun içinde tanımlamamalısın.

fatihinanc

Merhaba,

Eğer tanımladığınız dizi boyutu PIC in hafızasındaki page(sayfa) yapısını aşıyorsa o zaman da hata alırsınız.
Yani diyelim ki sayfa boyutu maksimum 128byte olsun. Eğer tanımladığınız dizi 256byte ise hata alırsınız. Size "sayfa aşımı hatası" verir.

Kolay Gelsin.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

ziyaretci

#3
sayfa yapısını derken hangi sayfa _?

kasttettiğiniz sayfanın sağa doğru olan boyutu ise dizileri 2 boyut değilde tek tek tanıttığımda yine sağa doğru tabikide bir sorun çıkmıyor.




ziyaretci

Alıntı yapılan: yamak - 29 Mayıs 2012, 01:21:21
Ne kadar eleman kullanıyosan onu belirtmelisin örneği 2 satır 3 sütunluk bir matrisin varsa
int f[2][3] şeklinde tanımlama yapmalısın.Bir de bu tanımlamayı global yapmalısın yerel yaparsan hata alırsın.Yani bir fonksiyonun içinde tanımlamamalısın.



fonk içinde yaptım ...too big diye bir hata aldım hata işaretleyicisi 32  yazdığım parantezi işaretledi.

int a1=0,a2=0;

asıl ben bunu  output_b(abc[a1][a2]);   oalrak kullanmak istiyorum.

yamak

#5
Alıntı yapılan: erkantr67 - 29 Mayıs 2012, 01:40:22
sayfa yapısını derken hangi sayfa _?

kasttettiğiniz sayfanın sağa doğru olan boyutu ise dizileri 2 boyut değilde tek tek tanıttığımda yine sağa doğru tabikide bir sorun çıkmıyor.
Arkadaşın kastettiği memory hafızası eğer sen global tanımlama yaparsan yani bir fonksiyon içinde tanımlama yapmazsan tanımladığın diziye göre memory'de yer ayrılır.Bir örnek verelim şöyle bir dizim olsun
char f[3][5];
char 1 byte olduğundan dolayı ve senin dizin toplamda 3x5=15 ten 15 eleman içerdiğinden dolayı bellekte toplamda 15 byte'lık yer ayrılacaktır.Eğer sen bu sayıyı yükseltirsen örneğin char f[32][32] yaparsan 32*32=1024 byte olacaktır.Atıyorum kullandığın pic'in hafızası 512 byte ise bu durumda hata alırsın. Eğer bu tanımlamayı fonksiyon içerisinde yaparsan yaptığın tanımlamaya göre bu sefer stack'te yer ayrılır.Bunun nedeni ise yerel değişkenlerin ömürlerinin geçici olmasındandır. Yani fonksiyon çağrıldığında oluşturulurlar fonksiyonun çalışması bittiğinde yok olurlar. Stack boyutu da memory boyutuna göre çok düşüktür.Mesela 16f877'de stack 8 seviyeden oluşur ve her bir bölüm 13 bitten oluşur. Memory ise 4 bölümden oluşur bunlara da bank adı verilir ve herbir bank 128 byte tan oluşur.Gördüğün gibi stack, data memory e göre çok daha düşük kapasiteye sahiptir.O yüzden yüksek boyutlu dizi tanımlamaları ile stack'i doldurmamak gerekir. Hatta illa hata almaya gerek yok.Tamamını doldurmayıp çoğunu doldursak bile çalışma sırasında stack overflow gerçekleşir ve program düzgün çalışmayabilir.
Neticeye gelirsek dizi tanımlamanı global yapmaya dikkat et.Global yapsan bile pic'in memory hafızasını geçmemeye de dikkat et. Şunu da unutma ben burada char örnek verdim.Yani char 1 byte yer kaplar. Int ise bu kullanılan derleyiciye göre değişir ama muhtemelen 2 byte yer kaplar.Yani char'a göre 2 kat daha fazla.Senin zaten herbir elemanın 8 bitlik olduğu için char olarak tanımlasan iyi olur.

fatihinanc

#6
@yamak
Sayfa yapısı derken tüm hafızayı kastetmiyorum. Hafızanın PIC için hafızanın "BANK" lara bölünmesi olayı demek istediğim.
Mesela 2 resim ekliyorum(16F877),
       

Bunlardan soldaki Data hafızası sağdaki ise program hafızasını gösteriyor. Mesela sol resimde RAM için Bank 0 da 96 Byte lık alan kullanabiliyormuşuz.
Eğer Bank 0 da tek seferde tanımladığım değişken 96b dan büyük ise bu bir hata sebebidir. Yine aynı şekilde Bank1 için de 80 byte lık alan görünüyor. Bank değiştirme işlemi ise C derleyicisi tarafından otomatik olarak yapılır.

Sağda ise flash hafızanın sayfalanması gösterilmiş. Burada 1FFF, 16F877 nin 8k lık flash hafızasını gösteriyor. Flash hafızada tanımladığınız değişkenler için sayfayı aşmanız biraz daha zor olacağından @yamak ın dediği gibi dizi değişkenin içeriği eğer sabit ise yani programda bir daha değişmesi gerekmiyorsa dizinizi const unsigned char[3] = {1,2,3}; şeklinde tanımlayabilirsiniz. Bu şekilde RAM değil, flash hafızayı kullanmış olursunuz.

Ek : Bahsetmek istediğim olay aslında burada biraz bahsediliyor : http://www.circuitstoday.com/pic-16f877-architecture-and-memory-organization
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)