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

Çevrimiçi üyeler

Forum istatistikleri

Konular
6,952
Mesajlar
118,759
Üyeler
2,824
Son üye
selocan32

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top