<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-16T06:05:37+00:00</updated><id>https://program.sonsuz.us/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">C Konsol Giriş/Çıkış İşlemleri: printf ve scanf ile Terminali Konuşturmak</title><link href="https://program.sonsuz.us/posts/c-konsol-giriscikis-islemleri-printf-ve-scanf-ile-terminali-konusturmak/" rel="alternate" type="text/html" title="C Konsol Giriş/Çıkış İşlemleri: printf ve scanf ile Terminali Konuşturmak" /><published>2026-10-16T00:00:00+00:00</published><updated>2026-10-16T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-konsol-giriscikis-islemleri-printf-ve-scanf-ile-terminali-konusturmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-konsol-giriscikis-islemleri-printf-ve-scanf-ile-terminali-konusturmak/"><![CDATA[<p>C programında değişkenler bellekte sessizce bekler; onları kullanıcıyla buluşturan ise konsol giriş/çıkış fonksiyonlarıdır. Ekrana biçimli veri yazdırmak için çoğunlukla <code class="language-plaintext highlighter-rouge">printf</code>, klavyeden veri almak için <code class="language-plaintext highlighter-rouge">scanf</code> kullanılır. Ancak doğru format belirteçlerini seçmek, giriş hatalarını yakalamak ve metinleri güvenli biçimde okumak en az fonksiyonların kendisi kadar önemlidir.</p>

<p>``</p>

<h2 id="standart-giriş-ve-çıkış-nedir">Standart giriş ve çıkış nedir?</h2>

<p>C, konsol işlemlerini birer <strong>akış</strong> olarak ele alır. Program başladığında standart giriş <code class="language-plaintext highlighter-rouge">stdin</code>, standart çıkış <code class="language-plaintext highlighter-rouge">stdout</code> ve hata çıkışı <code class="language-plaintext highlighter-rouge">stderr</code> otomatik olarak açılır. Klavye çoğunlukla <code class="language-plaintext highlighter-rouge">stdin</code> akışına, terminal ekranı ise <code class="language-plaintext highlighter-rouge">stdout</code> akışına bağlıdır.</p>

<p>Bu fonksiyonları kullanmak için başlık dosyası eklenir:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span></code></pre></div></div>

<p>Bir giriş/çıkış işleminin basit modeli şöyle düşünülebilir:</p>

\[\text{Kullanıcı} \rightarrow \text{stdin} \rightarrow \text{Program} \rightarrow \text{stdout} \rightarrow \text{Ekran}\]

<h2 id="printf-ile-formatlı-çıktı">printf ile formatlı çıktı</h2>

<p><code class="language-plaintext highlighter-rouge">printf</code>, metin içindeki format belirteçlerini ilgili değişkenlerin değerleriyle değiştirir.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">ad</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"Ada"</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">yas</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">ortalama</span> <span class="o">=</span> <span class="mi">87</span><span class="p">.</span><span class="mi">456</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Ad: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ad</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Yas: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">yas</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Ortalama: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ortalama</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">%s</code> karakter dizisini, <code class="language-plaintext highlighter-rouge">%d</code> tam sayıyı ve <code class="language-plaintext highlighter-rouge">%.2f</code> ondalıklı değeri virgülden sonra iki basamakla yazdırır. <code class="language-plaintext highlighter-rouge">\n</code> ise imleci yeni satıra taşır.</p>

<table>
  <thead>
    <tr>
      <th>Belirteç</th>
      <th>Veri türü</th>
      <th>Örnek çıktı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%d</code></td>
      <td><code class="language-plaintext highlighter-rouge">int</code></td>
      <td><code class="language-plaintext highlighter-rouge">42</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%u</code></td>
      <td><code class="language-plaintext highlighter-rouge">unsigned int</code></td>
      <td><code class="language-plaintext highlighter-rouge">42</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%f</code></td>
      <td><code class="language-plaintext highlighter-rouge">double</code></td>
      <td><code class="language-plaintext highlighter-rouge">3.140000</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%.2f</code></td>
      <td><code class="language-plaintext highlighter-rouge">double</code></td>
      <td><code class="language-plaintext highlighter-rouge">3.14</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%c</code></td>
      <td><code class="language-plaintext highlighter-rouge">char</code></td>
      <td><code class="language-plaintext highlighter-rouge">A</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%s</code></td>
      <td>Karakter dizisi</td>
      <td><code class="language-plaintext highlighter-rouge">Merhaba</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">%x</code></td>
      <td>Onaltılık tam sayı</td>
      <td><code class="language-plaintext highlighter-rouge">ff</code></td>
    </tr>
  </tbody>
</table>

<p>Alan genişliği de çıktıyı hizalamayı sağlar. Örneğin <code class="language-plaintext highlighter-rouge">%8d</code>, sayıyı sekiz karakterlik alanda sağa yaslar; <code class="language-plaintext highlighter-rouge">%-8d</code> sola yaslar. Sayısal bir değeri $w$ genişliğinde göstermek, tablo biçimindeki çıktılarda sütunların düzenli kalmasını sağlar.</p>

<h2 id="scanf-ile-klavyeden-veri-okuma">scanf ile klavyeden veri okuma</h2>

<p><code class="language-plaintext highlighter-rouge">scanf</code>, girilen karakterleri belirtilen türe dönüştürerek değişkenlere yazar. Değişkenin bellekteki adresi gerektiğinden çoğu kullanımda <code class="language-plaintext highlighter-rouge">&amp;</code> operatörü zorunludur.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">adet</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">fiyat</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Adet ve birim fiyat girin: "</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">"%d %lf"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">adet</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">fiyat</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">double</span> <span class="n">toplam</span> <span class="o">=</span> <span class="n">adet</span> <span class="o">*</span> <span class="n">fiyat</span><span class="p">;</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"Toplam: %.2f TL</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">toplam</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"Gecersiz veri girdiniz.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">scanf</code> başarıyla doldurduğu alanların sayısını döndürür. İki değer bekleniyorsa dönüş değerinin <code class="language-plaintext highlighter-rouge">2</code> olması gerekir. Matematiksel olarak hesaplanan sonuç:</p>

\[\text{toplam} = \text{adet} \times \text{birim fiyat}\]

<p>Önemli bir ayrıntı: <code class="language-plaintext highlighter-rouge">printf</code> içinde <code class="language-plaintext highlighter-rouge">double</code> için <code class="language-plaintext highlighter-rouge">%f</code>, <code class="language-plaintext highlighter-rouge">scanf</code> içinde ise <code class="language-plaintext highlighter-rouge">%lf</code> kullanılır. Yanlış belirteç seçmek tanımsız davranışa yol açabilir.</p>

<table>
  <thead>
    <tr>
      <th>İşlem</th>
      <th>Fonksiyon</th>
      <th>Güçlü yönü</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Formatlı çıktı</td>
      <td><code class="language-plaintext highlighter-rouge">printf</code></td>
      <td>Esnek biçimlendirme</td>
      <td>Tür ve belirteç uyumu</td>
    </tr>
    <tr>
      <td>Formatlı giriş</td>
      <td><code class="language-plaintext highlighter-rouge">scanf</code></td>
      <td>Sayıları kolay dönüştürür</td>
      <td>Hatalı giriş akışta kalabilir</td>
    </tr>
    <tr>
      <td>Satır okuma</td>
      <td><code class="language-plaintext highlighter-rouge">fgets</code></td>
      <td>Uzunluğu sınırlar</td>
      <td>Satır sonunu saklayabilir</td>
    </tr>
    <tr>
      <td>Tek karakter</td>
      <td><code class="language-plaintext highlighter-rouge">getchar</code></td>
      <td>Basit karakter okuma</td>
      <td><code class="language-plaintext highlighter-rouge">int</code> dönüş türü kullanılır</td>
    </tr>
    <tr>
      <td>Tek karakter yazma</td>
      <td><code class="language-plaintext highlighter-rouge">putchar</code></td>
      <td>Hafif ve anlaşılır</td>
      <td>Yalnızca bir karakter yazar</td>
    </tr>
  </tbody>
</table>

<h2 id="metin-okurken-daha-güvenli-yaklaşım">Metin okurken daha güvenli yaklaşım</h2>

<p><code class="language-plaintext highlighter-rouge">scanf("%s", metin)</code> boşlukta durur ve genişlik belirtilmezse taşma riski doğurur. Tam bir satır okumak için <code class="language-plaintext highlighter-rouge">fgets</code> daha güvenlidir:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">ad</span><span class="p">[</span><span class="mi">40</span><span class="p">];</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Ad ve soyad: "</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">fgets</span><span class="p">(</span><span class="n">ad</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">ad</span><span class="p">,</span> <span class="n">stdin</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ad</span><span class="p">[</span><span class="n">strcspn</span><span class="p">(</span><span class="n">ad</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)]</span> <span class="o">=</span> <span class="sc">'\0'</span><span class="p">;</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"Hos geldin, %s!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ad</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sizeof ad</code>, okunabilecek karakter miktarını sınırlar. <code class="language-plaintext highlighter-rouge">strcspn</code> ise <code class="language-plaintext highlighter-rouge">fgets</code> tarafından saklanabilen satır sonunu bulup <code class="language-plaintext highlighter-rouge">\0</code> ile değiştirir. Kısacası <code class="language-plaintext highlighter-rouge">printf</code> sunum ustası, <code class="language-plaintext highlighter-rouge">scanf</code> hızlı veri dönüştürücüsü, <code class="language-plaintext highlighter-rouge">fgets</code> ise metin girişlerinin emniyet kemeridir.</p>

<p><img src="/img/c-konsol-giriscikis-31.svg" alt="c-konsol-giriscikis-31" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="programlama" /><category term="printf" /><category term="scanf" /><category term="konsol" /><category term="giriş-çıkış" /><summary type="html"><![CDATA[C programında değişkenler bellekte sessizce bekler; onları kullanıcıyla buluşturan ise konsol giriş/çıkış fonksiyonlarıdır. Ekrana biçimli veri yazdırmak için çoğunlukla printf, klavyeden veri almak için scanf kullanılır. Ancak doğru format belirteçlerini seçmek, giriş hatalarını yakalamak ve metinleri güvenli biçimde okumak en az fonksiyonların kendisi kadar önemlidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-konsol-giriscikis-31.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-konsol-giriscikis-31.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Pimpl Deyimi: Derleme Bağımlılıklarını Perde Arkasına Taşımak</title><link href="https://program.sonsuz.us/posts/c-pimpl-deyimi-derleme-bagimliliklarini-perde-arkasina-tasimak/" rel="alternate" type="text/html" title="C++ Pimpl Deyimi: Derleme Bağımlılıklarını Perde Arkasına Taşımak" /><published>2026-10-16T00:00:00+00:00</published><updated>2026-10-16T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-pimpl-deyimi-derleme-bagimliliklarini-perde-arkasina-tasimak</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-pimpl-deyimi-derleme-bagimliliklarini-perde-arkasina-tasimak/"><![CDATA[<p>C++ projeleri büyüdükçe küçük bir başlık dosyası değişikliği, ilgisiz görünen onlarca kaynak dosyanın yeniden derlenmesine yol açabilir. Pimpl, yani <em>Pointer to Implementation</em>, sınıfın kullanıcıya açık arayüzünü gerçek uygulama ayrıntılarından ayırarak bu zincirleme etkiyi azaltan köklü bir C++ deyimidir. Kısacası sınıfımız sahne önünde sade görünürken bütün dekor, kablolar ve karmaşa perdenin arkasında kalır.</p>

<p>``</p>

<h2 id="derleme-bağımlılığı-neden-oluşur">Derleme bağımlılığı neden oluşur?</h2>

<p>Bir başlık dosyasında başka sınıfları doğrudan üye olarak kullandığımızı düşünelim:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">"DatabaseConnection.hpp"</span><span class="cp">
#include</span> <span class="cpf">"Logger.hpp"</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">UserService</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">void</span> <span class="n">createUser</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">name</span><span class="p">);</span>

<span class="nl">private:</span>
    <span class="n">DatabaseConnection</span> <span class="n">database</span><span class="p">;</span>
    <span class="n">Logger</span> <span class="n">logger</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">cache</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Derleyici, <code class="language-plaintext highlighter-rouge">UserService</code> nesnesinin boyutunu hesaplayabilmek için bütün veri üyelerinin tanımlarını bilmelidir. Bu nedenle başlıklar içeri alınır. <code class="language-plaintext highlighter-rouge">Logger.hpp</code> değiştiğinde <code class="language-plaintext highlighter-rouge">UserService.hpp</code> dosyasını kullanan kaynaklar da yeniden derlenebilir.</p>

<p>Basitleştirilmiş biçimde toplam derleme maliyetini şöyle düşünebiliriz:</p>

\[T \approx \sum_{i=1}^{n} D_i \times C_i\]

<p>Burada $D_i$, bir başlığa bağımlı çeviri birimi sayısını; $C_i$ ise ilgili birimin derleme maliyetini temsil eder. Pimpl özellikle $D_i$ değerinin oluşturduğu zincirleme etkiyi küçültür.</p>

<h2 id="pimpl-yapısı">Pimpl yapısı</h2>

<p>Başlık dosyasında uygulama sınıfı yalnızca ileri bildirilir ve ona bir akıllı işaretçi tutulur:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// UserService.hpp</span>
<span class="cp">#pragma once
</span>
<span class="cp">#include</span> <span class="cpf">&lt;memory&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">UserService</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="n">UserService</span><span class="p">();</span>
    <span class="o">~</span><span class="n">UserService</span><span class="p">();</span>

    <span class="n">UserService</span><span class="p">(</span><span class="n">UserService</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="k">noexcept</span><span class="p">;</span>
    <span class="n">UserService</span><span class="o">&amp;</span> <span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">UserService</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="k">noexcept</span><span class="p">;</span>

    <span class="kt">void</span> <span class="n">createUser</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">name</span><span class="p">);</span>

<span class="nl">private:</span>
    <span class="k">class</span> <span class="nc">Impl</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o">&lt;</span><span class="n">Impl</span><span class="o">&gt;</span> <span class="n">impl</span><span class="p">;</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Gerçek üyeler <code class="language-plaintext highlighter-rouge">.cpp</code> dosyasına taşınır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// UserService.cpp</span>
<span class="cp">#include</span> <span class="cpf">"UserService.hpp"</span><span class="cp">
#include</span> <span class="cpf">"DatabaseConnection.hpp"</span><span class="cp">
#include</span> <span class="cpf">"Logger.hpp"</span><span class="cp">
</span>
<span class="cp">#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
</span>
<span class="k">class</span> <span class="nc">UserService</span><span class="o">::</span><span class="n">Impl</span> <span class="p">{</span>
<span class="nl">public:</span>
    <span class="kt">void</span> <span class="n">createUser</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">name</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">logger</span><span class="p">.</span><span class="n">info</span><span class="p">(</span><span class="s">"Kullanıcı oluşturuluyor: "</span> <span class="o">+</span> <span class="n">name</span><span class="p">);</span>
        <span class="n">database</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
        <span class="n">cache</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
    <span class="p">}</span>

<span class="k">private</span><span class="o">:</span>
    <span class="n">DatabaseConnection</span> <span class="n">database</span><span class="p">;</span>
    <span class="n">Logger</span> <span class="n">logger</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">cache</span><span class="p">;</span>
<span class="p">};</span>

<span class="n">UserService</span><span class="o">::</span><span class="n">UserService</span><span class="p">()</span>
    <span class="o">:</span> <span class="n">impl</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="n">Impl</span><span class="o">&gt;</span><span class="p">())</span> <span class="p">{}</span>

<span class="n">UserService</span><span class="o">::~</span><span class="n">UserService</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
<span class="n">UserService</span><span class="o">::</span><span class="n">UserService</span><span class="p">(</span><span class="n">UserService</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="k">noexcept</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>
<span class="n">UserService</span><span class="o">&amp;</span> <span class="n">UserService</span><span class="o">::</span><span class="k">operator</span><span class="o">=</span><span class="p">(</span><span class="n">UserService</span><span class="o">&amp;&amp;</span><span class="p">)</span> <span class="k">noexcept</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span>

<span class="kt">void</span> <span class="n">UserService</span><span class="o">::</span><span class="n">createUser</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">name</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">impl</span><span class="o">-&gt;</span><span class="n">createUser</span><span class="p">(</span><span class="n">name</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Yıkıcının <code class="language-plaintext highlighter-rouge">.cpp</code> içinde tanımlanması önemlidir. <code class="language-plaintext highlighter-rouge">std::unique_ptr</code>, işaret ettiği nesneyi yok ederken <code class="language-plaintext highlighter-rouge">Impl</code> türünün tamamlanmış olmasına ihtiyaç duyar. Başlık içinde otomatik üretilen bir yıkıcı bazı derleyici bağlamlarında eksik tür hatasına neden olabilir.</p>

<h2 id="pimpl-öncesi-ve-sonrası">Pimpl öncesi ve sonrası</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Doğrudan üyeler</th>
      <th>Pimpl yaklaşımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Başlık bağımlılığı</td>
      <td>Yüksek</td>
      <td>Düşük</td>
    </tr>
    <tr>
      <td>Uygulama ayrıntılarının görünürlüğü</td>
      <td>Açık</td>
      <td>Gizli</td>
    </tr>
    <tr>
      <td>ABI kararlılığı</td>
      <td>Daha kırılgan</td>
      <td>Daha güçlü</td>
    </tr>
    <tr>
      <td>Nesne oluşturma maliyeti</td>
      <td>Genellikle daha düşük</td>
      <td>Ek bellek tahsisi olabilir</td>
    </tr>
    <tr>
      <td>Üyelere erişim</td>
      <td>Doğrudan</td>
      <td>İşaretçi üzerinden</td>
    </tr>
    <tr>
      <td>Kod karmaşıklığı</td>
      <td>Daha az</td>
      <td>Ek sınıf ve yönlendirme gerekir</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/c-pimpl-deyimi-28.svg" alt="c-pimpl-deyimi-28" /></p>

<h2 id="abi-avantajı">ABI avantajı</h2>

<p>Pimpl yalnızca derleme süresini değil, ikili uyumluluğu da destekler. Doğrudan üye eklemek sınıfın <code class="language-plaintext highlighter-rouge">sizeof</code> değerini değiştirir. Pimpl kullanılan sınıfta ise dışarıdan görünen veri çoğunlukla tek bir işaretçidir:</p>

\[\text{sizeof(UserService)} \approx \text{sizeof(void*)}\]

<p><code class="language-plaintext highlighter-rouge">Impl</code> içine yeni alanlar eklense bile açık sınıfın yerleşimi değişmez. Bu durum özellikle paylaşımlı kütüphanelerde değerlidir.</p>

<h2 id="bedelsiz-bir-sihir-değil">Bedelsiz bir sihir değil</h2>

<p>Pimpl; ek dinamik bellek tahsisi, işaretçi dolayımı ve daha fazla yardımcı kod getirir. Küçük, yalnızca dahili kullanılan veya şablon ağırlıklı sınıflarda kazancı maliyetinden düşük olabilir. Buna karşılık sık değişen özel üyeleri bulunan, geniş kitlelere sunulan ya da kararlı ABI gerektiren sınıflarda oldukça etkilidir.</p>

<p>Özetle Pimpl, her sınıfa serpilecek bir performans baharatı değil; derleme sınırlarını bilinçli biçimde yönetme aracıdır. Doğru yerde kullanıldığında başlık dosyalarını hafifletir, değişikliklerin yayılmasını sınırlar ve kütüphanenin perde arkasını özgürce yenilemenize imkân verir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="pimpl" /><category term="derleme" /><category term="bağımlılık" /><category term="tasarım desenleri" /><category term="cpp" /><summary type="html"><![CDATA[C++ projeleri büyüdükçe küçük bir başlık dosyası değişikliği, ilgisiz görünen onlarca kaynak dosyanın yeniden derlenmesine yol açabilir. Pimpl, yani Pointer to Implementation, sınıfın kullanıcıya açık arayüzünü gerçek uygulama ayrıntılarından ayırarak bu zincirleme etkiyi azaltan köklü bir C++ deyimidir. Kısacası sınıfımız sahne önünde sade görünürken bütün dekor, kablolar ve karmaşa perdenin arkasında kalır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-pimpl-deyimi-28.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-pimpl-deyimi-28.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Metal Eklemlerden Esnek Kaslara: Yumuşak Robotik Nasıl Çalışır?</title><link href="https://program.sonsuz.us/posts/metal-eklemlerden-esnek-kaslara-yumusak-robotik-nasil-calisir/" rel="alternate" type="text/html" title="Metal Eklemlerden Esnek Kaslara: Yumuşak Robotik Nasıl Çalışır?" /><published>2026-10-16T00:00:00+00:00</published><updated>2026-10-16T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/metal-eklemlerden-esnek-kaslara-yumusak-robotik-nasil-calisir</id><content type="html" xml:base="https://program.sonsuz.us/posts/metal-eklemlerden-esnek-kaslara-yumusak-robotik-nasil-calisir/"><![CDATA[<p>Robot denildiğinde zihnimizde genellikle metal kollar, dişliler ve belirgin eklemler canlanır. Yumuşak robotik ise bu görüntüyü tersine çevirerek silikon, elastomer ve kumaş gibi esneyebilen malzemelerden robotlar üretir. Böylece makineler yalnızca hareket etmekle kalmaz; kıvrılabilir, sıkışabilir ve hassas nesnelere zarar vermeden dokunabilir.
``</p>

<h2 id="rijit-eklemler-neden-terk-ediliyor">Rijit eklemler neden terk ediliyor?</h2>

<p>Geleneksel robotlarda hareket, motorların döndürdüğü rijit bağlantılar ve eklemler üzerinden gerçekleşir. Bu yapı otomobil fabrikası gibi kontrollü ortamlarda yüksek hız ve hassasiyet sağlar. Ancak robot bir insanla temas edecek, düzensiz bir zeminde ilerleyecek veya çilek tutacaksa sertlik dezavantaja dönüşebilir.</p>

<p>Yumuşak robotlar, doğadaki kasları ve dokuları taklit eder. Bir fil hortumu yüzlerce ayrı metal ekleme sahip değildir; malzemesinin sürekli biçimde değişmesi sayesinde bükülür. Bu yaklaşım <strong>sürekli deformasyon</strong> olarak adlandırılır. Robotun hareketi tek bir menteşede değil, gövdesinin tamamına dağılır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Rijit robot</th>
      <th>Yumuşak robot</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Malzeme</td>
      <td>Metal, sert plastik</td>
      <td>Silikon, elastomer, tekstil</td>
    </tr>
    <tr>
      <td>Hareket</td>
      <td>Belirli eklemler boyunca</td>
      <td>Gövdeye yayılmış deformasyon</td>
    </tr>
    <tr>
      <td>Hassasiyet</td>
      <td>Çok yüksek</td>
      <td>Modellemeye bağlı</td>
    </tr>
    <tr>
      <td>Temas güvenliği</td>
      <td>Ek önlem gerektirir</td>
      <td>Doğal olarak daha uyumludur</td>
    </tr>
    <tr>
      <td>Taşıma kapasitesi</td>
      <td>Genellikle yüksek</td>
      <td>Genellikle daha düşük</td>
    </tr>
  </tbody>
</table>

<h2 id="esnekliğin-arkasındaki-fizik">Esnekliğin arkasındaki fizik</h2>

<p>Bir elastik malzemenin temel davranışı basitleştirilmiş Hooke yasasıyla açıklanabilir:</p>

\[\sigma = E\varepsilon\]

<p>Burada $\sigma$ gerilmeyi, $\varepsilon$ şekil değiştirme oranını ve $E$ Young modülünü temsil eder. Young modülü küçüldükçe malzeme daha kolay esner. Çelik yaklaşık $200\,GPa$ mertebesindeyken bazı silikon elastomerler $MPa$ düzeyindedir. Aradaki dev fark, silikon bir robot kolun neden adeta makarna gibi bükülebildiğini açıklar.</p>

<p>Fakat büyük deformasyonlarda Hooke yasası tek başına yeterli değildir. Yumuşak robotların bilgisayar modellerinde hiperelastik malzeme denklemleri ve sonlu elemanlar analizi kullanılır. Başka bir deyişle, robotun nereye kıvrılacağını hesaplamak metal bir kolun açısını bulmaktan daha zahmetlidir.</p>

<h2 id="hareket-nasıl-üretiliyor">Hareket nasıl üretiliyor?</h2>

<p>En yaygın yöntemlerden biri <strong>pnömatik eyleyicilerdir</strong>. Silikon gövde içindeki odacıklara hava basıldığında bir taraf diğerinden fazla genişler ve parça bükülür. Hidrolik sıvılar, şekil hafızalı alaşımlar, elektroaktif polimerler ve çekme kabloları da kullanılabilir.</p>

<p>Basıncın oluşturduğu yaklaşık kuvvet şu ilişkiyle düşünülebilir:</p>

\[F = P \cdot A\]

<p>$P$ iç basınç, $A$ ise basıncın etkilediği alandır. Alan veya basınç arttıkça kuvvet büyür; ancak fazla basınç robotu güçlü bir balon gibi patlatabilir. Mühendisliğin eğlenceli kısmı tam da güç ile esneklik arasındaki bu dengedir.</p>

<p>Aşağıdaki Python kodu, basınç arttıkça ideal bir eyleyicinin kuvvetini hesaplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">areas</span> <span class="o">=</span> <span class="mf">0.0008</span>  <span class="c1"># Etkin yüzey alanı: metrekare
</span><span class="n">pressures</span> <span class="o">=</span> <span class="p">[</span><span class="mi">20_000</span><span class="p">,</span> <span class="mi">40_000</span><span class="p">,</span> <span class="mi">60_000</span><span class="p">,</span> <span class="mi">80_000</span><span class="p">]</span>  <span class="c1"># Pascal
</span>
<span class="k">for</span> <span class="n">pressure</span> <span class="ow">in</span> <span class="n">pressures</span><span class="p">:</span>
    <span class="n">force</span> <span class="o">=</span> <span class="n">pressure</span> <span class="o">*</span> <span class="n">areas</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">pressure</span> <span class="o">/</span> <span class="mi">1000</span><span class="si">:</span><span class="p">.</span><span class="mi">0</span><span class="n">f</span><span class="si">}</span><span class="s"> kPa -&gt; </span><span class="si">{</span><span class="n">force</span><span class="si">:</span><span class="p">.</span><span class="mi">1</span><span class="n">f</span><span class="si">}</span><span class="s"> N</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu basit model kayıpları ve malzeme doğrusal olmayanlığını hesaba katmaz; yine de eyleyici boyutlandırmasının ilk adımını gösterir.</p>

<h2 id="nerelerde-kullanılıyor">Nerelerde kullanılıyor?</h2>

<p>Yumuşak tutucular gıda sektöründe domates, yumurta ve meyve toplayabilir. Tıp alanında vücuda uyum sağlayan rehabilitasyon eldivenleri ve minimal invaziv cerrahi araçları geliştirilmektedir. Arama-kurtarma robotları ise dar boşluklardan geçmek için gövdelerini sıkıştırabilir.</p>

<p>Elbette teknoloji kusursuz değildir. Esnek malzemeler zamanla yorulabilir, delinmeler oluşabilir ve konum kontrolü zorlaşabilir. Buna rağmen sensörlerin doğrudan malzemeye gömülmesi ve kendi kendini onaran polimerlerin gelişmesi önemli ilerlemeler vadediyor. Geleceğin robotu muhtemelen yalnızca daha zeki değil, aynı zamanda daha yumuşak olacak.</p>

<p><img src="/img/metal-eklemlerden-esnek-44.svg" alt="metal-eklemlerden-esnek-44" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yumuşak robotik" /><category term="robotik" /><category term="akıllı malzemeler" /><category term="pnömatik sistemler" /><category term="biyomimetik" /><category term="mühendislik" /><summary type="html"><![CDATA[Robot denildiğinde zihnimizde genellikle metal kollar, dişliler ve belirgin eklemler canlanır. Yumuşak robotik ise bu görüntüyü tersine çevirerek silikon, elastomer ve kumaş gibi esneyebilen malzemelerden robotlar üretir. Böylece makineler yalnızca hareket etmekle kalmaz; kıvrılabilir, sıkışabilir ve hassas nesnelere zarar vermeden dokunabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/metal-eklemlerden-esnek-44.png" /><media:content medium="image" url="https://program.sonsuz.us/img/metal-eklemlerden-esnek-44.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">ROS Mimarisi: Düğümler Arası Mesajlaşma ile Modüler Robotlar</title><link href="https://program.sonsuz.us/posts/ros-mimarisi-dugumler-arasi-mesajlasma-ile-moduler-robotlar/" rel="alternate" type="text/html" title="ROS Mimarisi: Düğümler Arası Mesajlaşma ile Modüler Robotlar" /><published>2026-10-16T00:00:00+00:00</published><updated>2026-10-16T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/ros-mimarisi-dugumler-arasi-mesajlasma-ile-moduler-robotlar</id><content type="html" xml:base="https://program.sonsuz.us/posts/ros-mimarisi-dugumler-arasi-mesajlasma-ile-moduler-robotlar/"><![CDATA[<p>Bir robotu tek parça hâlinde programlamak, bütün müzisyenlerin aynı enstrümanı çaldığı bir orkestra kurmaya benzer: Gürültü çıkar ama yönetmesi zordur. ROS (Robot Operating System), robot yazılımını küçük ve bağımsız <strong>düğümlere (node)</strong> ayırır. Sensör okuma, haritalama, rota planlama ve motor kontrolü gibi görevler farklı düğümlerde çalışır; aralarındaki iletişim ise standart mesajlaşma mekanizmalarıyla sağlanır.</p>

<p><img src="/img/ros-mimarisi-dugumler-64.svg" alt="ros-mimarisi-dugumler-64" /></p>

<p>``</p>
<h2 id="düğüm-nedir">Düğüm nedir?</h2>

<p>Düğüm, belirli bir sorumluluğu yerine getiren çalışan süreçtir. Örneğin bir mobil robotta şu düğümler bulunabilir:</p>

<ul>
  <li>Kamera görüntüsünü yayımlayan kamera düğümü</li>
  <li>Engelleri belirleyen algılama düğümü</li>
  <li>Hedefe rota oluşturan planlama düğümü</li>
  <li>Tekerlek hızlarını yöneten motor düğümü</li>
</ul>

<p>Bu yaklaşım <strong>tek sorumluluk ilkesini</strong> robotik dünyasına taşır. Bir düğümün iç algoritması değiştirildiğinde, iletişim sözleşmesi aynı kaldığı sürece diğer düğümlerin değiştirilmesi gerekmez. Başka bir deyişle modülerliği sağlayan şey yalnızca kodun bölünmesi değil, parçaların standart mesajlarla haberleşmesidir.</p>

<h2 id="mesajlaşma-modülerliği-nasıl-oluşturur">Mesajlaşma modülerliği nasıl oluşturur?</h2>

<p>ROS’ta bir mesaj, alanları önceden tanımlanmış veri paketidir. Örneğin hız komutu doğrusal ve açısal hız içerebilir:</p>

\[\mathbf{u} = \begin{bmatrix} v \\ \omega \end{bmatrix}\]

<p>Burada $v$ doğrusal, $\omega$ ise açısal hızdır. Motor düğümü bu değerlerin hangi algoritmayla hesaplandığını bilmez; yalnızca mesajı alıp uygular. Böylece rota planlayıcı A* yerine başka bir algoritmaya geçirilse bile motor katmanı çalışmaya devam eder.</p>

<p>Gönderici ve alıcı arasındaki bağımlılık şu şekilde düşünülebilir:</p>

\[Bağımlılık = Arayüz\ Bilgisi - İç\ Uygulama\ Bilgisi\]

<p>İyi tasarlanmış bir ROS sisteminde düğümler birbirlerinin iç uygulamasını değil, yalnızca mesaj tipini ve iletişim kanalını bilir.</p>

<table>
  <thead>
    <tr>
      <th>İletişim türü</th>
      <th>Çalışma biçimi</th>
      <th>Uygun kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Topic</td>
      <td>Yayıncı-abone, asenkron</td>
      <td>Sensör akışları ve hız komutları</td>
    </tr>
    <tr>
      <td>Service</td>
      <td>İstek-cevap, kısa işlem</td>
      <td>Ayar değiştirme veya harita kaydetme</td>
    </tr>
    <tr>
      <td>Action</td>
      <td>Uzun görev, geri bildirimli</td>
      <td>Navigasyon ve robot kolu hareketi</td>
    </tr>
    <tr>
      <td>Parameter</td>
      <td>Düğüm yapılandırması</td>
      <td>Eşik, hız limiti ve çalışma modu</td>
    </tr>
  </tbody>
</table>

<h2 id="topic-ile-gevşek-bağlı-iletişim">Topic ile gevşek bağlı iletişim</h2>

<p>Topic sisteminde yayıncı, mesajı hangi düğümün dinlediğini bilmez. Abone de verinin iç sistemde nasıl üretildiğiyle ilgilenmez. Örneğin ROS 2 üzerinde basit bir hız yayıncısı şöyle yazılabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">rclpy</span>
<span class="kn">from</span> <span class="n">rclpy.node</span> <span class="kn">import</span> <span class="n">Node</span>
<span class="kn">from</span> <span class="n">geometry_msgs.msg</span> <span class="kn">import</span> <span class="n">Twist</span>

<span class="k">class</span> <span class="nc">HizYayinci</span><span class="p">(</span><span class="n">Node</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="nf">super</span><span class="p">().</span><span class="nf">__init__</span><span class="p">(</span><span class="sh">'</span><span class="s">hiz_yayinci</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">publisher</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_publisher</span><span class="p">(</span><span class="n">Twist</span><span class="p">,</span> <span class="sh">'</span><span class="s">/cmd_vel</span><span class="sh">'</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">timer</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="nf">create_timer</span><span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">hiz_gonder</span><span class="p">)</span>

    <span class="k">def</span> <span class="nf">hiz_gonder</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">mesaj</span> <span class="o">=</span> <span class="nc">Twist</span><span class="p">()</span>
        <span class="n">mesaj</span><span class="p">.</span><span class="n">linear</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mf">0.4</span>
        <span class="n">mesaj</span><span class="p">.</span><span class="n">angular</span><span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="mf">0.1</span>
        <span class="n">self</span><span class="p">.</span><span class="n">publisher</span><span class="p">.</span><span class="nf">publish</span><span class="p">(</span><span class="n">mesaj</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>
    <span class="n">rclpy</span><span class="p">.</span><span class="nf">init</span><span class="p">()</span>
    <span class="n">node</span> <span class="o">=</span> <span class="nc">HizYayinci</span><span class="p">()</span>
    <span class="n">rclpy</span><span class="p">.</span><span class="nf">spin</span><span class="p">(</span><span class="n">node</span><span class="p">)</span>
    <span class="n">node</span><span class="p">.</span><span class="nf">destroy_node</span><span class="p">()</span>
    <span class="n">rclpy</span><span class="p">.</span><span class="nf">shutdown</span><span class="p">()</span>
</code></pre></div></div>

<p>Bu düğüm her yarım saniyede <code class="language-plaintext highlighter-rouge">/cmd_vel</code> konusuna hız komutu gönderir. Aynı konuya gerçek motor sürücüsü, simülatör veya test düğümü abone olabilir. Yayıncı kodunun bunların hangisinin kullanıldığını bilmesine gerek yoktur. Bu özellik donanımın simülasyonla değiştirilmesini ve birim testlerinin hazırlanmasını kolaylaştırır.</p>

<h2 id="ros-1-ve-ros-2-açısından-fark">ROS 1 ve ROS 2 açısından fark</h2>

<p>ROS 1 merkezi keşif için <code class="language-plaintext highlighter-rouge">roscore</code> kullanırken ROS 2, DDS tabanlı dağıtık keşiften yararlanır. ROS 2 ayrıca QoS ayarlarıyla güvenilirlik, mesaj geçmişi ve teslim davranışını yapılandırabilir. Örneğin kamera görüntüsünde en güncel kare tercih edilirken kritik kontrol komutlarında güvenilir teslim seçilebilir.</p>

<p>Modülerliğin korunması için düğümleri küçük tutmak, standart mesaj tiplerini tercih etmek ve topic adlarını anlamlı belirlemek gerekir. Her şeyi yapan dev bir “mega node”, ROS kullanılsa bile sıkı bağımlılık yaratır. İyi bir ROS mimarisinde düğümler bağımsız müzisyenler, mesajlar notalar, topic’ler ise orkestranın iletişim kanallarıdır; uyum doğru arayüzlerden doğar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="ros" /><category term="robotik" /><category term="düğümler" /><category term="mesajlaşma" /><category term="ros2" /><category term="dağıtık-sistemler" /><summary type="html"><![CDATA[Bir robotu tek parça hâlinde programlamak, bütün müzisyenlerin aynı enstrümanı çaldığı bir orkestra kurmaya benzer: Gürültü çıkar ama yönetmesi zordur. ROS (Robot Operating System), robot yazılımını küçük ve bağımsız düğümlere (node) ayırır. Sensör okuma, haritalama, rota planlama ve motor kontrolü gibi görevler farklı düğümlerde çalışır; aralarındaki iletişim ise standart mesajlaşma mekanizmalarıyla sağlanır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/ros-mimarisi-dugumler-64.png" /><media:content medium="image" url="https://program.sonsuz.us/img/ros-mimarisi-dugumler-64.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Shell’de Tek ve Çift Tırnak: Değişkenler Ne Zaman Konuşur?</title><link href="https://program.sonsuz.us/posts/shellde-tek-ve-cift-tirnak-degiskenler-ne-zaman-konusur/" rel="alternate" type="text/html" title="Shell’de Tek ve Çift Tırnak: Değişkenler Ne Zaman Konuşur?" /><published>2026-10-16T00:00:00+00:00</published><updated>2026-10-16T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/shellde-tek-ve-cift-tirnak-degiskenler-ne-zaman-konusur</id><content type="html" xml:base="https://program.sonsuz.us/posts/shellde-tek-ve-cift-tirnak-degiskenler-ne-zaman-konusur/"><![CDATA[<p>Shell dünyasında tırnak işaretleri yalnızca boşluk içeren metinleri bir arada tutmaz; değişken genişletmesinin, komut çalıştırmanın ve özel karakterlerin yorumlanmasının kaderini belirler. Tek tırnak her şeyi olduğu gibi saklayan ciddi bir güvenlik görevlisiyken, çift tırnak bazı genişletmelere izin veren daha esnek bir kapı görevlisi gibidir.</p>

<p><img src="/img/shellde-tek-ve-81.svg" alt="shellde-tek-ve-81" /></p>

<p>``</p>

<h2 id="değişken-genişletmesi-nedir">Değişken genişletmesi nedir?</h2>

<p>Shell bir komutu çalıştırmadan önce satır üzerinde çeşitli dönüşümler gerçekleştirir. <code class="language-plaintext highlighter-rouge">$HOME</code> veya <code class="language-plaintext highlighter-rouge">${USER}</code> gibi ifadelerin değerleriyle değiştirilmesine <strong>parametre genişletmesi</strong> denir.</p>

<p>Bu süreci basitçe şöyle gösterebiliriz:</p>

\[\text{yazılan ifade} \xrightarrow{\text{shell genişletmesi}} \text{komuta gönderilen argümanlar}\]

<p>Örneğin <code class="language-plaintext highlighter-rouge">USER=ada</code> ise <code class="language-plaintext highlighter-rouge">$USER</code> ifadesinin genişletilmiş sonucu <code class="language-plaintext highlighter-rouge">ada</code> olur. Ancak bunun gerçekleşip gerçekleşmeyeceğini kullanılan tırnak türü belirler.</p>

<p>\vert  Yazım \vert  Değişken genişler mi? \vert  Komut ikamesi çalışır mı? \vert  Boşluklar korunur mu? \vert 
\vert —\vert —:\vert —:\vert —:\vert 
\vert  <code class="language-plaintext highlighter-rouge">$USER</code> | Evet | Evet | Her zaman değil |
| <code class="language-plaintext highlighter-rouge">"$USER"</code> \vert  Evet \vert  Evet \vert  Evet \vert 
\vert  <code class="language-plaintext highlighter-rouge">'$USER'</code> | Hayır | Hayır | Evet |</p>

<h2 id="tek-tırnak-her-şey-olduğu-gibi">Tek tırnak: Her şey olduğu gibi</h2>

<p>Tek tırnaklar arasındaki karakterler shell tarafından değişmez metin olarak değerlendirilir. <code class="language-plaintext highlighter-rouge">$</code>, ters eğik çizgi ve komut ikamesinde kullanılan karakterler özel anlamlarını kaybeder.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">name</span><span class="o">=</span><span class="s2">"Deniz"</span>

<span class="nb">echo</span> <span class="s1">'$name'</span>
<span class="nb">echo</span> <span class="s1">'Kullanıcı: $name'</span>
<span class="nb">echo</span> <span class="s1">'Bugün: $(date)'</span>
</code></pre></div></div>

<p>Çıktı şöyledir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$name
Kullanıcı: $name
Bugün: $(date)
</code></pre></div></div>

<p>Shell burada değişkeni genişletmez ve <code class="language-plaintext highlighter-rouge">date</code> komutunu çalıştırmaz. Bu davranış düzenli ifadeler, SQL parçaları veya dolar işareti içeren sabit metinler yazarken oldukça kullanışlıdır.</p>

<p>Tek tırnağın küçük bir huysuzluğu vardır: Tek tırnak içinde başka bir tek tırnak doğrudan kullanılamaz. Parçaları birleştirmek gerekir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">echo</span> <span class="s1">'Bugün hava güzel, değil mi?'</span>
<span class="nb">echo</span> <span class="s1">'Ali'</span><span class="s2">"'"</span><span class="s1">'nin dosyası'</span>
</code></pre></div></div>

<p>İkinci komut; tek tırnaklı <code class="language-plaintext highlighter-rouge">Ali</code>, çift tırnaklı tek tırnak karakteri ve yeniden tek tırnaklı metin olmak üzere üç bitişik parçayı birleştirir.</p>

<h2 id="çift-tırnak-kontrollü-genişletme">Çift tırnak: Kontrollü genişletme</h2>

<p>Çift tırnaklar metni tek argüman olarak korurken değişken genişletmesine, komut ikamesine ve bazı kaçışlara izin verir.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">name</span><span class="o">=</span><span class="s2">"Ada Lovelace"</span>
<span class="nv">project_count</span><span class="o">=</span>3

<span class="nb">echo</span> <span class="s2">"Merhaba, </span><span class="nv">$name</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"Proje sayısı: </span><span class="k">${</span><span class="nv">project_count</span><span class="k">}</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="s2">"Tarih: </span><span class="si">$(</span><span class="nb">date</span> +%F<span class="si">)</span><span class="s2">"</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">$name</code> genişler, fakat içindeki boşluk nedeniyle iki ayrı argümana bölünmez. <code class="language-plaintext highlighter-rouge">${project_count}</code> yazımı ise değişken adının sınırlarını açıkça gösterir.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">file</span><span class="o">=</span><span class="s2">"rapor final.txt"</span>

<span class="nb">rm</span> <span class="nv">$file</span>      <span class="c"># İki ayrı dosya adı gibi yorumlanabilir</span>
<span class="nb">rm</span> <span class="s2">"</span><span class="nv">$file</span><span class="s2">"</span>    <span class="c"># Tek bir dosya adı olarak gönderilir</span>
</code></pre></div></div>

<p>Genel kural şudur: Özellikle dosya adlarında değişkenleri çift tırnakla kullanın. Bir değişkenin ürettiği sözcük sayısını kabaca şöyle düşünebiliriz:</p>

\[N_{\text{tırnaksız}} \ge 1, \qquad N_{\text{çift tırnaklı}} = 1\]

<p>Boş veya özel durumlar dışında çift tırnak, genişletilmiş değerin tek argüman kalmasını sağlar.</p>

<h2 id="tırnaksız-kullanım-neden-riskli">Tırnaksız kullanım neden riskli?</h2>

<p>Tırnaksız değişkenler <strong>word splitting</strong> ve dosya adı genişletmesine maruz kalabilir:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">pattern</span><span class="o">=</span><span class="s2">"*.log"</span>
<span class="nb">printf</span> <span class="s1">'&lt;%s&gt;\n'</span> <span class="nv">$pattern</span>
<span class="nb">printf</span> <span class="s1">'&lt;%s&gt;\n'</span> <span class="s2">"</span><span class="nv">$pattern</span><span class="s2">"</span>
</code></pre></div></div>

<p>İlk komut mevcut <code class="language-plaintext highlighter-rouge">.log</code> dosyalarını listeleyebilir. İkincisi ise kelimesi kelimesine <code class="language-plaintext highlighter-rouge">*.log</code> yazdırır. Yani çift tırnak yalnızca estetik değil, davranışı öngörülebilir kılan bir güvenlik kemeridir.</p>

<h2 id="hızlı-seçim-rehberi">Hızlı seçim rehberi</h2>

<table>
  <thead>
    <tr>
      <th>İhtiyaç</th>
      <th>Tercih</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tamamen sabit metin</td>
      <td>Tek tırnak</td>
    </tr>
    <tr>
      <td>Değişken içeren metin</td>
      <td>Çift tırnak</td>
    </tr>
    <tr>
      <td>Dosya yolu veya kullanıcı girdisi</td>
      <td>Çift tırnak</td>
    </tr>
    <tr>
      <td>Bilerek kelime bölme veya glob kullanma</td>
      <td>Tırnaksız, dikkatle</td>
    </tr>
  </tbody>
</table>

<p>Özetle tek tırnak shell’e “hiçbir şeye dokunma”, çift tırnak ise “değişkenleri aç ama sonucu parçalama” der. Emin olmadığınızda <code class="language-plaintext highlighter-rouge">"$variable"</code> kullanmak çoğu shell betiğinde en güvenli ve en az sürprizli seçimdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="shell" /><category term="bash" /><category term="linux" /><category term="değişken" /><category term="tırnak" /><category term="komut-satırı" /><summary type="html"><![CDATA[Shell dünyasında tırnak işaretleri yalnızca boşluk içeren metinleri bir arada tutmaz; değişken genişletmesinin, komut çalıştırmanın ve özel karakterlerin yorumlanmasının kaderini belirler. Tek tırnak her şeyi olduğu gibi saklayan ciddi bir güvenlik görevlisiyken, çift tırnak bazı genişletmelere izin veren daha esnek bir kapı görevlisi gibidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/shellde-tek-ve-81.png" /><media:content medium="image" url="https://program.sonsuz.us/img/shellde-tek-ve-81.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">B-Ağaçları: Veritabanlarının Diskteki Hız Sırrı</title><link href="https://program.sonsuz.us/posts/b-agaclari-veritabanlarinin-diskteki-hiz-sirri/" rel="alternate" type="text/html" title="B-Ağaçları: Veritabanlarının Diskteki Hız Sırrı" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/b-agaclari-veritabanlarinin-diskteki-hiz-sirri</id><content type="html" xml:base="https://program.sonsuz.us/posts/b-agaclari-veritabanlarinin-diskteki-hiz-sirri/"><![CDATA[<p>Bir veritabanında milyonlarca kayıt bulunmasına rağmen sorguların birkaç milisaniyede sonuçlanması sihir değildir. Bu başarının arkasında, verileri disk üzerinde akıllıca düzenleyen indeksler ve özellikle B-ağaçları vardır. Dengeli, geniş ve kısa bir yapıya sahip olan B-ağaçları, pahalı disk erişimlerinin sayısını azaltarak aradığımız kayda mümkün olduğunca az adımda ulaşmamızı sağlar.
``</p>

<h2 id="asıl-sorun-disk-erişimi-pahalıdır">Asıl sorun: Disk erişimi pahalıdır</h2>

<p>RAM üzerindeki verilere erişmek son derece hızlıdır; ancak kalıcı veriler SSD veya sabit diskte tutulur. Diskten tek bir bayt yerine genellikle <strong>sayfa</strong> ya da <strong>blok</strong> adı verilen sabit boyutlu veri parçaları okunur. Bir sayfanın boyutu örneğin 4 KB, 8 KB veya 16 KB olabilir.</p>

<p>Bu nedenle disk tabanlı bir veri yapısında temel maliyet, yapılan karşılaştırmalar değil, okunan sayfa sayısıdır. Bir milyon kayıt arasında ikili arama teorik olarak</p>

\[\log_2(1.000.000) \approx 20\]

<p>adım gerektirir. Fakat her düğüm ayrı bir disk sayfasındaysa yaklaşık 20 disk erişimi oldukça pahalı olabilir. B-ağaçları ise bir düğümde çok sayıda anahtar saklayarak ağacın dallanma katsayısını büyütür.</p>

<h2 id="b-ağacının-temel-mantığı">B-ağacının temel mantığı</h2>

<p>İkili arama ağacındaki her düğüm en fazla iki çocuğa sahiptir. B-ağacında ise bir düğüm onlarca, hatta yüzlerce çocuk barındırabilir. Düğüm boyutu genellikle bir disk sayfasını dolduracak şekilde seçilir.</p>

<p>Bir B-ağacının dallanma katsayısı $m$ ise yaklaşık yüksekliği şöyledir:</p>

\[h \approx \log_m(n)\]

<p>Örneğin bir düğüm 100 çocuk gösterebiliyorsa bir milyon kayıt için:</p>

\[\log_{100}(1.000.000) = 3\]

<p>Yani teorik olarak yalnızca üç sayfa okumasıyla hedef bölgeye ulaşılabilir. Üst düğümlerin önbellekte tutulması durumunda gerçek disk erişimi daha da azalır.</p>

<table>
  <thead>
    <tr>
      <th>Yapı</th>
      <th style="text-align: right">Düğüm başına çocuk</th>
      <th style="text-align: right">Yaklaşık yükseklik</th>
      <th>Disk kullanımı</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>İkili arama ağacı</td>
      <td style="text-align: right">2</td>
      <td style="text-align: right">Yüksek</td>
      <td>Çok sayıda rastgele erişim</td>
    </tr>
    <tr>
      <td>B-ağacı</td>
      <td style="text-align: right">Çok sayıda</td>
      <td style="text-align: right">Düşük</td>
      <td>Sayfa odaklı ve verimli</td>
    </tr>
    <tr>
      <td>B+ ağacı</td>
      <td style="text-align: right">Çok sayıda</td>
      <td style="text-align: right">Düşük</td>
      <td>Sıralı taramalar için çok uygun</td>
    </tr>
    <tr>
      <td>Hash indeks</td>
      <td style="text-align: right">Kovaya bağlı</td>
      <td style="text-align: right">Genellikle sabit</td>
      <td>Eşitlik sorgularında güçlü</td>
    </tr>
  </tbody>
</table>

<h2 id="arama-nasıl-gerçekleştirilir">Arama nasıl gerçekleştirilir?</h2>

<p>Her düğümde anahtarlar sıralı tutulur. Aranan değer düğümdeki anahtarlarla karşılaştırılır ve uygun çocuk sayfasına geçilir. Aşağıdaki sadeleştirilmiş Python kodu, bellekteki bir B-ağacı düğümünde bu yönlendirmeyi gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">BTreeNode</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">keys</span><span class="p">,</span> <span class="n">children</span><span class="o">=</span><span class="bp">None</span><span class="p">,</span> <span class="n">leaf</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">keys</span> <span class="o">=</span> <span class="n">keys</span>
        <span class="n">self</span><span class="p">.</span><span class="n">children</span> <span class="o">=</span> <span class="n">children</span> <span class="ow">or</span> <span class="p">[]</span>
        <span class="n">self</span><span class="p">.</span><span class="n">leaf</span> <span class="o">=</span> <span class="n">leaf</span>

    <span class="k">def</span> <span class="nf">search</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">target</span><span class="p">):</span>
        <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>

        <span class="k">while</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">)</span> <span class="ow">and</span> <span class="n">target</span> <span class="o">&gt;</span> <span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
            <span class="n">index</span> <span class="o">+=</span> <span class="mi">1</span>

        <span class="k">if</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">)</span> <span class="ow">and</span> <span class="n">target</span> <span class="o">==</span> <span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">[</span><span class="n">index</span><span class="p">]:</span>
            <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">keys</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>

        <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">leaf</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>

        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">children</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="nf">search</span><span class="p">(</span><span class="n">target</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, önce hedefin hangi anahtar aralığında bulunduğunu belirler. Düğüm yaprak değilse yalnızca ilgili çocuğa ilerler. Gerçek veritabanlarında <code class="language-plaintext highlighter-rouge">children</code> listesindeki öğeler çoğunlukla nesne değil, disk sayfalarının adresleridir. Ayrıca düğüm içindeki arama doğrusal tarama yerine ikili aramayla yapılabilir.</p>

<h2 id="ekleme-ve-bölünme">Ekleme ve bölünme</h2>

<p>Bir düğüm dolduğunda yeni kayıt gelişigüzel başka bir yere konmaz. Düğüm iki parçaya bölünür ve ortadaki anahtar üst düğüme taşınır. Üst düğüm de dolarsa bölünme köke kadar ilerleyebilir. Kök bölündüğünde ağacın yüksekliği yalnızca bir artar.</p>

<p>Bu kurallar bütün yaprakların aynı seviyede kalmasını sağlar. Böylece kötü sıralanmış eklemeler bile ağacı uzun bir zincire dönüştüremez. Arama, ekleme ve silme işlemlerinin maliyeti genel olarak $O(\log_m n)$ seviyesindedir.</p>

<h2 id="b-ağaçları-neden-daha-yaygın">B+ ağaçları neden daha yaygın?</h2>

<p>Modern veritabanları çoğunlukla B-ağacının bir türevi olan <strong>B+ ağacını</strong> kullanır. İç düğümler yalnızca yönlendirme anahtarlarını içerirken gerçek kayıtlar yapraklarda saklanır. Yapraklar birbirine bağlı olduğundan <code class="language-plaintext highlighter-rouge">WHERE yas BETWEEN 20 AND 30</code> gibi aralık sorguları, ilk kayıt bulunduktan sonra sayfalar üzerinde sıralı biçimde ilerleyebilir.</p>

<p>Kısacası B-ağaçlarının gücü yalnızca hızlı arama yapmalarından gelmez. Disk sayfalarıyla uyumlu çalışmaları, dengelerini korumaları ve yüksek dallanma katsayıları sayesinde milyonlarca kaydı birkaç disk erişimine indirgemeleri onları veritabanı indekslerinin vazgeçilmez kahramanı yapar.</p>

<p><img src="/img/b-agaclari-veritabanlarinin-26.svg" alt="b-agaclari-veritabanlarinin-26" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="b-ağacı" /><category term="veritabanı" /><category term="veri yapıları" /><category term="algoritma" /><category term="indeksleme" /><category term="disk erişimi" /><summary type="html"><![CDATA[Bir veritabanında milyonlarca kayıt bulunmasına rağmen sorguların birkaç milisaniyede sonuçlanması sihir değildir. Bu başarının arkasında, verileri disk üzerinde akıllıca düzenleyen indeksler ve özellikle B-ağaçları vardır. Dengeli, geniş ve kısa bir yapıya sahip olan B-ağaçları, pahalı disk erişimlerinin sayısını azaltarak aradığımız kayda mümkün olduğunca az adımda ulaşmamızı sağlar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/b-agaclari-veritabanlarinin-26.png" /><media:content medium="image" url="https://program.sonsuz.us/img/b-agaclari-veritabanlarinin-26.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C# Arayüzler ve Yapılar: Davranış Sözleşmesinden Verimli Bellek Kullanımına</title><link href="https://program.sonsuz.us/posts/c-arayuzler-ve-yapilar-davranis-sozlesmesinden-verimli-bellek-kullanimina/" rel="alternate" type="text/html" title="C# Arayüzler ve Yapılar: Davranış Sözleşmesinden Verimli Bellek Kullanımına" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-arayuzler-ve-yapilar-davranis-sozlesmesinden-verimli-bellek-kullanimina</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-arayuzler-ve-yapilar-davranis-sozlesmesinden-verimli-bellek-kullanimina/"><![CDATA[<p>C# dünyasında <code class="language-plaintext highlighter-rouge">interface</code> ve <code class="language-plaintext highlighter-rouge">struct</code>, benzer görünen problemlere tamamen farklı yönlerden yaklaşır. Arayüzler bir türün <strong>ne yapması gerektiğini</strong> söylerken yapılar küçük verileri düşük maliyetle temsil etmeyi amaçlar. Biri davranış sözleşmesi, diğeri değer semantiği sunar. Doğru yerde kullanıldıklarında kodu hem esnek hem de hızlı hâle getirirler; yanlış tercihler ise kutulama, gereksiz kopyalama ve karmaşık tasarım gibi sürprizler doğurabilir.</p>

<p><img src="/img/c-arayuzler-ve-77.svg" alt="c-arayuzler-ve-77" /></p>

<p>``</p>

<h2 id="arayüz-davranışın-sözleşmesi">Arayüz: Davranışın sözleşmesi</h2>

<p>Arayüz, onu uygulayan türlerin sunması gereken üyeleri tanımlar. Genellikle durum saklamaz ve doğrudan örneklenemez. Böylece kod, belirli bir sınıfa değil davranışa bağımlı olur. Bu yaklaşım bağımlılıkların tersine çevrilmesini ve birim testlerini kolaylaştırır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">interface</span> <span class="nc">IBildirimGonderici</span>
<span class="p">{</span>
    <span class="k">void</span> <span class="nf">Gonder</span><span class="p">(</span><span class="kt">string</span> <span class="n">alici</span><span class="p">,</span> <span class="kt">string</span> <span class="n">mesaj</span><span class="p">);</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">class</span> <span class="nc">EpostaGonderici</span> <span class="p">:</span> <span class="n">IBildirimGonderici</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="k">void</span> <span class="nf">Gonder</span><span class="p">(</span><span class="kt">string</span> <span class="n">alici</span><span class="p">,</span> <span class="kt">string</span> <span class="n">mesaj</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="s">$"E-posta gönderildi: </span><span class="p">{</span><span class="n">alici</span><span class="p">}</span><span class="s"> - </span><span class="p">{</span><span class="n">mesaj</span><span class="p">}</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">IBildirimGonderici</code>, gönderimin nasıl yapılacağını açıklamaz; yalnızca <code class="language-plaintext highlighter-rouge">Gonder</code> davranışını zorunlu kılar. Daha sonra SMS veya mobil bildirim sınıfları aynı arayüzü uygulayabilir. Çağıran kodun hangi somut sınıfı kullandığını bilmesine gerek kalmaz.</p>

<p>Modern C# sürümlerinde arayüzler varsayılan metot gövdeleri ve statik üyeler içerebilse de temel amaçları hâlâ ortak davranış sınırı oluşturmaktır. Arayüzü, “Bu etiketi taşıyorsan şu yetenekleri sunmalısın” diyen bir kulüp üyeliği gibi düşünebiliriz.</p>

<h2 id="struct-küçük-ama-ciddi-bir-değer-tipi">Struct: Küçük ama ciddi bir değer tipi</h2>

<p><code class="language-plaintext highlighter-rouge">struct</code>, sınıflardan farklı olarak bir <strong>değer tipidir</strong>. Bir yapı değişkene atandığında çoğunlukla referansı değil, içindeki değerler kopyalanır.</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">readonly</span> <span class="k">struct</span> <span class="nc">Nokta</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">X</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Y</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">Nokta</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="kt">double</span> <span class="n">y</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">X</span> <span class="p">=</span> <span class="n">x</span><span class="p">;</span>
        <span class="n">Y</span> <span class="p">=</span> <span class="n">y</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">public</span> <span class="kt">double</span> <span class="nf">Uzaklik</span><span class="p">()</span> <span class="p">=&gt;</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Sqrt</span><span class="p">(</span><span class="n">X</span> <span class="p">*</span> <span class="n">X</span> <span class="p">+</span> <span class="n">Y</span> <span class="p">*</span> <span class="n">Y</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu yapı iki boyutlu bir noktayı temsil eder. Öklid uzaklığı şu formülle hesaplanır:</p>

\[d = \sqrt{x^2 + y^2}\]

<p><code class="language-plaintext highlighter-rouge">readonly struct</code>, oluşturulduktan sonra değerin değişmeyeceğini belirtir. Bu özellik hem niyeti açıklar hem de derleyicinin bazı gereksiz savunma kopyalarını azaltmasına yardımcı olabilir.</p>

<h2 id="temel-farklar">Temel farklar</h2>

<p>\vert  Özellik \vert  Interface \vert  Struct \vert 
\vert —\vert —\vert —\vert 
\vert  Ana amacı \vert  Davranış sözleşmesi tanımlamak \vert  Küçük bir değeri temsil etmek \vert 
\vert  Örneklenebilir mi? \vert  Hayır \vert  Evet \vert 
\vert  Semantik \vert  Uygulayan türe bağlı \vert  Değer semantiği \vert 
\vert  Kalıtım \vert  Bir tür birden fazla arayüz uygulayabilir \vert  Başka sınıf veya struct kalıtamaz \vert 
\vert  Durum \vert  Normal örnek alanı taşımaz \vert  Alan ve özellik taşıyabilir \vert 
\vert  <code class="language-plaintext highlighter-rouge">null</code> değeri \vert  Referans üzerinden mümkün \vert  Yalnızca <code class="language-plaintext highlighter-rouge">Nullable&lt;T&gt;</code> ile \vert</p>

<h2 id="birlikte-kullanılabilirler-mi">Birlikte kullanılabilirler mi?</h2>

<p>Elbette! Bir yapı da arayüz uygulayabilir:</p>

<div class="language-csharp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">interface</span> <span class="nc">IAlanHesaplayici</span>
<span class="p">{</span>
    <span class="kt">double</span> <span class="nf">AlanHesapla</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">readonly</span> <span class="k">struct</span> <span class="nc">Dikdortgen</span> <span class="p">:</span> <span class="n">IAlanHesaplayici</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">En</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Boy</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">Dikdortgen</span><span class="p">(</span><span class="kt">double</span> <span class="n">en</span><span class="p">,</span> <span class="kt">double</span> <span class="n">boy</span><span class="p">)</span> <span class="p">=&gt;</span> <span class="p">(</span><span class="n">En</span><span class="p">,</span> <span class="n">Boy</span><span class="p">)</span> <span class="p">=</span> <span class="p">(</span><span class="n">en</span><span class="p">,</span> <span class="n">boy</span><span class="p">);</span>

    <span class="k">public</span> <span class="kt">double</span> <span class="nf">AlanHesapla</span><span class="p">()</span> <span class="p">=&gt;</span> <span class="n">En</span> <span class="p">*</span> <span class="n">Boy</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Ancak yapı, arayüz türündeki bir değişkene atanırsa <strong>boxing</strong> oluşabilir. Boxing sırasında değer, yönetilen yığında bir nesne içine sarılır. Yaklaşık maliyeti yalnızca veri boyutu $S$ değil, nesne başlığı $H$ ile birlikte kabaca $S + H$ olarak düşünülebilir. Sık çalışan döngülerde bu tahsisler çöp toplayıcı üzerinde baskı yaratır. Generic kısıtlar, bazı senaryolarda boxing maliyetini önleyebilir.</p>

<h2 id="sınırlar-ve-seçim-rehberi">Sınırlar ve seçim rehberi</h2>

<p>Struct; küçük, mantıksal olarak tek bir değer olan ve tercihen değişmez veri modellerinde uygundur. Koordinat, renk, tarih aralığı veya ölçü birimi iyi adaylardır. Büyük struct’lar her atamada kopyalanabileceği için performansı tersine çevirebilir. Kimliği olan, uzun yaşayan veya sık değişen nesnelerde sınıf tercih edilmelidir.</p>

<p>Arayüz ise farklı türlerin ortak bir yeteneği paylaşması, bağımlılıkların soyutlanması veya test doubles kullanılması gerektiğinde güçlüdür. Kısacası arayüz <strong>“ne yapabilir?”</strong>, struct ise <strong>“hangi değeri temsil eder?”</strong> sorusuna cevap verir. Bu ayrımı korumak, hem temiz mimarinin hem de bilinçli bellek kullanımının anahtarıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="csharp" /><category term="arayüzler" /><category term="struct" /><category term="değer-tipleri" /><category term="oop" /><category term="bellek-yönetimi" /><summary type="html"><![CDATA[C# dünyasında interface ve struct, benzer görünen problemlere tamamen farklı yönlerden yaklaşır. Arayüzler bir türün ne yapması gerektiğini söylerken yapılar küçük verileri düşük maliyetle temsil etmeyi amaçlar. Biri davranış sözleşmesi, diğeri değer semantiği sunar. Doğru yerde kullanıldıklarında kodu hem esnek hem de hızlı hâle getirirler; yanlış tercihler ise kutulama, gereksiz kopyalama ve karmaşık tasarım gibi sürprizler doğurabilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-arayuzler-ve-77.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-arayuzler-ve-77.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Değişkenler, Sabitler ve Veri Tipleri: Belleğin Dilini Öğrenmek</title><link href="https://program.sonsuz.us/posts/c-degiskenler-sabitler-ve-veri-tipleri-bellegin-dilini-ogrenmek/" rel="alternate" type="text/html" title="C Değişkenler, Sabitler ve Veri Tipleri: Belleğin Dilini Öğrenmek" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-degiskenler-sabitler-ve-veri-tipleri-bellegin-dilini-ogrenmek</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-degiskenler-sabitler-ve-veri-tipleri-bellegin-dilini-ogrenmek/"><![CDATA[<p>C programında oluşturduğumuz her değişken, bellekte ayrılmış bir alanı temsil eder. Veri tipi ise derleyiciye bu alanın yaklaşık büyüklüğünü, içindeki bitlerin nasıl yorumlanacağını ve hangi işlemlerin uygulanabileceğini söyler. Kısacası değişken bir kutuysa veri tipi kutunun etiketi, sabit ise kapağı kilitlenmiş kutudur.</p>

<p><img src="/img/c-degiskenler-sabitler-64.svg" alt="c-degiskenler-sabitler-64" /></p>

<p>``</p>

<h2 id="değişkenin-bellekteki-yaşamı">Değişkenin bellekteki yaşamı</h2>

<p>Bir değişken tanımlanırken genel olarak <code class="language-plaintext highlighter-rouge">veri_tipi isim = değer;</code> kalıbı kullanılır. Örneğin <code class="language-plaintext highlighter-rouge">int yas = 25;</code> ifadesi, <code class="language-plaintext highlighter-rouge">yas</code> adında bir bellek alanı oluşturur ve buraya 25 değerini yazar.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">yas</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">sicaklik</span> <span class="o">=</span> <span class="mi">22</span><span class="p">.</span><span class="mi">5</span><span class="n">f</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">seviye</span> <span class="o">=</span> <span class="sc">'A'</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"Yaş: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">yas</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Sıcaklık: %.1f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">sicaklik</span><span class="p">);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Seviye: %c</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">seviye</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">int</code> tam sayıları, <code class="language-plaintext highlighter-rouge">float</code> ondalıklı sayıları, <code class="language-plaintext highlighter-rouge">char</code> ise tek bir karakteri saklar. Karakterler bellekte aslında sayısal kodlar hâlinde tutulur. Örneğin ASCII sisteminde <code class="language-plaintext highlighter-rouge">'A'</code> karakterinin karşılığı 65’tir.</p>

<h2 id="temel-veri-tipleri">Temel veri tipleri</h2>

<p>C standardı bazı tiplerin kesin boyutunu değil, asgari kapasitesini ve birbirleriyle ilişkisini tanımlar. Bu nedenle aşağıdaki boyutlar yaygın sistemlerde görülen değerlerdir; kesin sonuç için <code class="language-plaintext highlighter-rouge">sizeof</code> kullanılmalıdır.</p>

<table>
  <thead>
    <tr>
      <th>Veri tipi</th>
      <th style="text-align: right">Yaygın boyut</th>
      <th>Kullanım amacı</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">char</code></td>
      <td style="text-align: right">1 bayt</td>
      <td>Karakter veya küçük tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">'K'</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">short</code></td>
      <td style="text-align: right">2 bayt</td>
      <td>Küçük tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">1200</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">int</code></td>
      <td style="text-align: right">4 bayt</td>
      <td>Genel amaçlı tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">50000</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">long long</code></td>
      <td style="text-align: right">8 bayt</td>
      <td>Büyük tamsayı</td>
      <td><code class="language-plaintext highlighter-rouge">9000000LL</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">float</code></td>
      <td style="text-align: right">4 bayt</td>
      <td>Tek duyarlıklı ondalık</td>
      <td><code class="language-plaintext highlighter-rouge">3.14f</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">double</code></td>
      <td style="text-align: right">8 bayt</td>
      <td>Daha hassas ondalık</td>
      <td><code class="language-plaintext highlighter-rouge">3.14159</code></td>
    </tr>
  </tbody>
</table>

<p>Bir tip $n$ bitlik işaretsiz bir tamsayı saklıyorsa değer aralığı genellikle $0$ ile $2^n-1$ arasındadır. İki’nin tümleyeni kullanılan işaretli sistemlerde yaklaşık aralık $-2^{n-1}$ ile $2^{n-1}-1$ olur. Örneğin 8 bitlik işaretsiz değer $0$–$255$ aralığını kapsar.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"int: %zu bayt</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"double: %zu bayt</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">double</span><span class="p">));</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"char: %zu bayt</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">char</span><span class="p">));</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sizeof</code>, türün veya değişkenin kaç bayt kapladığını döndürür. Sonuç <code class="language-plaintext highlighter-rouge">size_t</code> tipinde olduğu için <code class="language-plaintext highlighter-rouge">%zu</code> biçim belirteci kullanılır.</p>

<h2 id="niteleyiciler-neyi-değiştirir">Niteleyiciler neyi değiştirir?</h2>

<p><code class="language-plaintext highlighter-rouge">short</code>, <code class="language-plaintext highlighter-rouge">long</code>, <code class="language-plaintext highlighter-rouge">signed</code> ve <code class="language-plaintext highlighter-rouge">unsigned</code>, tamsayı tiplerinin kapasitesini veya işaret davranışını düzenler. <code class="language-plaintext highlighter-rouge">const</code> ve <code class="language-plaintext highlighter-rouge">volatile</code> ise erişim kurallarını belirtir.</p>

<table>
  <thead>
    <tr>
      <th>Niteleyici</th>
      <th>Etkisi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">unsigned</code></td>
      <td>Negatif değer yerine daha geniş pozitif aralık sağlar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">signed</code></td>
      <td>Pozitif ve negatif değerleri destekler</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">short</code></td>
      <td>Genellikle daha küçük tamsayı tipi oluşturur</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">long</code></td>
      <td>Daha geniş sayı türü belirtir</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">const</code></td>
      <td>Program kodu üzerinden değiştirilmeyi engeller</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">volatile</code></td>
      <td>Değerin dış etkenlerle değişebileceğini derleyiciye bildirir</td>
    </tr>
  </tbody>
</table>

<p><code class="language-plaintext highlighter-rouge">volatile</code>, özellikle mikrodenetleyici yazmaçlarında veya sinyal işleyicilerinde önemlidir. Derleyicinin değeri bir kez okuyup önbellekte tutmasını engeller; ancak değişkeni eşzamanlı erişime karşı güvenli yapmaz.</p>

<h2 id="sabit-oluşturma-yöntemleri">Sabit oluşturma yöntemleri</h2>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdint.h&gt;</span><span class="cp">
</span>
<span class="cp">#define BUFFER_SIZE 256
</span>
<span class="k">enum</span> <span class="p">{</span> <span class="n">MAX_RETRY</span> <span class="o">=</span> <span class="mi">3</span> <span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">double</span> <span class="n">pi</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">1415926535</span><span class="p">;</span>
    <span class="kt">uint32_t</span> <span class="n">paket_no</span> <span class="o">=</span> <span class="mi">42U</span><span class="p">;</span>
    <span class="kt">double</span> <span class="n">alan</span> <span class="o">=</span> <span class="n">pi</span> <span class="o">*</span> <span class="mi">5</span><span class="p">.</span><span class="mi">0</span> <span class="o">*</span> <span class="mi">5</span><span class="p">.</span><span class="mi">0</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">alan</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">.</span><span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">paket_no</span> <span class="o">&lt;</span> <span class="n">BUFFER_SIZE</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">const</code>, türü belli salt okunur bir nesne oluşturur. <code class="language-plaintext highlighter-rouge">#define</code> metinsel ön işlemci değişimidir ve tip denetimi sağlamaz. <code class="language-plaintext highlighter-rouge">enum</code> ise tamsayı sabitleri için kullanışlıdır. <code class="language-plaintext highlighter-rouge">stdint.h</code> içindeki <code class="language-plaintext highlighter-rouge">uint32_t</code> gibi tipler, mevcut olduklarında kesin bit genişliği sağlayarak taşınabilir veri formatlarında belirsizliği azaltır.</p>

<p>Sonuç olarak doğru veri tipi seçimi yalnızca bellek tasarrufu değildir; sayı taşmalarını, hassasiyet kaybını ve platformlar arası sürprizleri önleyen temel bir tasarım kararıdır. C, belleği gizlemek yerine size anahtarları verir; fakat hangi kapıyı açtığınıza dikkat etmek tamamen sizin sorumluluğunuzdadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="değişkenler" /><category term="veri-tipleri" /><category term="sabitler" /><category term="bellek" /><category term="programlama" /><summary type="html"><![CDATA[C programında oluşturduğumuz her değişken, bellekte ayrılmış bir alanı temsil eder. Veri tipi ise derleyiciye bu alanın yaklaşık büyüklüğünü, içindeki bitlerin nasıl yorumlanacağını ve hangi işlemlerin uygulanabileceğini söyler. Kısacası değişken bir kutuysa veri tipi kutunun etiketi, sabit ise kapağı kilitlenmiş kutudur.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-degiskenler-sabitler-64.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-degiskenler-sabitler-64.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Dizileri: Bellekte Yan Yana Yaşayan Veriler</title><link href="https://program.sonsuz.us/posts/c-dizileri-bellekte-yan-yana-yasayan-veriler/" rel="alternate" type="text/html" title="C Dizileri: Bellekte Yan Yana Yaşayan Veriler" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-dizileri-bellekte-yan-yana-yasayan-veriler</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-dizileri-bellekte-yan-yana-yasayan-veriler/"><![CDATA[<p>C dilinde çok sayıda aynı tür veriyi ayrı ayrı değişkenlerle yönetmek, her yolcu için ayrı otobüs çağırmaya benzer. Diziler ise tüm yolcuları tek araca bindirir: Veriler ardışık bellek hücrelerinde saklanır, ortak bir adla yönetilir ve indeksler sayesinde hızlıca erişilebilir hâle gelir.</p>

<p><img src="/img/c-dizileri-bellekte-85.svg" alt="c-dizileri-bellekte-85" /></p>

<p>``</p>

<h2 id="dizi-nedir">Dizi Nedir?</h2>

<p>Dizi, <strong>aynı veri türüne sahip sabit sayıda elemanın</strong> bellekte art arda tutulduğu veri yapısıdır. Beş öğrencinin notlarını saklamak için beş değişken tanımlamak yerine şöyle bir dizi oluşturabiliriz:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">notlar</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">78</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">90</span><span class="p">};</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">notlar</code> dizinin adı, <code class="language-plaintext highlighter-rouge">int</code> eleman türü ve <code class="language-plaintext highlighter-rouge">5</code> kapasitesidir. C dizilerinde indeksler sıfırdan başladığı için ilk eleman <code class="language-plaintext highlighter-rouge">notlar[0]</code>, son eleman ise <code class="language-plaintext highlighter-rouge">notlar[4]</code> olur.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Ayrı değişkenler</th>
      <th>Dizi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Tanımlama</td>
      <td><code class="language-plaintext highlighter-rouge">n1</code>, <code class="language-plaintext highlighter-rouge">n2</code>, <code class="language-plaintext highlighter-rouge">n3</code></td>
      <td><code class="language-plaintext highlighter-rouge">notlar[3]</code></td>
    </tr>
    <tr>
      <td>Döngüyle işleme</td>
      <td>Zor</td>
      <td>Kolay</td>
    </tr>
    <tr>
      <td>Bellek düzeni</td>
      <td>Ardışık olması garanti değil</td>
      <td>Ardışık</td>
    </tr>
    <tr>
      <td>Eleman erişimi</td>
      <td>Değişken adıyla</td>
      <td>İndeksle</td>
    </tr>
    <tr>
      <td>Veri türü</td>
      <td>Farklı olabilir</td>
      <td>Tamamı aynıdır</td>
    </tr>
  </tbody>
</table>

<h2 id="bellekte-yerleşim-mantığı">Bellekte Yerleşim Mantığı</h2>

<p>Bir dizinin en önemli özelliği, elemanlarının ardışık adreslerde bulunmasıdır. Dizinin başlangıç adresi $B$, her elemanın boyutu $s$ bayt ise $i$ indeksli elemanın adresi şu formülle hesaplanır:</p>

\[Adres(A[i]) = B + i \times s\]

<p>Örneğin <code class="language-plaintext highlighter-rouge">int</code> türünün 4 bayt olduğu bir sistemde başlangıç adresi 1000 olan dizinin <code class="language-plaintext highlighter-rouge">A[3]</code> elemanı şu adrestedir:</p>

\[1000 + 3 \times 4 = 1012\]

<p>Bu doğrudan hesaplama sayesinde herhangi bir elemana erişim sabit zamanda gerçekleşir: $O(1)$. Bilgisayarın önceki elemanları tek tek gezmesi gerekmez.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">sayilar</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">};</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"sayilar[%d] = %d, adres = %p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
               <span class="n">i</span><span class="p">,</span> <span class="n">sayilar</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="p">(</span><span class="kt">void</span> <span class="o">*</span><span class="p">)</span><span class="o">&amp;</span><span class="n">sayilar</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu program her elemanın değerini ve adresini gösterir. Çıktıdaki adres farklarının genellikle <code class="language-plaintext highlighter-rouge">sizeof(int)</code> kadar olduğunu görebilirsiniz. Böylece ardışık yerleşim yalnızca teori olmaktan çıkar, terminalde görünür hâle gelir.</p>

<h2 id="dizi-adı-ve-pointer-i̇lişkisi">Dizi Adı ve Pointer İlişkisi</h2>

<p>Çoğu ifadede dizi adı, ilk elemanın adresine dönüşür. Bu nedenle <code class="language-plaintext highlighter-rouge">sayilar</code> ile <code class="language-plaintext highlighter-rouge">&amp;sayilar[0]</code> aynı başlangıç konumunu gösterir. İndeksleme de pointer aritmetiğiyle yakından ilişkilidir:</p>

\[A[i] \equiv *(A + i)\]

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">degerler</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">15</span><span class="p">};</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">degerler</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="o">*</span><span class="p">(</span><span class="n">degerler</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
</code></pre></div></div>

<p>İki satır da <code class="language-plaintext highlighter-rouge">10</code> yazdırır. Ancak dizi ve pointer tamamen aynı kavram değildir. Dizi için ayrılmış alan sabittir; dizi adına yeni bir adres atanamaz. Pointer ise farklı adresleri gösterebilen ayrı bir değişkendir.</p>

<h2 id="dizileri-döngülerle-yönetmek">Dizileri Döngülerle Yönetmek</h2>

<p>Dizilerin asıl gücü döngülerle ortaya çıkar. Aşağıdaki kod, notların toplamını ve ortalamasını hesaplar:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">notlar</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">78</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">90</span><span class="p">};</span>
    <span class="kt">int</span> <span class="n">adet</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">notlar</span><span class="p">)</span> <span class="o">/</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">notlar</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
    <span class="kt">int</span> <span class="n">toplam</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">adet</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">toplam</span> <span class="o">+=</span> <span class="n">notlar</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>

    <span class="kt">double</span> <span class="n">ortalama</span> <span class="o">=</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span> <span class="n">toplam</span> <span class="o">/</span> <span class="n">adet</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Ortalama: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ortalama</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">sizeof(notlar) / sizeof(notlar[0])</code> ifadesi toplam dizi boyutunu tek elemanın boyutuna bölerek eleman sayısını bulur. Bu yöntem yalnızca gerçek dizi aynı kapsamdayken güvenilirdir; fonksiyona aktarılan dizi parametresi pointer gibi davranır.</p>

<h2 id="sınırların-dışına-çıkma-tehlikesi">Sınırların Dışına Çıkma Tehlikesi</h2>

<p>C, indeksleri otomatik olarak denetlemez. Beş elemanlı bir dizide <code class="language-plaintext highlighter-rouge">notlar[5]</code> kullanmak tanımsız davranıştır. Program çökebilir, yanlış sonuç üretebilir veya çalışıyor gibi görünebilir. En sinsi ihtimal de sonuncusudur!</p>

<p>Bu nedenle döngü koşullarında <code class="language-plaintext highlighter-rouge">i &lt; adet</code> tercih edilmeli, <code class="language-plaintext highlighter-rouge">i &lt;= adet</code> hatasından kaçınılmalıdır. Diziler hızlı ve verimlidir; fakat güvenlik kemerini programcı takar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="diziler" /><category term="bellek-yönetimi" /><category term="programlama" /><category term="pointer" /><category term="veri-yapıları" /><summary type="html"><![CDATA[C dilinde çok sayıda aynı tür veriyi ayrı ayrı değişkenlerle yönetmek, her yolcu için ayrı otobüs çağırmaya benzer. Diziler ise tüm yolcuları tek araca bindirir: Veriler ardışık bellek hücrelerinde saklanır, ortak bir adla yönetilir ve indeksler sayesinde hızlıca erişilebilir hâle gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-dizileri-bellekte-85.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-dizileri-bellekte-85.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C++ Namespace ve Koenig Araması: Fonksiyon Çözümlemesinin Görünmeyen Kuralları</title><link href="https://program.sonsuz.us/posts/c-namespace-ve-koenig-aramasi-fonksiyon-cozumlemesinin-gorunmeyen-kurallari/" rel="alternate" type="text/html" title="C++ Namespace ve Koenig Araması: Fonksiyon Çözümlemesinin Görünmeyen Kuralları" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-namespace-ve-koenig-aramasi-fonksiyon-cozumlemesinin-gorunmeyen-kurallari</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-namespace-ve-koenig-aramasi-fonksiyon-cozumlemesinin-gorunmeyen-kurallari/"><![CDATA[<p>C++’ta bir fonksiyon çağrısının hangi bildirime bağlanacağı her zaman kodda gördüğümüz isimle sınırlı değildir. <code class="language-plaintext highlighter-rouge">foo(x)</code> gibi masum bir çağrı; normal isim aramasını, ad alanlarını, aşırı yük çözümlemesini ve Koenig araması olarak da bilinen ADL mekanizmasını harekete geçirir. Bu görünmez süreç doğru kullanıldığında genişletilebilir API’ler oluşturur, yanlış anlaşıldığında ise derleyicinin neden “alakasız” bir fonksiyonu seçtiğini düşündüren hatalara yol açar.</p>

<p><img src="/img/c-namespace-ve-35.svg" alt="c-namespace-ve-35" /></p>

<p>``</p>

<h2 id="fonksiyon-çözümlemesinin-iki-perdesi">Fonksiyon çözümlemesinin iki perdesi</h2>

<p>Niteliksiz bir <code class="language-plaintext highlighter-rouge">f(x)</code> çağrısında adaylar temel olarak iki kaynaktan gelir:</p>

<ol>
  <li><strong>Normal niteliksiz isim araması:</strong> Çağrının bulunduğu kapsam, üst kapsamlar ve ilgili <code class="language-plaintext highlighter-rouge">using</code> bildirimleri incelenir.</li>
  <li><strong>Argument-Dependent Lookup (ADL):</strong> Argüman türleriyle ilişkili namespace ve sınıflardaki fonksiyonlar aranır.</li>
</ol>

<p>Bunu kavramsal olarak şöyle gösterebiliriz:</p>

\[Adaylar = Normal\ Arama \cup ADL\]

<p>Ardından overload resolution, uygulanabilir adaylar arasından dönüşümler bakımından en iyi olanı seçer. Yani ADL doğrudan kazananı belirlemez; yarışa yeni fonksiyonlar ekler.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Normal arama</th>
      <th>ADL / Koenig araması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Başlangıç noktası</td>
      <td>Çağrının yazıldığı kapsam</td>
      <td>Argümanların türleri</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">using</code> etkisi</td>
      <td>Adayları görünür yapabilir</td>
      <td>İlişkili namespace esas alınır</td>
    </tr>
    <tr>
      <td>Nitelikli çağrıda çalışır mı?</td>
      <td>Evet</td>
      <td>Genellikle hayır</td>
    </tr>
    <tr>
      <td>Temel amacı</td>
      <td>Sözcüksel isim bulma</td>
      <td>Türle birlikte tanımlanan işlemleri bulma</td>
    </tr>
  </tbody>
</table>

<h2 id="adlnin-sahneye-çıkışı">ADL’nin sahneye çıkışı</h2>

<p>Aşağıdaki fonksiyon çağrı noktasında açıkça içeri alınmamıştır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">namespace</span> <span class="n">grafik</span> <span class="p">{</span>
    <span class="k">struct</span> <span class="nc">Nokta</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">x</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">y</span><span class="p">;</span>
    <span class="p">};</span>

    <span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">const</span> <span class="n">Nokta</span><span class="o">&amp;</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">.</span><span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">", "</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">.</span><span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">grafik</span><span class="o">::</span><span class="n">Nokta</span> <span class="n">n</span><span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">7</span><span class="p">};</span>
    <span class="n">yazdir</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="c1">// ADL, grafik::yazdir fonksiyonunu bulur.</span>
<span class="p">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">Nokta</code>, <code class="language-plaintext highlighter-rouge">grafik</code> namespace’ine ait olduğu için bu namespace çağrıyla ilişkilendirilir. Argüman <code class="language-plaintext highlighter-rouge">int</code> olsaydı kullanıcı tanımlı ilişkili bir namespace bulunmayacağından aynı numara işe yaramazdı.</p>

<p>Çağrıyı <code class="language-plaintext highlighter-rouge">::yazdir(n)</code> biçiminde nitelendirmek ise yalnızca global kapsamdaki ismi istemek anlamına gelir ve ADL katkısını ortadan kaldırır. Bu ayrım, hata ayıklarken oldukça değerlidir.</p>

<h2 id="gizli-arkadaşlar-kontrollü-görünürlük">Gizli arkadaşlar: Kontrollü görünürlük</h2>

<p>ADL’nin en güçlü kullanım alanlarından biri sınıf içinde tanımlanan <code class="language-plaintext highlighter-rouge">friend</code> fonksiyonlardır:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;compare&gt;</span><span class="cp">
</span>
<span class="k">namespace</span> <span class="n">matematik</span> <span class="p">{</span>
    <span class="k">class</span> <span class="nc">Kesir</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">pay</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">payda</span><span class="p">;</span>

    <span class="nl">public:</span>
        <span class="n">Kesir</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="kt">int</span> <span class="n">q</span><span class="p">)</span> <span class="o">:</span> <span class="n">pay</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">payda</span><span class="p">(</span><span class="n">q</span><span class="p">)</span> <span class="p">{}</span>

        <span class="k">friend</span> <span class="kt">bool</span> <span class="k">operator</span><span class="o">==</span><span class="p">(</span><span class="k">const</span> <span class="n">Kesir</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Kesir</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">pay</span> <span class="o">*</span> <span class="n">b</span><span class="p">.</span><span class="n">payda</span> <span class="o">==</span> <span class="n">b</span><span class="p">.</span><span class="n">pay</span> <span class="o">*</span> <span class="n">a</span><span class="p">.</span><span class="n">payda</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">};</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu operatör normal namespace aramasında kolayca görünmez; fakat <code class="language-plaintext highlighter-rouge">Kesir</code> argümanlarıyla yapılan <code class="language-plaintext highlighter-rouge">a == b</code> ifadesinde ADL tarafından bulunur. Böylece namespace yüzeyi gereksiz fonksiyonlarla kirletilmeden türe ait işlem sunulur. Buna <strong>hidden friend idiomu</strong> denir.</p>

<h2 id="swap-kalıbı-neden-önemlidir"><code class="language-plaintext highlighter-rouge">swap</code> kalıbı neden önemlidir?</h2>

<p>Genel kodda yalnızca <code class="language-plaintext highlighter-rouge">std::swap(a, b)</code> yazmak, kullanıcı türünün kendi optimize edilmiş <code class="language-plaintext highlighter-rouge">swap</code> fonksiyonunu engelleyebilir. Geleneksel çözüm şöyledir:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">;</span>
<span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</code></pre></div></div>

<p>İlk satır standart sürümü yedek aday yapar. İkinci satır niteliksiz çağrı olduğu için ADL’ye izin verir. Türün namespace’inde daha uygun bir <code class="language-plaintext highlighter-rouge">swap</code> varsa overload resolution onu seçer; yoksa <code class="language-plaintext highlighter-rouge">std::swap</code> kullanılır.</p>

<table>
  <thead>
    <tr>
      <th>Yazım</th>
      <th style="text-align: right">ADL</th>
      <th>Sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">std::swap(a, b)</code></td>
      <td style="text-align: right">Hayır</td>
      <td>Yalnızca standart adaylar</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">swap(a, b)</code></td>
      <td style="text-align: right">Evet</td>
      <td>Yerel adaylar ve ADL adayları</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">using std::swap; swap(a, b);</code></td>
      <td style="text-align: right">Evet</td>
      <td>Güvenli geri dönüş ve özelleştirme</td>
    </tr>
  </tbody>
</table>

<h2 id="sürprizlerden-korunma-rehberi">Sürprizlerden korunma rehberi</h2>

<p>Aynı isimli fonksiyonları geniş namespace’lere gelişigüzel yerleştirmek beklenmeyen belirsizlikler oluşturabilir. Özellikle bir çağrının argüman türü değiştiğinde ilişkili namespace kümesi de değişebilir. Şablonlarda bu etki daha belirgindir; bağımlı çağrıların bazı adayları ancak şablon örneklendiğinde belirlenir.</p>

<p>Kütüphane tasarlarken işlemleri ilgili türle aynı namespace’e koymak, global kapsamı kirletmemek ve özelleştirilebilir işlemlerde niteliksiz çağrı kullanmak iyi bir dengedir. Bir çağrının gizemli davrandığı durumlarda ise şu soruyu sorun: “Bu fonksiyon normal aramayla mı geldi, yoksa argümanlardan biri ADL için gizli bir kapı mı açtı?”</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c++" /><category term="namespace" /><category term="adl" /><category term="koenig araması" /><category term="fonksiyon çözümleme" /><summary type="html"><![CDATA[C++’ta bir fonksiyon çağrısının hangi bildirime bağlanacağı her zaman kodda gördüğümüz isimle sınırlı değildir. foo(x) gibi masum bir çağrı; normal isim aramasını, ad alanlarını, aşırı yük çözümlemesini ve Koenig araması olarak da bilinen ADL mekanizmasını harekete geçirir. Bu görünmez süreç doğru kullanıldığında genişletilebilir API’ler oluşturur, yanlış anlaşıldığında ise derleyicinin neden “alakasız” bir fonksiyonu seçtiğini düşündüren hatalara yol açar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-namespace-ve-35.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-namespace-ve-35.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>