Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.
0

sizeof() ile char boyutunu öğrenirken sonuç yanlış çıkıyor.

iki sorum var
1) sizeof ile char boyutunu öğrenmek istediğimde neden yanlış sonuç çıkıyor nerde hata yaptığımı bulamadım.
2) outputta üstteki warningleri neden aldığımı açıklar mısınız? teşekkürler.


2 Cevap

0
C'nin bir sürü revizyon ve sürümü var. Ayrıca Linux ve Windows ortamlarında ve 32 ve 64 bit işletim sistemlerinde farklı derleyiciler kullanılabilir, aynı işlevler farklı sonuçlar verebilir. Ayrıca C ve C++'ın davranışlarının farklılık gösterdiği yerler var. Bu liste çok uzun.

Verdiğiniz örnekte hangi dil, ortam, derleyici, mimari, standart kullanılmış belli değil. Dolayısıyla pek çok farklı durumla karşılaşabilirsiniz.

İnternette bakarsanız çoğu bilgi ve örnekler Linux'a göredir. Bunlar az bilgi etmiyor.

Dolayısıyla kullandığınız ortama göre, kullandığınız özelliğin dokümanını okumanızı tavsiye ederim.

Hepsini de bilmek zorunda değiliz. Başlangıçta sadece neden olduğunu bilsek yeter, dili öğrendikten sonra gerekli olan şeyleri gerektiği zaman (örneğin Windows için yadığımız programı Linux'da çalıştıracağımız zaman) öğreniriz.

sizeof(char) neden böyle bir sonuç vermiş karşılaşmadığım bilmediğim bir şey. Ancak biraz arayınca bulunabilir veya kodda bizim görmediğimiz bir yer olabilir zira her şey renklendirilmiş, tanımlamalar renkli gösterilmiyor.

Kodların resmini koymak yerine kendisini yazarsanız sitenin sistemi açısından da çok daha iyi olur.

Sedece uyarı mesajlarının sebebini söyleyim (orda yazıyor zaten).

Mesajda diyor ki; %d format belirteci bir tamsayı parametre beklenir ama ikinci parametrenin türü (yani sizeof ile dönen değerin türü) bir long unsigned int değeridir.

Yani yanlış belirteç kullanıyorsunuz. Linuxta deneme imkanım yok. Altta Windows üzerinde 64 bit tamsayı yerine geçen stdint.h içinde tanımlanmış int64_t (benim örneğimdeki sizeof'un döndürdüğü) nasıl formatlayacağınız ile ilgili bir örnek var.

    #include <stdio.h>
    #include <stdint.h>
      
    int main() {

        unsigned long long int a;
        float b;
        short c;
        char d;
        int64_t u;
        printf("%I64d \n", sizeof(a)); // Linux %lld
        printf("%I64d \n", sizeof(b));
        printf("%I64d \n", sizeof(c));
        printf("%I64d \n", sizeof(d));
        printf("char boyutu = %d\n", (sizeof(d)));
        printf("%I64d \n", sizeof(u));
        return 0;
        
    }
    
Çıktısı:

8
4
2
1
char boyutu = 1
8


Cevaplayan: 07.12.20 17:40
cevapsitesi
101,974p 15ü
Çok şey yazmışsınız elinize sağlık teşekkürler ama çoğunu anlamadım, soruma cevap olan kısımdan da hiçbir şey anlamadım. online c compilerda yazmıştım kodu. Uyarı kısmında ne yazdığını anladım fakat ben long unsigned int tipinde bir değişken girmedim neden öyle bir uyarı aldığımı anlamadım. Float değişkenine floating-point bir sayı giriyorum bu şekilde yazıyor. 

 sizeof sorum için de örnekteki kodu ve açıklamasını anlamadım. nereyi yanlış yaptığımı benim yazdığım koddan giderek şurayı değiştirmelisin, şu şu kısımda hata var şeklinde direkt söylerseniz daha iyi anlarım.
→  anlamiyorum 09.12.20 12:45
0
Direk söylersek hiç bir şey anlatmayız. Yerine yazarsın ve geçersin. Amaç öğrenmek ise biraz ayrıntıya girilecek.

Long unsigned int, sizeof'un döndürdüğü değerdir. sizeof operatörünü kullandığınız yerde sizeof'un size verdiği değer olacaktır. Bu değer de sizin kullandığınız GCC derleyicisinde long unsigned int türündedir.  sizeof hafızadaki kapladığı alanı ölçmek istediğiniz değerin ne kadar yer kapladığını işaretsiz uzun tamsayı şeklinde verir.

Uyarı mesajlarının açıklaması ise şu: Sizin kullandığınız online derleyicide format belirteci olarak %d değil %ld kullanacaksınız. Cevapta benim anlattığım ise derleyici (GNU GCC Builder, MS Visual C, Embarcadero C++ Builder, Intel ICC ...), sürüm, platform (Windows, Unix...) ve mimari (32bit, 64bit) farklı olduğunda (bunlara kullandığın ortam diyelim) kullanman gereken belirteçler farklı olabilir.

Yani kullandığın online derleyicide %ld yazarsın ve uyarı almazsın ama başka bir ortamda uyarı alabilirsin ve görüntülemek istediğin şey formatlanmadan veya senin istemediğin bir şekildre formatlanabilir. Bunları ezberlemeyiz. Kullandığın zaman hangi ortamda hangisi kullanılır öğrenirsin.

Cevapta söylediğim bir şey de şuydu: Her ortamda her tür için ne kullanacağını şimdi öğrenmen gerekmez. Ortamda gerekli olanı kullanırsın ve geçersin. Diğerleri ihtiyacın olunca kullanılır ve öğrenilir.

Bir de tavsiye: C ve C++ dillerini şu kitaptan adım adım öğrenin. Internetten birşeyler öğrenmeye çalışmayın.



Cevaplayan: 09.12.20 21:41
cevapsitesi
101,974p 15ü