Fonksiyon içinden global değişkeni değiştirme sorunu

Başlatan t2, 02 Ocak 2014, 22:00:00

t2

BYTE say;

şeklinde tanımlı global (zannettiğimiz) değişkenimiz olsun.

Main içinde çeşitli satırlarda:

fonksiyon1(); say++;


şeklinde kullanılıyor normal çalışıyordu.  Bunun yerine say++; kısmını fonksiyon1 içine  ekleyeyim dedim. Fakat o zaman program istediğim gibi çalışmıyor resmen sapıtıyor. başka değişiklilk yapmadan sadece bu kısmı değiştirdim. Eski haline gelince normal çalışıyor. yani ana döngü içinde global değişkeni değiştirmeliymişiz.


Acaba bu durum  temel bilgi eksikliğimden mi kaynaklanıyor? Global değişkenin fonksiyonlar içinden de değiştirilebilmesi için ek bazı  ifadeler mi var?  Yoksa xc8 sürümüne ait sorun mu? v1.21 kullanıyorum

Erol YILMAZ

Byte say;
Tanimini kullanmak istediğin fonksiyonun üzerinde
Yapman gerekiyor...

Xc boyle temel bir bug barindirmaz saniyorum.

t2

Üstünde tanımlı zaten. Taa programın başında bir yerlerde. Diğer türlü zaten derleme başarısız olur.

Tagli

fonksiyon kesme içinden de çağrılıyor mu veya say'a kesme içinde de erişiliyor mu?
fonksiyon içinde başka bir say tanımlanmış olabilir mi? (maskeleme meselesi)
say++ yazılmış olduğu gibi tek başına mı kullanılıyor yoksa daha uzun bir işlemin bir parçası mı?
BYTE olarak tanımlanan tür gerçekte nedir (bildiğim kadarıyla XC8'de doğrudan byte adında bir değişken türü yok.)
Programın sapıtması biraz bulanık bir ifade olmuş. Mümkünse gerçek sistemde, değilse simulasyon ortamında debug yapılmasını tavsiye ederim. say değişkenine ne olduğunun anlaşılması gerek öncelikle. Mesela 14, sonra 15, sonra 16 olup sonra birden 243 falan oluyor mu?

gerbay hocam, anladığım kadarıyla değişken zaten dışarıda tanımlanmış. Sadece erişilen yer değişiyor.
Gökçe Tağlıoğlu

t2

Kesme yok. Değişken tüm fonksiyonların dışında tanımlanınca static yazmaya gerek olmaz sanıyorum.

Programda başka mantık hatası da olabilir. Sorun devam ederse bunu gösterebilmek için ayrı bir kod iletirim. Belki de bu kodu hazırlarken sorunu fark edebilirim.

Gökhan BEKEN

İlk dikkatimi çeken, xc8 de BYTE gibi bir tür yok.
Değişkene ilk değer ataması olarak 0 vermenizi tavsiye ederim, sırf bu yüzden bile olabilir.
say değişkeni fonksiyondan sonra tanımlanmışsa belki ondan olmuyordur.
Derlediği halde mi çalışmıyor, yoksa hiç mi derlemiyor?
Muhtemelen gözden kaçırdığınız birşey var, debug yaptınız mı?
Özel mesaj okumuyorum, lütfen göndermeyin.

t2

BYTE diye tür var. Yeni çıkmış galiba. unsigned char ile aynı oluyor.

Gökhan BEKEN

Hocam o kadar tavsiyede bulundum, bir de ben deneyim dedim, sizin sorun bende de oldu. Debug yapınca farkettim ki, main fonksiyonu içinden global değişkene değer verdiğimde 0 oluyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

muhittin_kaplan

değişkene 0 dan farklı değer verip denermisiniz ?
byte sayi=1 gibi
birde sadece byte veri demi yapıyor bunu

Gökhan BEKEN

Sorunda şu imiş:
ben deneme yaparken "a" isminde bir değişken kullandım
aslında ben daha önce main içinde daha sonra başka bir şey için unsigned char a; olarak kullanmışım. Deneme yaparken de unutmuşum daha önce böyle birşey yaptığımı.
Sizde de böyle bir sorun olabilir.

Böyle yapınca sorun yok:
int asda=0;
void deneme(void){
    asda=5;
}
void main(void)
{
    deneme();
}
Özel mesaj okumuyorum, lütfen göndermeyin.

muhittin_kaplan

eğer hem global de hemde fonksiyonun içerisinde tanımlarsanız local değişken olmaz mı hata bu muymuş sanki t2 farklı diyor.

t2

Benim hata dediğim durum gercek değil galiba. Baska sorunlar nedeniyle kodu komple degistirdim. Sade bir ornek ile henuz deneme yapamadim.

elektronart

Kodunuzun biraz daha büyük olduğunu ve örnek olsun diye bu şekilde kısa bir kod yazdığınızı varsayıyorum.
Değişkenler yaratılırken RAM içinde adres 0dan başlayarak önce global değişkenler yaratılır. Sonrasında global değişkenlerin bittiği yerden HEAP adı verilen bölge başlar alloc, malloc gibi komutlarla yaratılan değişkenler yer alır. Geri kalan bölgenin son adresinden başlayarak ramin 0 adresine doğru da STACK kullanılır. Programın herhangi bir yerinde stack geri kalan alanı doldurursa global değişkenlere sıçrar ve bu değişkenlerinizi bozabilir. Global değişkenleri azaltabilir veya bu değişkenin sırasını değiştirebilirsiniz. Şanslıysanız bu değişken kurtulur, şanssızsanız başka bir değişken bozulur :)
Açık Elektronik

t2

olur mu böyle şeyya? yakışyor mu xc8 gerçekten böyle yapar mı?

atioky_216

 Temel c den hatirladigim kadari ile static degiskenleri alt fn ile degistirmenin en guzel yolu o degisken adresini bir pointere atayip adres cagirarak degisiklikleri yapmak diye hatirliyorum..