Как удалить элемент из массива (одномерного двумерного)? - страница 7

 
Ilya Malev:


Задача: удалить элемент из массива. 

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

Задача: удалить элемент из массива. 

Одномерного или двумерного. Задачи имеют разный ответ, потому что Вы не сделаете одинаковый код для обоих вариантов. Точнее код может и сделаете, но вызвать его, не зная заранее число измерений в массиве, не сможете. Поскольку Вы не программист, судя по Вашим словам, предлагаю принять это на веру

 
Dmitry Fedoseev:
Больше 4-ех измерений здесь не бывает у массивов. Так что, можно 4-ре разных функции написать и все. 

А 8-мерный сваять слабо? 

 
Ilya Malev:

Если так подходить к задаче, то многомерные массивы вообще объявлять не нужно - вместо них нужно использовать массивы структур с разными полями. Но вопрос ставится иначе - что мы можем сделать с уже имеющимся как данность массивом произвольной (неизвестной заранее) размерности

Тогда вы попали в тупик :( . А чем не нравится вариант с несколькими функциями?
 
Aliaksandr Hryshyn:
чем не нравится вариант с несколькими функциями?

Тем, что придется дублировать одинаковый код (тот самый, о котором Вы говорите), в функциях с разными названиями для каждой отличной размерности массива параметра

 
Dmitry Fedoseev:
Больше 4-ех измерений здесь не бывает у массивов. Так что, можно 4-ре разных функции написать и все. 

Проблема не в том, чтобы написать 4 функции а в том, что потом не получится для любого массива пользоваться одной, как это получается с любыми другими типами. Поэтому лучше обойтись без использования многомерных массивов (встроенного типа []) в мкл вообще 

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

А 8-мерный сваять слабо? 

Через структуры запросто. 

 
кстати, typename, доступный на этапе компиляции, не скажет ни только о числе измерений, но и вообще о том, что параметр является массивом. хотя понять это можно по sizeof==52. но опять же, о числе измерений это ничего не скажет. так что и через #define вариантов удобного решения я не вижу. Разве что весь код функции, использующий только встроенные вызовы типа ArrayCopy и ArrayResize, которым передавать разные размерности массивов можно, запихать в define
 
Dmitry Fedoseev:

Эх, и перегрузка не спасает:

А так скомпилируется?

void z(int & z[],int shift){}; 
void z(int size_second_dimension,int & z[][],int shift){};
Хотя я точно не помню, но кажется второе и следующие измерения не могут быть динамическими. Соответственно при компиляции такого кода могут быть ошибки. Тут переменная size_second_dimension может быть использована как заданный размер второго измерения и даст возможность перегрузки функции. Плюс избавит от необходимости определять размерность посредством ArrayRange()
 
Alexey Viktorov:

А так скомпилируется?

Хотя я точно не помню, но кажется второе и следующие измерения не могут быть динамическими. Соответственно при компиляции такого кода могут быть ошибки. Тут переменная size_second_dimension может быть использована как заданный размер второго измерения и даст возможность перегрузки функции. Плюс избавит от необходимости определять размерность посредством ArrayRange()

Скомпилируется, но так не интересно, и как быть с z[][][]?

Второе и выше измерения не могут быть динамическими, но функции не обязательно быть заточенной под конкретный размер второго измерения, его узнать можно через ArrayRange().

Если уж количество измерений не позволят перегрузить функцию, то уж размер второго и др. точно не позволит. Да и так совсем неинтересно, потому, что совсем не универсально. Проще с разными именами функции написать.