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 yaşaması gerekmez. Bir struct küçük ve ömrü kısaysa, onu stack üzerinde tahsis etmek daha basit ve 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 function'ı struct'ı değer olarak döndürebilir. struct'ı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, tamamen 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, temizleme gerekmiyor. origin ve cursor kapsam dışına çıktığında otomatik olarak yok edilirler.

Bu yaklaşım, dinamik olarak ayrılmış üyeleri olmayan küçük struct'lar için en iyi sonucu verir. Daha büyük nesneler veya heap belleğine pointer içeren nesneler için malloc kullanan kurucu deseni hâlâ daha iyi bir seçimdir.

challenge icon

Görev

Kolay

Bir fabrika işlevi kullanarak yığın üzerinde sıcaklık okumaları oluşturan bir Temperature modülü oluşturalım. Önceki derslerdeki yığın tabanlı oluşturucuların aksine bu yaklaşım, yapıyı değer olarak döndürür: malloc yok, free yok; yalnızca basit ve verimli yığın tahsisi vardır.

Üç dosya oluşturacaksınız:

  • temperature.h: İki üyeye sahip bir Temperature yapısı bildirin: double celsius ve Celsius değerini belirtmek üzere 'C' saklayan char scale. Ayrıca iki işlev bildirin:
    • create_temperature: bir double değer alır ve değer olarak (işaretçi olarak değil!) bir Temperature yapısı döndürür
    • temperature_to_fahrenheit: bir const Temperature * alır ve eşdeğer Fahrenheit sıcaklığını double olarak döndürür
    TEMPERATURE_H sembolüyle include korumaları kullanın.
  • temperature.c: Her iki işlevi de uygulayın. Fabrika işleviniz yerel bir Temperature değişkeni oluşturmalı, alanlarını başlatmalı (scale değerini 'C' olarak ayarlamalı) ve bu değişkeni döndürmelidir. Dönüşüm formülü şöyledir: fahrenheit = celsius * 9.0 / 5.0 + 32.0
  • main.c: Bir sıcaklık okuması oluşturmak ve hem Celsius hem de Fahrenheit değerlerini görüntülemek için fabrika işlevinizi kullanın.

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 bunun Fahrenheit karşılığını yazdırın.

Çıktıyı şu biçimde yazdırın:

Celsius: {celsius}
Fahrenheit: {fahrenheit}

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

Örneğin, 25.0 girdisiyle çıktı şöyle olur:

Celsius: 25.00
Fahrenheit: 77.00

Bu yaklaşımın ne kadar temiz olduğuna dikkat edin. Bellek yönetimiyle ilgili herhangi bir kaygı olmadan tamamen başlatılmış bir yapı elde edersiniz. Temperature değişkeniniz kapsam dışına çıktığında otomatik olarak temizlenir.

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
    
    // TODO: Celsius değerini %.2f formatını kullanarak yazdır
    
    // TODO: Fahrenheit değerini dönüştürüp yazdırmak için temperature_to_fahrenheit kullan
    
    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

Kendi başına pratik yap: Online C derleyicisi