10 Nisan 2020, 10:59:23

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


dizinin boyutu ile alakalı bir soru

Başlatan izturk, 19 Mart 2020, 13:15:48

izturk

merhaba arkadaşlar,

stm32f100c6 ile gsm modullu bir uygulama yapmaya çalışıyorum.
kodu keil de yazıyorum.

menüleri falan oluşturdum programı bi yere getirdim.

char firma_ismi[16]="FIRMA ISMI      ";
char bos_ekran[16]="                ";

bu şekilde lcd ye yazdıracağım 16 elemanlı diziler oluşturdum. bunları direk lcd ye yazdırıyordum.

daha sonra
char adres1[16]="                ";
char adres2[16]="                ";
bu şekilde iki dizi daha oluşturup bunları lcd ye yazdırmaya çalışınca işler karıştı.
programın başından itibaren lcd ekranım bozulmaya başladı.
bu değişkenlerden hemen sonra tanımlı olan

uint8_t at[3] = {"AT+"};
uint8_t ent 0x0D;

uint8_t cgmi[4] = "CGMI"//üretici firma
uint8_t cgsn[4] = "CGSN"//imei no

değişkenleri ekranımda gözükmeye başlıyor.

ama adres değişkenlerini 17 elemanlı olarak tanımlayıp 16 elemana değer verirsem işler düzeliyor.
ilk tanımladığım firma ismi ve boş ekran değişkenleri 16 elemanlı olmasına rağmen böyle bi problem oluşmuyor.

daha önce seri haberleşmeden bilgi yakalamaya çalışırken de aynı problemle karşılaşmıştım. kullanacağım kadar dan bir fazla eleman tanımlamazsam düzgün çalışmıyordu.

burada bi karakter fazla tanımlamak mı gerekli. neden böyle bi problemle karşılaşıyorum sizce. değişkenin char veya int olması durumu değiştirir mi bu problemin çözümünde.

Kolay Gelsin

İyi Çalışmalar

SpeedyX

19 Mart 2020, 14:05:14 #1 Son düzenlenme: 19 Mart 2020, 14:08:30 SpeedyX
Dizi boyutlarını komple silebilirsin. O zaman düzelecektir.

Sorunun sebebi stringlerin sonundaki NULL karakteri. Yani 16 karaterli bir string aslında NULL dahil 17 bytedan oluşuyor ve sen 16 tanımlayınca, derleyici son karakterin yerine NULL koyuyor yada hiç NULL koymuyor olabilir, hiç NULL koymayan bir programda sonraki dizilerin içerikleri de ekrana çıkar eğer ram adresleri ardışılsa..

z

Her stringin sonuna bir tane 0x00 koyarsan sorun olmaz. 16 bytelik alana 15 byte yerlestirebilirsin. Aksi halde C senin verilerinin uzunlugunu bilemez.

z

Bir diger cozum de ilk karakter alanina stringin boyunu sen koy. Ardindan takip eden adreslerden string boyu kadar elemani sen tek tek cek.

Mesela

0x06Deneme

Normalde C nin sringden anladigi sonu 0x00 ile biten veri dizilimidir.
Mesela program yazma asamasinda Deneme degerini saklamak icin Deneme0x00 yazman gerekir.


izturk

Karakter değil de int verileri saklayacağımız bir dizi veya matris tanımlayacağız diyelim. O zaman boyutları baştan verecek olsak yine birer fazlasını vermeli miyiz o zaman.

Ya da sonuna 0x00 eklemeli miyiz?

z

Integer bir aray ile calisiyorsan 0x00 da kendi basina veri olacagindan dizi boyunu bilerek veri cekmek zorundasin.