Saya sedikit pemula ketika datang ke ADA, dan saya mencoba mendeklarasikan dan menggunakan serangkaian string dengan panjang yang berbeda.

Menggunakan Ada'83 Saya dapat mendeklarasikan array konstanta string panjang variabel sebagai berikut (contoh diambil dari ADA FAQ)

type table is access String;

 TESTS : constant array (Positive range 1..3) of table
         := ( 1 => new String'("One"),
              2 => new String'("Two"),
              3 => new String'("Three")
            );

Betapapun frustrasi saya meskipun hasilnya tampaknya merupakan array array karakter yang tidak mereka lakukan sebagai string. Ketika saya mencoba untuk mengkompilasi kode berikut, saya mendapatkan pesan kesalahan 'Inkonsistensi terdeteksi selama resolusi kelebihan beban [LRM 8.7]'

for COUNT in TESTS'Range loop
   Put(TESTS(COUNT));
   New_Line;
end loop;

Namun, saya dapat mencetak konten dari masing-masing 'string' menggunakan kode berikut.

for COUNT in TEST'Range loop
   for COUNTER in TEST(COUNT)'Range loop
      Put(TEST(COUNT)(COUNTER));
   end loop;
   New_Line;
end loop;

Sayangnya saya ingin menggunakan nilai untuk menguji beberapa kode yang mengambil string sebagai parameter, jadi ini tidak benar-benar membantu ...

Apakah ada cara untuk beralih pada array konstanta string dengan panjang bervariasi di Ada'83, atau untuk mengubah array karakter menjadi string dengan panjang yang bervariasi.

Terima kasih

Tidak, ini bukan pekerjaan rumah, dan ya, saya tahu saya menggunakan kompiler kuno!

2
Mike T. 5 April 2021, 03:43

1 menjawab

Jawaban Terbaik

Test tidak terdefinisi; Saya akan menganggap Anda berarti Tests.

Table bukan tipe string; Ini adalah tipe akses. Untuk merujuk nilai yang ditunjuk dengan nilai akses, satu menggunakan .all:

Tests (Tests'First).all

Adalah string. Ada mengandung beberapa pintasan untuk jenis akses ke array untuk membuatnya lebih mudah digunakan, memungkinkan .all untuk ditinggalkan sebelum atribut dan pengindeksan, itulah sebabnya Tests (Count)'Range bekerja. Untuk referensi seluruh nilai, .all diperlukan:

Text_IO.Put_Line (Item => Tests (Counter).all);

Namun, pendekatan yang lebih baik adalah menentukan abstraksi string panjang variabel dan menggunakannya alih-alih jenis akses.

6
Jeffrey R. Carter 5 April 2021, 05:31