Menu
Coddy logo textTech

Stack İlklendirme

Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 14 / 61.

Her nesnenin heap üzerinde bulunması gerekmez. Bir struct küçük olduğunda ve kısa bir ömre sahip olduğunda, onu stack üzerinde tahsis etmek daha basit ve daha hızlıdır—malloc yok, free yok, bellek sızıntısı riski yok.

Bir işaretçi döndürmek yerine, bir fabrika fonksiyonu yapıyı değer ile döndürebilir. Yapının tamamı çağırana kopyalanır:

typedef struct {
    int x;
    int y;
} Point;

Point create_point(int x, int y) {
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

Çağıran, tam olarak başlatılmış bir kopya alır:

Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);

İşaretçi yok, temizlik gerekmez. origin ve cursor kapsam dışına çıktığında, otomatik olarak yok edilirler.

Bu yaklaşım, dinamik olarak ayrılmış üyelere sahip olmayan küçük struct'lar için en iyi sonucu verir. Daha büyük nesneler veya heap belleğine işaretçiler içerenler için, malloc ile oluşturulan yapıcı (constructor) deseni daha iyi bir seçim olmaya devam eder.

challenge icon

Görev

Kolay

Bir fabrika fonksiyonu kullanarak yığında (stack) sıcaklık ölçümleri oluşturan bir Temperature modülü oluşturalım. Önceki derslerdeki yığın (heap) tabanlı kurucuların aksine, bu yaklaşım yapıyı değer olarak döndürür; malloc yok, free yok, sadece basit ve verimli yığın tahsisi.

Üç dosya oluşturacaksınız:

  • temperature.h: İki üyeli bir Temperature yapısı (struct) bildirin: double celsius ve char scale (Santigrat için 'C' saklamak üzere). Ayrıca iki fonksiyon bildirin:
    • create_temperature — bir double değer alır ve bir Temperature yapısını değer olarak döndürür (işaretçi değil!)
    • temperature_to_fahrenheit — bir const Temperature * alır ve eşdeğer sıcaklığı Fahrenheit cinsinden double olarak döndürür
    TEMPERATURE_H sembolü ile include guard kullanın.
  • temperature.c: Her iki fonksiyonu da uygulayın. Fabrika fonksiyonunuz yerel bir Temperature değişkeni oluşturmalı, alanlarını başlatmalı (scale değerini 'C' olarak ayarlamalı) ve onu döndürmelidir. Dönüşüm formülü şöyledir: fahrenheit = celsius * 9.0 / 5.0 + 32.0
  • main.c: Bir sıcaklık ölçümü oluşturmak için fabrika fonksiyonunuzu kullanın ve hem Celsius hem de Fahrenheit değerlerini görüntüleyin.

Bir girdi alacaksınız: Celsius cinsinden sıcaklık (double olarak).

Ana dosyanızda, verilen değerle bir Temperature yapısı oluşturmak için create_temperature kullanın. Ardından orijinal Celsius değerini ve Fahrenheit karşılığını yazdırın.

Çıktıyı şu formatta yazdırın:

Celsius: {celsius}
Fahrenheit: {fahrenheit}

Her iki değer için de iki ondalık basamak görüntülemek üzere %.2f kullanın.

Örneğin, 25.0 girdisi ile çıktı şöyle olacaktır:

Celsius: 25.00
Fahrenheit: 77.00

Bu yaklaşımın ne kadar temiz olduğuna dikkat edin; herhangi bir bellek yönetimi endişesi olmadan tam olarak başlatılmış bir yapı alırsınız. Temperature değişkeniniz kapsam dışına çıktığında, otomatik olarak temizlenir.

Kopya kağıdı

Fabrika fonksiyonları, struct'ları işaretçiler yerine değerine göre döndürebilir. Bu, struct'ı yığında (stack) tahsis eder; malloc yok, free yok ve bellek sızıntısı yok.

Değerine göre döndüren bir fabrika fonksiyonu örneği:

typedef struct {
    int x;
    int y;
} Point;

Point create_point(int x, int y) {
    Point p;
    p.x = x;
    p.y = y;
    return p;
}

Fabrika fonksiyonunun kullanımı:

Point origin = create_point(0, 0);
Point cursor = create_point(100, 50);
printf("Cursor: (%d, %d)\n", cursor.x, cursor.y);

Struct, çağıran tarafa kopyalanır ve kapsam dışına çıktığında otomatik olarak yok edilir. Bu yaklaşım, dinamik olarak tahsis edilmiş üyeleri olmayan küçük struct'lar için en iyi sonucu verir.

Kendin dene

#include <stdio.h>
#include "temperature.h"

int main() {
    double celsius_input;
    scanf("%lf", &celsius_input);
    
    // TODO: Bir Temperature struct'ı oluşturmak için create_temperature kullanın
    
    // TODO: Celsius değerini %.2f formatını kullanarak yazdırın
    
    // TODO: Fahrenheit değerini dönüştürmek ve yazdırmak için temperature_to_fahrenheit kullanın
    
    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Object Oriented Programming bölümündeki tüm dersler