Özet: Jenerik Dizi
Coddy'nin C Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 53 / 61.
Görev
KolayBir GenericArray kapsayıcısı oluşturalım: void* işaretçilerini kullanarak aynı koleksiyonda tamsayılar ve dizelerden oluşan bir karışımı tutabilen esnek bir veri yapısı.
Kodunuzu üç dosyada organize edeceksiniz:
generic_array.h: Üç üyeye sahipGenericArraystruct'ını Define edin: işaretçileri hold etmek için birvoid**array, mevcut count için birintve kapasite için birint. array oluşturma, elements ekleme, index'e göre elements alma ve array'i serbest bırakma function prototiplerini Declare edin.generic_array.c: Kapsayıcınızın işlevselliğini Implement edin:create_array: verilen başlangıç kapasitesine sahip bir GenericArray allocate eder ve count değerini 0 olarak başlatıradd_element: bir sonraki kullanılabilir yuvaya birvoid*işaretçisi kaydeder ve count değerini artırır (kapasitenin yeterli olduğunu varsayın)get_element: belirtilen index konumundakivoid*değerini döndürürfree_array: items array'ini ve GenericArray struct'ının kendisini serbest bırakır
main.c: Hem tamsayıları hem de dizeleri depolayarak generic array'inizi gösterin. Eklenecek elements sayısını okuyun; ardından her element için bir type indicator (itamsayı,sdize için) ve sonrasında değeri okuyun. Tüm elements eklendikten sonra array boyunca Iterate edin ve her değeri yazdırın. Tamsayılar için sayıyı doğrudan yazdırın. Dizeler için metni doğrudan yazdırın.
Programınız şunları alacaktır:
- Eklenecek elements sayısı
- Her element için: bir type indicator (
iveyas) ve ardından değer
Tamsayılar eklerken int için bellek allocate edin ve işaretçiyi kaydedin. Dizeler eklerken bellek allocate edin ve dizeyi copy edin. Geri alırken yazdırmak için uygun türe Cast edin.
Important: Yazdırma sırasında türleri takip etmek için main içinde basit bir paralel type indicator array'i kullanabilir veya type indicator karakterini her element ile birlikte depolayabilirsiniz.
Girdilerin 3, ardından i 42, s Hello, i 100 olduğu durumdaki örnek çıktı:
42
Hello
100Girdilerin 4, ardından s World, s Generic, i -5, s Arrays olduğu durumdaki örnek çıktı:
World
Generic
-5
ArraysHeader dosyanızda include guard kullanmayı unutmayın. Kapsayıcının kendisinin hangi türleri depoladığını bilmesi gerekmez. Yalnızca void* işaretçilerini tutar. Türü bilme sorumluluğu, elements ekleyen ve alan koda aittir.
Kendin dene
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: n kapasiteli bir GenericArray oluştur
// TODO: Türleri takip etmek için paralel bir dizi oluştur (n boyutunda char dizisi)
// TODO: Her eleman için:
// - Tür göstergesini oku (i veya s)
// - Değeri oku
// - Eğer tamsayıysa: int için bellek ayır, değeri sakla, diziye ekle
// - Eğer string ise: string için bellek ayır, değeri kopyala, diziye ekle
// - Tür göstergesini paralel dizine kaydet
// TODO: Diziyi dolaş ve her elemanı yazdır
// - Paralel dizinden türü kontrol et
// - void* değerini uygun türe geri cast et ve yazdır
// TODO: Ayrılan tüm belleği serbest bırak (tamsayılar, string'ler ve dizi)
return 0;
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu7Fonksiyon İşaretçileri
Fonksiyon İşaretçilerini TanımlamaFonksiyon İşaretçilerini ÇağırmaFonksiyon İşaretçileri için TypedefFonksiyonları Argüman Olarak GeçirmeÖzet: Hesap Makinesi Yönlendirme10Jenerik Kapsayıcılar
Void İşaretçiler ÖzetiJenerik SarmalayıcıJenerik Yer DeğiştirmeJenerik KarşılaştırmaÖzet: Jenerik Dizi2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil HiyerarşisiKendi başına pratik yap: Online C derleyicisi