Özet: Jenerik Dizi
Coddy'nin C Journey'sinin Object Oriented Programming 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ı koleksiyon içinde tam sayılar ve dizelerin bir karışımını tutabilen esnek bir veri yapısı.
Kodunuzu üç dosya halinde düzenleyeceksiniz:
generic_array.h: Üç üyeliGenericArrayyapısını (struct) tanımlayın: işaretçileri tutmak için birvoid**dizisi, mevcut sayı için birintve kapasite için birint. Diziyi oluşturma, eleman ekleme, dizine göre eleman alma ve diziyi serbest bırakma işlevleri için fonksiyon prototiplerini bildirin.generic_array.c: Kapsayıcınızın işlevselliğini uygulayın:create_array— verilen bir başlangıç kapasitesiyle bir GenericArray tahsis eder ve count değerini 0 olarak başlatıradd_element— bir sonraki boş yuvaya birvoid*işaretçisi depolar ve count değerini artırır (kapasitenin yeterli olduğunu varsayın)get_element— belirtilen dizindekivoid*değerini döndürürfree_array— items dizisini ve GenericArray yapısının kendisini serbest bırakır
main.c: Hem tam sayıları hem de dizeleri depolayarak genel dizinizi gösterin. Eklenecek eleman sayısını okuyun, ardından her eleman için bir tür göstergesi (tam sayı içini, dize içins) ve ardından değeri okuyun. Tüm elemanları ekledikten sonra, dizi boyunca ilerleyin ve her değeri yazdırın. Tam sayı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 eleman sayısı
- Her eleman için: bir tür göstergesi (
iveyas) ve ardından değer
Tam sayı eklerken, int için bellek tahsis edin ve işaretçiyi saklayın. Dize eklerken, bellek tahsis edin ve dizeyi kopyalayın. Geri alırken, yazdırmak için uygun türe geri dönüştürün (cast).
Önemli: Yazdırma için türleri takip etmek amacıyla, main içinde basit bir paralel tür göstergeleri dizisi kullanabilir veya her elemanın yanında tür göstergesi karakterini saklayabilirsiniz.
Girdiler 3, ardından i 42, s Hello, i 100 olduğunda örnek çıktı:
42
Hello
100Girdiler 4, ardından s World, s Generic, i -5, s Arrays olduğunda örnek çıktı:
World
Generic
-5
ArraysBaşlık dosyanızda include guard kullanmayı unutmayın. Kapsayıcının kendisinin hangi türleri sakladığını bilmesine gerek yoktur — sadece void* işaretçilerini tutar. Türü bilme sorumluluğu, elemanları ekleyen ve geri 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şturun
// TODO: Türleri takip etmek için paralel bir dizi oluşturun (n boyutunda char dizisi)
// TODO: Her bir eleman için:
// - Tür göstergesini okuyun (i veya s)
// - Değeri okuyun
// - Eğer tamsayıysa: int için bellek ayırın, değeri saklayın, diziye ekleyin
// - Eğer dizgi (string) ise: string için bellek ayırın, değeri kopyalayın, diziye ekleyin
// - Tür göstergesini paralel dizinizde saklayın
// TODO: Dizi üzerinde döngü kurun ve her bir elemanı yazdırın
// - Türü paralel dizinizden kontrol edin
// - void* türünü uygun türe geri dönüştürün (cast) ve yazdırın
// TODO: Ayrılan tüm belleği serbest bırakın (tamsayılar, dizgiler ve dizi)
return 0;
}
Object Oriented Programming 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şisi