Dialog - diyaloglar için bir programlama dili

ArticleCategory

Software Development

AuthorImage

Philipp Gühring

TranslationInfo

original in en Philipp Gühring

en to tr Elif Büşra Güraksın

AboutTheAuthor

Philipp EDP dalındaki yüksek teknik okulu yeni bitirdi. Futu reware 2001 adlı yazılım geliştirme grubu için artık yeteri kadar zamanı olacak.

Abstract

Dialog bir programlama dili olup kullanıcıyla diyalog ortamı sağlar. Bu çalışma Würstelstand ticari-simülasyonda kullanıldı. Bu makale Dialog'un gelişimini ve uygulamalarını açıklamaktadır.

ArticleIllustration

Josi, one of the customers

ArticleBody:

Giriş

Würstelstand, oyuncunun bir hotdog stand yaptığı ve müşterilerle irtibatın neredeyse bir macera oyununa dönüştüğü bir Almanca ticari simülasyondur. Tam olarak bu müşteri irtibatı için aşağıdaki ihtiyaçlara cevap verebilecek bir diyalog dili geliştirdim. Sıra telefon konuşmalarını yazmaya geldiğinde diyalog motorunu yeniden kullandım ve onu geliştirdim. Oyuncu çoktan seçmeli bir sistemle Leni karakterini kontrol etmektedir. Müşteriler bilgisayar tarafından simüle edilmektedir. Oyuncunun amacı müşterilere tavsiyelerde bulunmak, onlara birşeyler satmak ve onlarla konuşmaktır. Müşteriler acıktıklarında görünmekteler ve bu şekilde devam etmektedir. Ayrıca, oyuncu kendine özgü hareket edebilmekte ve telefonundaki birçok numarayı arayabilmektedir.

Dialog dili

Diyaloglar Ascii dosyaları olarak saklanmakta ve herhangi bir zamanda daha ileriki satırlara geçişin de mümkün olacağı şekilde satır satır yorumlanmaktadır. Diyalogları basit bir text editörüyle oluşturduk. Dosyanın ismi İsim.BAT (örneğin: HALE.BAT) şeklindedir. Oyuncu (Leni) bişey söylediğinde:
Leni: Text
Leni: Gunaydin!
          Size ne verebilirim?
Leni: Su cocuklara bakin!
          Inanilmaz!
Leni konuşuyor
Su cocuklara bakin! Inanilmaz!
Yataktan mi dustunuz?
Müşteri konuşuyor
Ekmekli iki Frankfurter ve kola. Hadi! Acele et, yasli adam!
Müşteri birşeyler söylediğinde: (Kunde Almancada müşteri demek, Telefon telefon demek)
Kunde: Text
Kunde: Ekmekli iki Frankfurter ve kola. 
               Hadi! Acele et, yasli adam!
Telefon: Futureware 2001, Philipp Gühring.
               Sizin icin ne yapabilirim?

Her normal diyalog şununla biter:

Ende
(Ende Almancada son demek)

Basit bir örnek:
Leni: Gunaydin! Ne istersiniz?
Kunde: İyi gunler! Bir Käsekrainer lutfen!
Leni: Bir saniye.
Leni: İste geldi.
Kunde: Cok tesekkurler. Hoscakalin!
Leni: Hoscakalin!
Ende

Atlanacak hedefler satırın başındaki iki nokta üstüste (:) işaretiyle tanımlanır ve devamında atlanacak hedefin ismi gelir. Hedeflere Sprung komutuyla atlayabilirsiniz (Sprung Almancada atlamak demek):

:Hedef
//Atlama ornegi:
Sprung Hedef

Örnek
...
Leni: 1
//Once bunu yapariz
SPRUNG MENU_0
//Geri donecegim!
...
//Bu komutlar calistirilmaz!
Leni: 2
:MENU_0
//Geldim!
Leni: 3
Yorumlayıcı bu örnekte ne yapmakta? Önce Leni: komutunu buluyor ve 1 tekstini veriyor. Bir sonraki satırda dikkate alınmayacak bir yorum bulunmakta (Once bunu yapariz). Bir sonraki satırda Sprung komutu bulunmakta. Yorumlayıcı bütün diyaloğu tarayarak MENU_0 hedefini arar, birkaç satır aşağıda bulur ve oraya atlar. Sonra tekrar bir yorum bulunmakta (Geldim!). Ve son komut ekrana 3 yazan Leni: komutudur. Yani, yorumlayıcı, örnekte Leni: 2 komutunu geçti ve Leni, 2'yi söylemedi.

Gördüğümüz gibi, bir satır:

;(noktalı virgül), //(çift slash), (boşluk), *(asterisk) ile başlayan yorumlar diyaloğun anlaşılmasını ve dokümantasyonunu kolaylaştırmakta ve yorumlayıcı tarafından yok sayılmaktadır. Örneğin:
// Bu bir yorumdur.
**************************************
*Bu sekilde birisi de yorum yapabilir*
**************************************
Yorumlar komutlarla aynı satırda olmamalıdır:
Leni: Artık birsey anlamiyorum.  // YORUM YOK
Yorumlayıcı Artık birsey anlamiyorum. // YORUM YOK metnini output yapılacak metin olarak algılar!

Çoktan Seçmeli Sistem

Çoktan Seçmeli
  • Ne is yapiyorsunuz?
  • Würstelstand'i sever misiniz?
  • Size ne verebilirim?
Dialog şu sistemi icat etmektedir: Sistemde girişlerin yerleştirildiği ve kullanıcının cevaplama olasılıklarından oluşan bir liste bulunmaktadır. Zamanı geldiğinde, menü ekranda gösterilir. Bu durumda kullanıcı bir seçim yapar ve yorumlayıcı, programın seçilen girişi içeren kısmına atlar.

Öncelikle NEU ve ALT komutlarıyla girişleri listeye eklersiniz. Her iki komuttan sonra gidilecek hedef ve giriş metni vardır. Metin çok uzun bir satır olursa sistem satırı otomatik olarak böler. MENÜ komutuyla listenin tamamı görüntülenir ve kullanıcı bir giriş seçebilir.



Şimdi üç tip seçenek var:

İçerikten bağımsız konular

Bu tip tartışma konularında kullanılabilir:
Neu satinalma, Her zamanki 
gibi sicak olsun, tamam mi?
Neu is,Isler nasil gidiyor?
Neu dil,WIFI'deki dil kursuna devam 
ediyor musun?
Neu aile,Ailen nasil?
Neu hava,Havadan memnun musun?
Menü
Bu tiple, oyuncunun sırayla bütün girişlerle oynaması mümkün olmaktadır. Seçenekler tekrar kullanılabilir. Seçilmemiş girişler listede kalır ve daha sonraki bir aşamada seçilebilirler. Şimdi yukarıdaki örnekten is'i seçelim:
:is
Leni: Isler nasil gidiyor?
Kunde: Cok yogun, her zamanki gibi.
Menü
Belirtildiği gibi seçilen satır söner. Aşağıdaki konular listede kalır: Diğer iki tip seçenek:

Opsiyonlar, İçeriğe bağlı konuşma

Kunde: Kac tane istersiniz?
Alt biraz, 10 Tane
Alt fazla, 20 Tane
Alt enfazla, 100 Tane
Menü

:biraz
//Kullanıcı 10 tane seçerse 

:fazla
...

:enfazla
...
Örneğin kullanıcı 20 tane seçerse, yorumlayıcı fazla hedefine atlar:
:fazla
Kunde: Emin misiniz?
Leni: Evet, 20 tane istiyorum.
Kunde: Ne zamana lazim?
Alt 1, Yarin
Alt 2, Yarindan sonraki gun
Alt 3, Birazdan
Menü
Son olarak iki tip birleştirilebilir:

İçerik, Konunun değişmesi

Bu arada başka bir ayrıntıyı farkettik: Birisi partneriyle konuşmasını yapmış olsa ve hala söyleyecek birşeyleri olsa bunu belirtir veya konuyu değiştirir. Birisi konuyu değiştirirse içerik geçersiz olur. Bu sebeple birisi bir konuya devam edebilir veya başka bir konuya atlayabilir. Bunu, Dialog'da şu şekilde tamamladık: Söz, konular içerecek şekilde listeye normal bir opsiyon olarak yerleştirilir. Kullanıcının seçtiğinin yanındaki bütün opsiyonlar sönerler, seçilmemiş konular kalır.
Kunde: Gecmisteki guzel gunleri hatirla.
Alt Hafiza,Evet, şimdi hatırladım da...
MENÜ

Uygulama

Belki de bütün bu farklı kavramları nasıl pratiğe döktüğümüzü merak ediyorsunuzdur. Asıl farkın NEU veya ALT'ın kullanımında yatmakta olduğunu muhtemelen farketmişsinizdir. Eğer birisi listeye NEU komutunu kullanarak konu eklerse, seçilmediği takdirde listede kalır. Diğer taraftan, birisi ALT komutunu kullanarak listeye bir seçenek eklerse, seçilip seçilmediğine bakılmaksızın otomatik olarak silinir.

Birkaç liste

Örneğin birisi bir konuyu konuşurken bir seçim yapması gerekirse, fakat menüdeki diğer konuları göstermek istemiyorsa ne olur? Bu amaçla bir değil üç tane liste geliştirdim:

Liste 0 opsiyonlar için önerilir. Liste 1 genel konular için, örneğin aile, iş, boş vakit, yemek, ... Eğer birisi iş hakkında konuşmak isterse ve iş konusu içinde başka konular varsa liste 2 seçilir. Hale'in diyaloğunda bir örneğimiz var. Eğer yukarıdaki üç listeden daha fazla listeye ihtiyaç duyulursa, yorumlayıcının kaynak kodundaki sabitin değiştirilmesi gerekir.

Farklı listeler nasıl kullanılmalı?

Başlangıçta liste 1 geçerli listedir. LISTE komutuyla başka bir liste geçerli liste yapılabilir.
LISTE 0
LISTE 1
LISTE 2
Bu işlemde bütün listelerin bütün girişleri kendi listelerinde kalmaktadır. NEU, ALT, MENÜ, LÖSCHEN gibi komutlar her zaman geçerli liste ile bağlantı kurar.

Dialog'un eski sürümü

Dialog'un Würstelstand için kullanılan eski sürümünde, seçme sistemi ufak bir farkla çalışıyordu: ALT komutu yerine, NEU komutuna virgülden sonra bir paragraf ekledik:
Neu Hafiza,§Yeah, şimdi hatırladım da...
Liste 0 otomatik olarak silinen menüden sonraydı. Bu yüzden sadece seçenekler için kullanışlıydı; konular için değil.

Şimdi, oldukça fazla liste kullandığımız HALE.BAT ve PETER.BAT örneklerine göz atmayı öneririm.

LÖSCHEN hedef
hedef i gösteren geçerli listedeki her girişi siler. Örneğin:
LÖSCHEN aile
Geçerli listedeki bütün girişleri silmek için asterisk eklenir:
LÖSCHEN *

Menü asıl listedeki bütün girişleri gösterir ve kullanıcıya bunların içinden seçmesini sağlar. Bundan sonra seçilen giriş ve ALT komutuyla eklenen bütün seçenekler silinir. Son olarak yorumlayıcı buna göre hedefe atlar. Listede tek bir girişin olması durumunda, bu girişin seçim olduğu anlaşılır ve bu sebeple çoktan seçmeli bir menu gösterilmez. Eğer listede giriş yoksa veya hedef bulunamıyorsa, yorumlayıcı MENÜ den sonra bir sonraki satırla devam eder.

Arayüzler

Dialog kendi ortamıyla nasıl etkileşebilmektedir, ortamını nasıl etkiler ve diğer diyaloglarla nasıl data değişimi yapar?

Hafıza/Kayıtlar

Würstelstand'da, her diyalog 256 kayıt kullanabilir. Bu kayıtların herbiri -2 milyarla +2 milyar arasında değişen bir sayı barındırır. 256 tane kayıt 3 bölüme ayrılır:

Sistem kayıtları

İlk 100 kayıt (0'dan 99'a kadar) sistem tarafından saklanır: Bunlar, diyalog başlamadan önce değerleriyle birlikte yüklenirler ve bu şekilde diyalog ortamında etkileşir. //S ile işaretlenen bütün kayıtlar diyaloğun bitmesinden sonra analiz edilir ve kullanılır. Bu, diyaloğun etkisidir. Würstelstand'ın sistem kayıtlarının listesi:
1Event;  //olay numarası (texte.h ye bak)
2geliefert;//S //0-10 kaç tane onluk teslim edilecek
3wtag;  //haftanın günü
4tag;  //ayın günü
5monat;  //ay
6jahr;  //yıl
7Datum;  //seri günü (1.1.1997 = 0)
8wetter;  //bugünün havası
9konto;//S //banka hesabı
10kapital;//S //nakit
11ausgaben;//S //bugünün harcamaları
12einnahmen;//S //bugünün gelirleri
13sterne;//S //hot-dog stand'in kalitesi (0-5 yıldız)
14wverkauf;  //bu hafta satılan ürün sayısı
15weinnahmen;  //haftalık gelir
16wausgaben;  //haftalık harcama
170;//S //yeni gelir/masraf (diyalog sonucunda)
18Nachrichtenserie;  //hangi haber serisi(0=Elch,1=...)
19Nachricht;  //geçerli serideki hangi haber(0=1.Tag,1=2...)
20LottoNr[0];  //kaç tane piyango numarası kullanıldı(0-6)
21LottoErgebnis[0];  //kaç tane piyango numarası doğruydu
22LottoGewinn[LottoErgebnis[0]];  //Leni ne kadar kazandı
23S.Image;//S //Leni'nin resmi
24S.Override;//S //Umursamama-Olay
25S.wverkauf[1];  //geçen hafta satılan ürünler
26S.weinnahmen[1];  //geçen haftanın geliri
27S.wausgaben[1];  //geçen haftanın masrafları
28S.wverkauf[2];  //iki hafta önce satılan ürünler
29S.weinnahmen[2];  //iki hafta önceki gelir
30S.wausgaben[2];  //iki hafta önceki masraf
31S.NOverride;//S //yarının önemsenmeyecek olayı
32S.wetter_bericht;  //hangi hava tahmini
33Gesamtwert();  //hot-dog stand'in toplam değeri
34Wetterbericht[S.wetter_bericht].Ereignis;  //hangi hava olayı
35Tageszeit;  //dakika olarak gün zamanı
70..79Lagermenge  //stoklar
80..89Verkaufspreis//S //ürün fiyatı
90..99Kaufmenge//S //sipariş miktarı

Dialog kayıtları

Sonraki 100 kayıt (100'den 199'a) herbir diyalog için özeldir. Oyunun başında sıfıra ayarlanırlar ve diyalog için bütün oyun boyunca süreklidirler. savegames,..., de saklanırlar ve sadece kendi diyaloglarıyla erişilebilirler. Sistem ve diğer bütün diyaloglar kayıtları okuyamaz/değiştiremezler. Birisi, diyaloğun başlangıcında birinin hangi diyalog kayıtlarını neden kullanmak istediğini belgelemelidir.

batch.cpp
// Musteri: Peter Hinzing 
// 
// Kayitlarin kullanimi
//[100] Ne siklikla buradaydi 
//[101] Cep harcligi
//[102] Birkac olay
//[103] Random sayi: siparis
//[104] Random sayi: siparise cevap
//[105] Farkli diyaloglar: 5nci gunde is
//[106] Anlasma
//[107] Secildikten sonra oyun basliyor
//[108] Oyun.stake.tip
//[109] Oyun.stake.miktar
//[110] Oyun.sec.Peter
//[111] Oyun.sec.Leni
//[112] Hobby aktivasyonu
//[113] Home aktivasyonu
//[114] Würstelstand hakkinda diyalog 
//[115] toplam stok kola
//[116] cok fazla?*************************
//* henuz yapilmadi
Kayıt [100] de Peter hotdog standını ne sıklıkla ziyaret ettiğini hatırlıyor. İlk ziyaretinde kendini tanıtıyor. 10uncu ziyaretinde dinleniyor ve resmi değil. [101] de kendi cep harçlığını, ...

Paylaşılan Hafıza

Son 56 kayıt (daha fazla da olabilirdi, tam sayısı o kadar önemli değil) bütün diyaloglar arasında paylaşılan hafızadır. Bütün diyaloglar bu kayıtlara erişebilir ve bütün diyaloglar aynı hafızayı görür. Bu sebeple bu kayıtların kullanımının düzenlendiği merkezi bir nokta olmalıdır. Aşağıdaki üç kayıt Würstelstand'dan diyaloglar tarafından kullanılmıştır (daten.h de belgeli):
[200]: Leni Hale ile göçmen bürosuna gidebilir
[201]: Leni read the dog's wanted circular
[202]: Leni Peter ile Stein-Schere-Papier oynadı! (kötü!)

Olaylar

Würstelstand için bir Olay sistemi geliştirdik. Her Olay, merkezi bir dosyada koordine edilmesi gereken tek bir numaraya sahiptir. Olaylar aşağıdakileri tetikleyebilir: Bütün bunlar nasıl yapıldı?
Ürünler, müşteriler, telefon konuşmaları ve haber serileri için yapılacak şey olayın numarasını başlama/bitiş değeri olarak uygun gelen dataya yerleştirmektir.

Olayları nasıl tetiklerim?

Aktion ifade
// aktivasyon Cheats:
Aktion 3
// kayıt 100'deki olayın aktivasyonu:
Aktion [100]
Bu Olaylarla ne yapabilirsiniz? Aşağıda Würstelstand'ın Olay listesinin bir kısmı gösterilmiştir:
0Error/Never Olay 0 yakalanıyor ve bırakılıyor
1Initialising başlangıçta tetiklenir ve birçok ürünü, müşteriyi,... aktive eder
2End oyunun sonunda tetiklenir
3activating FW-Cheat Bunu kim kodladı?!?
4deactivating FW-Cheat Bu sırrı sakla!
5Leni.competition.activating newspaper Leni'nin resmi oldukça iyi-> yaklaşan yarışmayla ilgili gazete makalesinin aktivasyonu
6Leni.competition.Zeitung->TelefonNr Gazete makalesi içeriğe dahil etmek üzere telefon numarasını aktive ediyor
7Leni.competition.deactivating TelNr Telefon açtıktan ve herşeyi sınıflandırdıktan sonra telefon numarası deaktive ediliyor
8deactivating Hale Hale kendisini deaktive ediyor çünkü Leni onu gücendirdi.
9Hale recommends Josi Hale onunla ilgili konuşur konuşmaz Josi'yi active ediyor (Küçük konuşma önemli!)
10deactivating Josi Josi kendisini deaktive ediyor
11deactivating Peter Peter kendisini deaktive ediyor
12Sepp Nachricht without Leni aktivieren Sepp yasal olmayan üretim öneriyor, Leni kabul etmiyor, bütün herşey açıkta ve gözler önünde oluyor.
13Sepp Nachricht with Leni aktivieren Leni yasal olmayan üretimi kabul ediyor, problemler takip ediyor
14lost game Postacı Gottfried oyunun sonunu başlatıyor
15won game Gottfried hot-dog stand'in değerinin farkına varıyor ve Leni kazanıyor
16Hale.news article Asyl activate Leni Hale'e ailesinden söz ediyor, iltica ile ilgili gazete makalesi başlatılıyor.
17Hale.news article->Telefonnr activate Gazete, şimdi kullanılabilecek telefon numarasını gösteriyor
18Hale->Zeitungsbericht->Telefonnr deactivating Konuşma telefon numarasını deaktive ediyor
19Hale->Familie activating Hale'in ailesi iltica hakkı alıyor
20activating the spy Leni bir dedektif tavsiye edebilirdi fakat bu hiç pratiğe geçmiyor.
33New products 1 (New supplier) Bu olay ürün yelpazesini genişletiyor
100won contest Leni yarışmayı kazanıyor, müşteriler bunun hakkında konuşabilir, ...
101losts contest
102Lotteryprice Leni piyangoyu kazanıyor

Görüldüğü gibi olaylar, oyunun mantığını kurmada çok güçlü araçlardır.

Hesaplamalar

Rechne (Rechne Almancada hesaplamak demek) komutuyla matematiksel ifadeleri hesaplayabilir ve bir kayıtta tutabilirsiniz; örneğin:
Rechne [100]: 20 + [30] * 10
Kayıt 30'un içeriği, 10 ile çarpılıp, 20 ekleniyor ve kayıt 100'de saklanıyor.

Aşağıdaki matematiksel işlemler yapılabilir:
İşlem Notasyon Örnek Çözüm
Klammern(a)(10+20)*30900
Register[a][20] Kayıt 20'deki içerik
Multiplicationa*b3*412
Divisiona/b10/52
Resta%b10%31
Additiona+b1+12
Subtractiona-b1-10
Zuweisung[a]:b[10]:20Schreibt in Stelle 10 den Wert 20
Vergleichea?bJa(1) oder Nein(0)
Ist gleicha=b10=20Nein(0)
Kleinera<b10<20Ja(1)
Größera>b[10]>[20]
ANDa&b1=1 & 2=2Wenn 1 gleich 1 ist UND 2 gleich 2 ist
ORa|b1=1 | 2=2Wenn 1 gleich 1 ist ODER 2 gleich 2 ist
Random numbera Z b1 Z 6 1 ve 6 arasında bir sayı seçiyor

Karşılaştırmalar sayılarla sonuçlanır: DOĞRU için 1, YANLIŞ için 0. Bunlar ayrıca kayıtta da yazılabilir. İfadeler arasında boşluklar bırakılabilir ( 10 + 20 ), fakat gerekli değildir (10+10).

En büyük gelişme, şimdi aşağıdaki türden işlemleri yapabilen matematiksel değerlendiricinin gelişimiydi:

Kabul: [100]=5, [24]=14, 1Z6=2

[[100]+1]:((1Z6)*([24]>3)+10/2-10%5)
[5    +1]:((2  )*(14  >3)+10/2-10%5)
[6      ]:(2    *(1        )+5   -0   )
[6      ]:(2    *1          +5        )
[6      ]:(7                          )
[6      ]:7
Çözüm: [6]:7 7 değeri kayıt 6'ya yazılıyor.

Kayıtlarla etkileşim

Wenn komutuyla (Wenn Almancada eğer demek):
Wenn condition
then
karşılaştırmalar yapılabilir; örneğin:
Wenn [100+1]>10
Kunde: Kayıt 101'deki sayı 10'dan büyüktür !
Wenn 1>1
Kunde: ERROR!
Eğer koşul doğruysa, yorumlayıcı bir sonraki satıra devam eder yoksa bir satır atlar. Eğer koşul yanlışsa bir sonraki satır atlanır. Bu atlamalarla birlikte kullanılabilir:
Wenn [102]<10
Sprung DAHA KUCUK
Wenn [102]=10
Sprung ESIT
Wenn [102]>10
Sprung DAHA BUYUK
...
:DAHA KUCUK
...
:ESIT
...
:DAHA BUYUK

Resimleri görüntüleme

BILD expression
(Bild Almancada resim demek) Örneğin HALE.BAT dosyasında;
Bild 5
geçiyor, HALE5.DAT (özel bir resim formatı) gösteriliyor. Bunun için bir click beklenir ve diyalog devam eder.

Komut referansı

Daha iyi bir görüş kazanmak için:
// comment: KOMUT REFERANSI

Kunde: text Müşteri birşey söylüyor
Tel: text Partneri birşey söylüyor
Leni: text Leni birşeyler söylüyor
:target Yorumlayıcının atlayabileceği Hedef
Liste number Geçerli listeyi yapıyor
Löschen * Geçerli listedeki bütün girişleri siliyor
Löschen target Geçerli listedeki, hedefi gösteren bütün girişleri siliyor
Aktion number Olayları tetikliyor
Ende Diyaloğu bitiriyor
Bild number Resmi dosya ismiyle birlikte gösteriyor NameNumber.dat
Sprung target Hedefe atlıyor
Neu target,Text Geçerli listeye yeni konu ekliyor
Alt target,Text Geçerli listeye yeni seçim ekliyor
Menü Menüyü gösterip kullanıcının seçim yapmasını sağlıyor
Wenn condition Karşılaştırma (sonraki satırlara bak)
//then Doğruysa, yorumlayıcı bir sonraki satıra geçiyor
//else Yanlışsa, yorumlayıcı bir satır atlıyor
Rechne expression İfadeleri bir kayıt içine hesaplıyor
Bild expression Resimleri gösteriyor, click bekliyor

Çoktan seçmeli sistemlerin dezavantajları

Dialog Maker

Markus Muntaneau, diyalog geliştirmenin daha kolay olacağı Dialog-Maker adında bir Delphi programı geliştirdi. Fakat program hala tamamlanmadı ve bu yüzden çok da yararlı değil. Buna rağmen yazılımcılara göz atmaları tavsiye edilmektedir.

Programlamadaki incelikler

Bütün Würstelstand projesi yaklaşık 10.000 satırlık C(++) kodundan oluştuğundan ve derleme zamanları hala kabuledilir olduğundan, açık bir modülarizasyon yapmadan (tembellik işte) bunun yerine Test-Include sistemini geliştirdim: Modül kodu kendi kendine çalışabilen ve modüllerin routin lerine aynı zamanda bir test programı gönderen bir .c dosyasına entegre ediliyor. Bu da eğer ana modülde mevcutsa #ifdef tarafından deaktive ediliyor. Bu şekilde header dosyaları saklanıyor ;-)

batch.cpp
#ifndef _DIALOG_H 
#define _DIALOG_H 
 
#ifndef MAIN_MODULE
  #define DIALOG_TEXT 
  #define DEBUG 
  //Gerekli Header dosyalari
  #include <stdio.h>
  //... 
#endif 
 
//butun diyalog routinleri
//..
S2 Dialog(char *Filename, TYP Array[])
{
  //...
}

#ifndef MAIN_MODULE
 //Test programlari icin hersey
TYP Feld[256]; 
int main(short argc,char *argv[]) 
{ 
  //Test programi
  Dialog(Filename,Feld);
} 
#endif
wurst.cpp
#define MAIN_MODULE
#include "batch.cpp"
TYP Felder[10][256];
int main(short argc,char *argv[]) 
{ 
  Dialog(Filename,Felder[i]);
}

Değerlendirmeler

Würstelstand simülasyonunun linux versiyonu Futureware da bulunabilir (http://poboxes.com/futureware). Dialog'un 1.1 versiyonu buradan (dialog-1.1.tar.gz) indirilebilir.
Büyük bir istek olursa (yazara e-mail ler göndererek), Dialog'un pratik örnekleriyle ilgili makaleler devam edecektir.