Time Critical Coding in C/C++

Biz işe alımda adayın yorum yapma yeteneğini sorguladık hep. Değerli olan budur. Yoksa birisine X programını yaz gel dersen, o kişi de o işe çok muhtaç ise, bir yerden borç alır, o programı yazdırıp sana getirir.
 
C:
uint32_t xReturnBase (uint8_t size)
{
    char temp[size];
    char* ptr = &temp;
    return ptr;
}

@Bowman'nında dediği gibi allocate sorusuna şöyle bir cevap uygun olur mu
 
C:
uint32_t xReturnBase (uint8_t size)
{
    char temp[size];
    char* ptr = &temp;
    return ptr;
}

@Bowman'nında dediği gibi allocate sorusuna şöyle bir cevap uygun olur mu

O dediğin yapı standart C/C++ da yok. Ama alloca çok eskiden beri standartta yer alan bir özellik ve ÇOK HIZLI iş görüyor. Tek yapması gereken, stack pointer registerinden bir sayı çıkarmak. Yani RISC mimaride tek saat döngüsünde hafıza ayırıyorsun.
 
Kod:
uint32_t xReturnBase (uint8_t size)
{
    char temp[size];
    char* ptr = &temp;
    return ptr;
}

Bu kod fonksiyon icinde iken stack icinde yer ayiriyor fakat stack pointer registerini maniple etmedigi icin fonksiyon cikisinda o alan sistem tarafından cer cop alani olarak kullanilmaya devam edilir dolayisi ile bu alan yazboz alani olarak kullanilamaz.
 
@Ahmet ilk sorunun cevabı işlemcinin "little endian" mı yoksa "big endian" mı olduğuna bağlı.

32 bit int değişkende 320 sayısı (little endian)

40H
01H
00H
00H

32 bit int değişkende 320 sayısı (big endian)

00H
00H
01H
40H

Bu durumda little endian makinada ekrana 64 yazılır, big endian makinada ekrana 0 yazılır.

Kod:
int main()
{
    int a = 320;
    char* ptr;
    
    ptr = (char*)&a;
    
    printf("%d",*ptr);
}

Endian onemli mi?

Tersden de yazsa duzden de yazsa a=320 anlamina gelecek.

printf satirinda %d olarak gosterim yapacakken a degiskenin adresinden veriyi okurken gene hangi Endianda yazildiysa o Endianda da ayni sayisi okumayacak mi?
 
printf fonksiyonuna burada verilen, char tipindeki bir işaretçinin içindeki değer. Bu değeri de printf ne yapıyor? int olarak işliyor.
 
Sonucta char pointer int a degiskeninin yazildigi adresi (a nin ilk byteinin adresini) donduruyor.

Ilk byte H byte ise okurken de H byte olarak okuyacak. Ilk byte L byte ise okurken de L byte olarak okumayacak mi?

C bildigimden degil mantik yurutuyorum.

Soruyu a=0x4142 olarak verseydi. "Printf"de %d degil %c ile sorsaydi o zaman endian durumu isin icine girecekti.
 
Son düzenleme:
Sen assembly mantığında düşünüyorsun. Assembly'de her değişken bir adrestir. Ama C de değişken ve işaretçi ayrımı var. printf'e bir adres verilmiyor burada, işaretçinin içindeki değer veriliyor. 8 bit olan o değer de 32 bit'e "extend" ediliyor ve öyle kullanılıyor.
 
Kafama yatmadi. C deneme yapmam su anda zor.

Diyelim ki

A degiskeni 100 Adresinde.

Degeri de A=0x0001 olsun.

Bu Endian durumuna gore

ya

Adres0x1000x1010x1020x103
Icerik0x000x000x000x01

ya da

Adres0x1000x1010x1020x103
Icerik0x010x000x000x00

olarak yerlesir.

Simdi A degiskeni icin char pointer atarsak A adresi 0x100 olarak atanir.

Ardindan

char pointerin gosterdigi degeri int olarak goster dersek

Endian durumuna gore

ya 0x100 adresindeki 0x00, 0x00, 0x00, 0x01 degeri gosterecek
ya da 0x100 adresindeki 0x01, 0x00, 0x00, 0x00 degeri gosterecek

Her iki sayi da 0x0001 anlamina gelmiyormu?
 
Eğer C/C++ da char işaretçi tanımlarsan ve sonra da o işaretçi ile bellekten okuma yaparsan, derleyici BYTE OKUMA yapan makina kodu üretir. Eğer işlemcinin mimarisi gereği byte okuma yok ve mesela 16 bit okuma varsa (DSP lerde yaygın bir durum), o zaman derleyici oradaki veriyi 16 bit olarak okur ve üst byte'ı maskeler. Yani neticede her iki durumda da sadece 0x100 adresindeki BYTE okunmuş olur.
 
Sen Keil kullanıyordun galiba. int8_t, int16_t, int32_t işaretçilerden okuma yapan bir program yazıp debugger ile çalıştırırsan, assemly'sine de bu sırada bakarsan olay hemen kafanda oturacak.
 
Yok anladim

printf("%d",*ptr) isletilirken kod ptr nin tipine gore davraniyorsa evet haklisin.
Ben printf("%d",*ptr) satirini char pointerin gosterdigi degeri int olarak goster seklinde yorumladigim icin hatali dusundum.
 
Cevap ne peki bunu bulamadık mı şimdi ? Peki böyle spesifik sorularda arkadaş elenirse yazık değil mi ?
 
Neyin sonucuna varamadık anlamadım ...
 
Benimde tartışma kafamı karıştırdı :D. Printif işlemci mimarisine göre farklı sonuçlar veriyor diye yazılmıştı şimdi bakıyorum yok .

Evet yazık olur. Yurtdışına kapağı atması zorlaşır.
Aslında kolaylaştırır , sabat eder çalışır , gitmesin de ne yapsın bir proje yapayım diye 7segmed iki tane led almak istedim kargo hariç 120tl led yav, tüp lehim 150tl diğer parçaları da almaya kalsam en az 1000tl tutacak, kaçmasın da ne yapsın, bu işlerin geleceği var mı ? afganistan gibi olacağız.
 
Son düzenleme:

Çevrimiçi personel

Forum istatistikleri

Konular
5,894
Mesajlar
100,597
Üyeler
2,494
Son üye
yasin533

Son kaynaklar

Son profil mesajları

gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
m.white wrote on Altair's profile.
İyi akşamlar.Arabanız ne marka ve sorunu nedir.Ben araba tamircisi değilim ama tamirden anlarım.
* En mühim ve feyizli vazifelerimiz millî eğitim işleridir. Millî eğitim işlerinde mutlaka muzaffer olmak lâzımdır. Bir milletin hakikî kurtuluşu ancak bu suretle olur. (1922)
Kesici/Spindle hızı hesaplamak için SpreadSheet UDF'leri kullanın, hesap makinesi çok eski kalan bir yöntem :)
Back
Top