Şimdi Ara

C proramlamada Bir Tuhaf Olay

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
1 Misafir - 1 Masaüstü
5 sn
11
Cevap
1
Favori
261
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • merhaba arkadaşlar sorum şu örneğin bir dizi oluşturduk "char dizi[54];" diye bu dizinin boyutu değişirmi değişmezmi ? normalde tanımladıktan sonra tekrar tanımlayamayız ama aşağıdaki kodlara her defasında başka bir sayı girince dizinin boyutuda o oluyor bu rda merak ettiğim şu dizi boyutu değişiyor ise neden biz mesela "char dizi[54]" şeklinde tanımladığımız diziyi daha sonra "char dizi[100" veya "char dizi[20]" vs... şekillerde tanımlayamıyoruz oysaki aşağıdaki döngü içinde dizi defalarca tanımlanmış ve boyutuda defalarca değişmiş olmuyormu ? tam olarak ne oluyor onu bilmek istiyorum açıkcası şimdiden teşekkürler.

     
    unsigned int a;

    while(1)
    {
    scanf("%u", &a);
    char dizi[a];
    printf("\n%llu\n", sizeof(dizi));
    __fpurge(stdin); // bu kod "fflush(stdin)" yerine kullanılmıştır
    }


    yukarıdaki kodları pc'mde çalıştırdığım zaman "a" değişkenine ne girersem dizi boyutuda o oluyor yani "sizeof" fonksiyonu "a" değişkenine girdiğim değeri ekrana basıyor







  • Harun2525 H kullanıcısına yanıt
    Valla çok enteresan. Demek ki kullandığın derleyici bu konudaki kuralları biraz esnetmiş gibi gözüküyor.

    Derleyici nedir ? gcc mi ? Mesela Windows'da C++ Builder derleyicisi char dizi[DEGER] ifadesi için illa iyi tanımlanmış sabit bir değer istediği için Yazım hatası veriyor, o kodu kabul etmiyor.

    Normalde "char dizi [DEGER]" şeklinde yaratılan hafıza blokları "Stack" denilen yerde, yani programın otomatik olarak yönettiği hafıza bloğunda yaratılır ve yokedilir. Bu stack'deki alanı ya program dinamik olarak ayarlıyor ya da önceden büyük bir alan ayırmış, birçok ufak değer girildiğinde sabit değere gerek kalmadan sana yer tahsis edebiliyor.
    Ancak büyük değerler girildiğinde de bu sefer çok büyük ihtimalle program "Stack Overflow" hatası verecektir diye tahmin ediyorum. Dolayısıyla potansiyel hata içerebilecek tehlikeli bir kod yaklaşımı. Tabıyatıyle sen de biliyorsun ki bu tarz durumlarda en iyi çözüm malloc ve free kullanmak.




  • C99 ile değişken boyutlu dizi tanımlanabiliyor. sizeof'un bu şekilde kullanımını bilmiyordum ama düşününce zaten sizeof'un da VLA ile birlikte güncellenmesi gerekecekti. Sonuç olarak c99 ile birlikte sizeof runtime esnasında çalışabilir hale gelmiş. Tabi işaretçilerde işe yaramıyor, sadece dizilerde.
  • Buzz Lightyear B kullanıcısına yanıt
    haklısınız hocam tehlikeli bir durum peki böyle bir duruma ihtiyaç duylurmu ihtiyaç duyulursa mecbur bunun mnatığını bilmek gerekiyor çok zor olmaa gerek bu arada siz bunu biliyormuydunuz daha önceden onuda merak ettim :D

    bu arada kodu windowstada denedim aynı şekilde sorunsuz çalıştı

    Not: kullandığım derleyici gcc



    < Bu mesaj bu kişi tarafından değiştirildi Harun2525 -- 9 Ağustos 2015; 3:40:15 >
  • quote:

    Orijinalden alıntı: Harun2525

    haklısınız hocam tehlikeli bir durum peki böyle bir duruma ihtiyaç duylurmu ihtiyaç duyulursa mecbur bunun mnatığını bilmek gerekiyor çok zor olmaa gerek bu arada siz bunu biliyormuydunuz daha önceden onuda merak ettim :D

    bu arada kodu windowstada denedim aynı şekilde sorunsuz çalıştı

    Not: kullandığım derleyici gcc

    Yok bilmiyordum ben de yeni öğrenmiş oldum. Yapılabiliniyor olması imkansız değil elbette.. Derleyiciye bağlı.

    Fakat ben herhalde şu ana kadar neredeyse hiç "char dizi[BOYUT]" şeklinde sabit değerle de bile olsa Stack'den birşey kullanmamışımdır. Gerekince ister obje olsun ister hafıza bloğu hep dinamik hafızadan yer ayırtıyorum. Birde ben hobi olarak programlamayla uğraştığım için beni şu ana kadar illa o şekilde kodlama yapmaya zorlayacak bir proje de çıkmamış demek ki karşıma.


    Ekstra laf açılmışken aklıma geldiği için şundan da bahsedeyim madem o zaman bu arada, belki duymamışsındır diye:

    Stack işleri ve dolayısıyla "Stack Overflow" hatası sakat. Mesela bu "Stack Overflow" yani taşma hatasını veren en meşhur örnek "kendi içinde yine kendisini çağıran fonsiyonlar", ingilizcesi "recursive functions" olan fonksiyonlar.

    Bu tip fonksiyonlara da en meşhur örnek faktöriyel hesaplama fonksiyonu. Şöyle ki:

     
    int FaktoriyelHesapla (int val)
    {
    if (val <= 1) return 1;

    return val * FaktoriyelHesapla (val - 1);
    }


    Mesela işte bu fonksiyonu hangi değerle çağırırsan o kadar kere Stack'de bu fonksiyonun kendi içinde çağrılması gerekir o yüzden büyük değerlerde "Stack Overflow" hatası oluşur. Ona göre de önlem almak gerekir.
    Ha gerçi faktoriyel hesaplama işini bu şekilde değil de basitçe döngü içersinde de hesaplayabilirsin o daha güvenli olur tabii...




  • Değişken boyutlu diziler stack değil heap bölgesinden alır belleği, tıpkı malloc gibi. Tehlikeli falan da değil, c standardının bir parçasıdır.

    https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
  • quote:

    Orijinalden alıntı: elektro_gadget

    Değişken boyutlu diziler stack değil heap bölgesinden alır belleği, tıpkı malloc gibi. Tehlikeli falan da değil, c standardının bir parçasıdır.

    https://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

    Hakkaten çok enteresan. İlk defa C'nin destekleyip C++'ın desteklemediği bir özellik görmüş oldum böylece. Bende bu konu hakkında birkaç internet sitesine baktım şimdi. C++'da olmamasının sebebi olarak da kısaca "Nasıl olsa vector var daha da fazla karıştırmayalım kuralları" demişler. Makul bence, çünkü mesela en azından kendi deneyimlerime göre bende çoğu kez vector kullanırım.

    Fakat C açısından bu yaklaşımı biraz tuhaf buldum açıkcası çünkü performans açısından C felsefesine pek uyan bir yaklaşım değil.
    Çünkü C felsefesine göre; kod olarak arka planda ne olup bittiğinin bilinmediği durumlar dil olarak genelde işletim sistemiyle veya kütüphanelerle ilgili fonksiyon çağrılarının yapıldığı yerlerde oluyor. malloc ve free gibi.

    Ne var ki dil olarak "char dizi[SZ];" gibi bir kod görsel olarak bize bu ipucunu vermiyor. Arka planda halbuki malloc ve free çağrılmak zorunda olduğu gibi dizi boyutu da görünmeyen bir değişkende tabiyatıyle tutulmak zorunda bu kodu yazdığımızda. Bununla beraber heap'de yaratıldığı için diziye erişim performans açısından stack erişimi kadar hızlı olmayacaktır, ne var ki kod olarak yazdığımızda sanki dizi stack'de otomatik obje olarak yaratılmış gibi gözüküyor. Gerçi performans açısından çok çok büyük farklar da yoktur diye tahmin ediyorum. Fakat bu açıkladığım gerekçelerden ötürü gerçekten tuhaf bulduğumu söylemeliyim.

    Demek ki saf C programcıları artık "illallah" demişler sırf C'de kodlama yazarken dizi boyutlarının sabit olması yüzünden yazmak zorunda oldukları ekstra kod ve ekstra program dizaynı gerekleri adamlara en sonunda "Bizim de bu şekilde bir özelliğimiz olsun artık yeter" dedirtmiş herhalde :)




  • Yapay Zeka’dan İlgili Konular
    C++ Basit Bir Soru
    12 yıl önce açıldı
    Daha Fazla Göster
  • Yanlış olmasa da bence son derece gereksiz. Oraya gelene kadar insan c++ taki gibi referans (&) koyar. Mesela basitçe aynı isimli fonksiyonlara izin vermek yerine "generic selection" diye ucube bir özellik koymuşlar. Vardır heralde bir bildikleri.
  • hocam siz kaçtane programlama dili biliyorsunuz ben böyle arkaplanda olup biten işleri merak ederim bu yüzden C'yle başladım ama görüyorumki C ve C++ dilini iyi öğrensem bile artık makine hızları çok fazla olduğu için herkez yüksek seviyeli dil öğreniyorlar yalnış hatırlamıyorsam MIT bile python öğretiyor durum böyleyken bu dilleri iyi öğrensem bile birşey yapamayacakmışım gibi geliyor bu yüzden benim amacım C++ dilinide öğrendikten sonra C# diline yönelmek istiyorum ve onunla devam etmek istiyorum sizce nasıl ?
  • quote:

    Orijinalden alıntı: Harun2525

    hocam siz kaçtane programlama dili biliyorsunuz ben böyle arkaplanda olup biten işleri merak ederim bu yüzden C'yle başladım ama görüyorumki C ve C++ dilini iyi öğrensem bile artık makine hızları çok fazla olduğu için herkez yüksek seviyeli dil öğreniyorlar yalnış hatırlamıyorsam MIT bile python öğretiyor durum böyleyken bu dilleri iyi öğrensem bile birşey yapamayacakmışım gibi geliyor bu yüzden benim amacım C++ dilinide öğrendikten sonra C# diline yönelmek istiyorum ve onunla devam etmek istiyorum sizce nasıl ?

    Dünyadaki bütün dilleri de bilsen program yazmak için gereken çok az şeye sahip olursun. İlerledikçe göreceksin ki dil sadece eline aldığın çekiç gibi bir alettir. Farklı renklerde düzinelerce çekiç hiçbir işine yaramaz, aletleri çeşitlendirmelisin.

    Bu işte muhakkak bilinmesi gereken iki dil vardır. Biri C, diğeri ingilizce. Ciddi isen ve yol haritası istiyorsan daha sonra veri yapılarına dalmanı öneririm. Veri yapıları ve algoritmalar en iyi şekilde C ile öğrenilir. Python gibi diller donanımı çok yüksek seviyede soyutladığı için verileri bellekte istediğin gibi yapılandırman mümkün olamıyor. Sen bağlı liste oluşturduğunu zannediyorsun ama o yüksek seviyeli "kolay" dil herşeyi tablolar halinde tutuyor. Yapılmış gibi görünüyor ama bellekte karşılığını göremiyorsun. Algoritmanın avantajını görmek için test yapıyorsun hepsinde benzer sonuç çıkıyor. Çünkü sen objeleri ister dizi üzerinde, ister bağlı liste üzerinde, ister yığın, ister kuyruk üzerinde sakla (öyle zannet) o dil hepsini kendi bildiği "kolaylaştırılmış" yöntemle saklıyor ve hiçbir farkını göremiyorsun. Bu yüzden bu gibi yüksek seviyeli zımbırtılar bilgisayar mimarisi hakkında hiçbirşey bilmeyen fakat yine de bişeyler yapmak isteyenler için icat edilmiştir. Eğer sen de kendini o sınıfta görüyorsan c' yi hemen bırak. Çünkü c/c++ donanım hakkında bilgi gerektiren araçlardır. Aksi halde verimli kullanılması mümkün değildir.




  • haklısınız donanım hakkında bilgilerim çok fazla olmasada istenilerek öğrenilebilinmiyormu ama sizde demiştiniz eski konuşmamızda yalnış hatırlamyorsam kullanıcı odaklı bir programı C dili ile yapmak hamallıktır buna bakılarak donanımı çok iyi bilen birisi bile kullanıcı odaklı programı C ile yapmak istemez kullanıcı odaklı dediğim hanı şu şatafatlı görünen programlar var ya onlar dediğiniz de çok haklısınız fakat bize bir getirisi olması için en az bir yüksek seviyeli veya orta seviyeli (C#) öğrenmek gerekmezmi çünki getiri getiren uygulamalar bunlar ile yapılıyor

    bu arada veri yapılarıda gerçekten hoşuma gidiyor python la şu listeler demetler var ya işte onların mantığını C de nasıl yapılabilir diye hep merak etmiştim sanırsam ver yapılarıyla bayağı ilgileneceğim :D
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.