[Test] Struct + Array Birlikte Kullanım Senaryosu #103

Open
opened 2026-06-14 22:26:28 +03:00 by saqut · 0 comments
Owner

Giriş (Nedir, Neden Önemli?)

struct ve int[] dil kimliğinde "var" olarak işaretli ama bu ikisinin birlikte kullanıldığı (struct içinde array, array of struct) bir örnek henüz yazılmadı. Bu kombinasyon, value-semantics (değer semantiği) kopyalama davranışını (bkz. #79 "Array ve Struct'ların Runtime Bellek Düzeni") en çok zorlayan senaryodur.


Test Kodu (examples/tests/struct_array.sqt)

struct Ogrenci {
    string ad;
    int notlar[3];
}

int toplaNotlar(Ogrenci o) {
    int toplam = 0;
    for (int i = 0; i < 3; i = i + 1) {
        toplam = toplam + o.notlar[i];
    }
    return toplam;
}

int main() {
    Ogrenci ali;
    ali.ad = "Ali";
    ali.notlar[0] = 70;
    ali.notlar[1] = 85;
    ali.notlar[2] = 90;

    print(ali.ad);
    print(toplaNotlar(ali));

    // value semantics: kopya degisse de orijinal degismemeli
    Ogrenci kopya = ali;
    kopya.notlar[0] = 0;
    print(toplaNotlar(ali));    // değişmemeli: 245
    print(toplaNotlar(kopya));  // değişmeli: 175

    return 0;
}

Beklenen Çıktı

Ali
245
245
175

Açık Sorular / Bağlı Fazlar

  • int notlar[3]; sözdizimi (struct alanı olarak sabit-boyutlu array) — parser bunu destekliyor mu, yoksa int[3] notlar; mı olmalı? Dil kimliğinde array sözdizimi int[] olarak yazılmış ama boyutlu hali ([3]) henüz örneklenmemiş — bu issue, sözdizimini netleştirme ihtiyacını da gösterir.
  • Ogrenci kopya = ali; satırının gerçekten derin kopya yapması (struct içindeki array dahil) — bu, #79'daki "struct kopyalama IR'de alan-alan mı genişler" sorusunun somut test vakasıdır. Eğer kopya.notlar[0] = 0; satırı ali.notlar[0]'ı da değiştirirse (yüzeysel kopya/shallow copy), bu value semantics kuralının ihlalidir — kritik bir bug.

İmza/Yorum: Bu test, "value semantics" kilitli kararının (dil kimliği tablosu) en sıkı sınandığı yer — diğer tüm testler geçse bile bu test başarısızsa, dilin temel garantisi bozulmuş demektir.

### Giriş (Nedir, Neden Önemli?) `struct` ve `int[]` dil kimliğinde "var" olarak işaretli ama bu ikisinin **birlikte** kullanıldığı (struct içinde array, array of struct) bir örnek henüz yazılmadı. Bu kombinasyon, value-semantics (değer semantiği) kopyalama davranışını (bkz. #79 "Array ve Struct'ların Runtime Bellek Düzeni") en çok zorlayan senaryodur. --- ### Test Kodu (`examples/tests/struct_array.sqt`) ```c struct Ogrenci { string ad; int notlar[3]; } int toplaNotlar(Ogrenci o) { int toplam = 0; for (int i = 0; i < 3; i = i + 1) { toplam = toplam + o.notlar[i]; } return toplam; } int main() { Ogrenci ali; ali.ad = "Ali"; ali.notlar[0] = 70; ali.notlar[1] = 85; ali.notlar[2] = 90; print(ali.ad); print(toplaNotlar(ali)); // value semantics: kopya degisse de orijinal degismemeli Ogrenci kopya = ali; kopya.notlar[0] = 0; print(toplaNotlar(ali)); // değişmemeli: 245 print(toplaNotlar(kopya)); // değişmeli: 175 return 0; } ``` ### Beklenen Çıktı ``` Ali 245 245 175 ``` --- ### Açık Sorular / Bağlı Fazlar - `int notlar[3];` sözdizimi (struct alanı olarak sabit-boyutlu array) — parser bunu destekliyor mu, yoksa `int[3] notlar;` mı olmalı? Dil kimliğinde array sözdizimi `int[]` olarak yazılmış ama boyutlu hali (`[3]`) henüz örneklenmemiş — bu issue, sözdizimini netleştirme ihtiyacını da gösterir. - `Ogrenci kopya = ali;` satırının **gerçekten derin kopya** yapması (struct içindeki array dahil) — bu, #79'daki "struct kopyalama IR'de alan-alan mı genişler" sorusunun **somut test vakasıdır**. Eğer `kopya.notlar[0] = 0;` satırı `ali.notlar[0]`'ı da değiştirirse (yüzeysel kopya/shallow copy), bu **value semantics kuralının ihlalidir** — kritik bir bug. *İmza/Yorum:* Bu test, "value semantics" kilitli kararının (dil kimliği tablosu) en sıkı sınandığı yer — diğer tüm testler geçse bile bu test başarısızsa, dilin temel garantisi bozulmuş demektir.
saqut added the
test-senaryosu
label 2026-06-14 22:26:28 +03:00
Sign in to join this conversation.
No description provided.