Bir diziden bir eleman nasıl kaldırılır (tek boyutlu iki boyutlu)? - sayfa 7

 
Ilya Malev :


Görev: diziden bir öğeyi kaldırın.

 
Алексей Тарабанов :

Görev: diziden bir öğeyi kaldırın.

Tek boyutlu veya iki boyutlu. Her iki seçenek için de aynı kodu yazmayacağınız için problemlerin farklı cevapları var. Daha doğrusu, kodu yapabilir ve yapacaksınız, ancak dizideki boyutların sayısını önceden bilmeden onu çağıramazsınız. Programcı olmadığınız için, sözlerinize bakılırsa, bunu inançla almayı öneriyorum.

 
Dmitry Fedoseev :
Dizilerin burada 4'ten fazla boyutu yoktur. Yani 4 farklı fonksiyon yazabilirsiniz, hepsi bu.

Ve 8 boyutlu yığın zayıf mı?

 
Ilya Malev :

Soruna bu şekilde yaklaşırsanız, çok boyutlu dizilerin hiçbir şekilde bildirilmesi gerekmez - bunun yerine farklı alanlara sahip yapı dizileri kullanmanız gerekir. Ancak soru farklı bir şekilde ortaya konmuştur - belirli bir veri olarak zaten mevcut olan bir dizi keyfi (önceden bilinmeyen) boyutla ne yapabiliriz?

Sonra bir çıkmaza girdiniz :( . Çok işlevli seçeneğin beğenilmeyen yanı nedir?
 
Aliaksandr Hryshyn :
Çok işlevli seçeneğin beğenilmeyen yanı nedir?

Parametre dizisinin her farklı boyutu için farklı adlara sahip işlevlerde aynı kodu (bahsettiğiniz kodu) çoğaltmanız gerektiği gerçeği

 
Dmitry Fedoseev :
Dizilerin burada 4'ten fazla boyutu yoktur. Yani 4 farklı fonksiyon yazabilirsiniz, hepsi bu.

Sorun 4 fonksiyon yazmak değil, ancak o zaman diğer türlerde olduğu gibi herhangi bir dizinin birini kullanması işe yaramaz. Bu nedenle, µl'de çok boyutlu diziler (yerleşik tip []) kullanmadan yapmak daha iyidir.

 
Алексей Тарабанов :

Ve 8 boyutlu yığın zayıf mı?

Kolayca yapılar aracılığıyla.

 
Bu arada, derleme aşamasında mevcut olan typename size sadece boyutların sayısını değil, aynı zamanda parametrenin bir dizi olduğu gerçeğini de söyleyecektir. bunu sizeof==52 ile anlayabilmenize rağmen. ama yine, bu boyutların sayısı hakkında hiçbir şey söylemeyecek. bu yüzden #define ile uygun bir çözüm için herhangi bir seçenek görmüyorum. Dizilerin farklı boyutlarını iletebileceğiniz ArrayCopy ve ArrayResize gibi yalnızca yerleşik çağrıları kullanan tüm işlev kodları, define içine doldurulamıyorsa
 
Dmitry Fedoseev :

Eh, ve aşırı yükleme kaydetmez:

Bu şekilde mi derleniyor?

 void z( int & z[], int shift){}; 
void z( int size_second_dimension, int & z[][], int shift){};
Tam olarak hatırlamasam da , ikinci ve sonraki boyutlar dinamik olamaz gibi görünüyor. Buna göre, bu tür kodlar derlenirken hatalar olabilir. Burada size_second_dimension değişkeni, ikinci boyutun verilen boyutu olarak kullanılabilir ve işlevin aşırı yüklenmesine izin verir. Ayrıca, ArrayRange () kullanarak boyutu belirleme ihtiyacını ortadan kaldıracaktır.
 
Alexey Viktorov :

Bu şekilde mi derleniyor?

Tam olarak hatırlamasam da , ikinci ve sonraki boyutlar dinamik olamaz gibi görünüyor. Buna göre, bu tür kodlar derlenirken hatalar olabilir. Burada size_second_dimension değişkeni, ikinci boyutun verilen boyutu olarak kullanılabilir ve işlevin aşırı yüklenmesine izin verir. Ayrıca, ArrayRange () kullanarak boyutu belirleme ihtiyacını ortadan kaldıracaktır.

Derlenecek, ancak çok ilginç değil, peki ya z[][][]?

İkinci ve daha yüksek boyutlar dinamik olamaz, ancak işlevin ikinci boyutun belirli boyutuna uyarlanması gerekmez, bunu ArrayRange() aracılığıyla bulabilirsiniz.

Boyut sayısı işlevin aşırı yüklenmesine izin vermiyorsa, ikincisinin boyutu vb. kesinlikle buna izin vermeyecektir. Evet ve bu yüzden tamamen ilginç değil, çünkü hiç de evrensel değil. Farklı fonksiyon isimleri ile yazmak daha kolaydır.