два вопроса
Модератор: Модераторы
два вопроса
С удовольствием использую Free Pascal для научных расчётов, однако не имею достаточного опыта в пограммировании,
поэтому прошу уважаемых форумчан ответить на 2 вопроса.
1. Со школьной скамьи слышу, что использование опрератора goto - дурной тон в программировании. Но никто и никогда
не конкретизировал почему? Может кто-то из программистов знает ответ, чем хуже программа с операторами goto аналогичной
программы без этих опрераторов.
2. С точки зрения экономии оперативной памяти есть ли разница, когда используешь один N-мерный массив или
N одномерных массивов?
Заранее спасибо.
поэтому прошу уважаемых форумчан ответить на 2 вопроса.
1. Со школьной скамьи слышу, что использование опрератора goto - дурной тон в программировании. Но никто и никогда
не конкретизировал почему? Может кто-то из программистов знает ответ, чем хуже программа с операторами goto аналогичной
программы без этих опрераторов.
2. С точки зрения экономии оперативной памяти есть ли разница, когда используешь один N-мерный массив или
N одномерных массивов?
Заранее спасибо.
- Alexander
- энтузиаст
- Сообщения: 864
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
1 Почитай книги Вирта.
В жизни использовать можно, но только когда это единственно удобно.
А в остальных случаях не стоит. Хуже программа не станет, можно даже
выиграть в скорости. А вот структура ухудшится.
2 Настолько незначительная, что можно не учитывать. По крайней
мере для малого числа больших массивов.
Если наврал поправте.
В жизни использовать можно, но только когда это единственно удобно.
А в остальных случаях не стоит. Хуже программа не станет, можно даже
выиграть в скорости. А вот структура ухудшится.
2 Настолько незначительная, что можно не учитывать. По крайней
мере для малого числа больших массивов.
Если наврал поправте.
Чего-то я не понял, как N-мерный массив связан с N одномерных?
N одномерных массивов это
array[0..N-1, M1..M2] of T_MyType // читай, двумерный массив
// а N мерный массив это
array [0..m1-1, 0..m2-1,0..m3-1, {так много раз}, 0..mN-1] of T_MyType.
И еще, в Дельфе, если я не ошибаюсь, где-то была ссылочка, что максимум можно создать семимерный массив. (N=7)
типа,
array [0..1,0..2,0..3,0..4,0..5,0..6,0..7] // работает,
array [0..1,0..2,0..3,0..4,0..5,0..6,0..7,0..8] // уже не работает.
при попытке выполнить процедуру вызывает СтекОверфлоу и выпадает.
В общем, если речь идет о N массивов 0..M или один
[0..N-1, 0..M] то разницы никакой.
Все равно, массив- есть указатель на область памяти, а номер элемента- это смещение относительно начала этого массива.
N массивов- N указателей.
1 массив- те же самые N указателей, только лежащие кучкой.
N одномерных массивов это
array[0..N-1, M1..M2] of T_MyType // читай, двумерный массив
// а N мерный массив это
array [0..m1-1, 0..m2-1,0..m3-1, {так много раз}, 0..mN-1] of T_MyType.
И еще, в Дельфе, если я не ошибаюсь, где-то была ссылочка, что максимум можно создать семимерный массив. (N=7)
типа,
array [0..1,0..2,0..3,0..4,0..5,0..6,0..7] // работает,
array [0..1,0..2,0..3,0..4,0..5,0..6,0..7,0..8] // уже не работает.
при попытке выполнить процедуру вызывает СтекОверфлоу и выпадает.
В общем, если речь идет о N массивов 0..M или один
[0..N-1, 0..M] то разницы никакой.
Все равно, массив- есть указатель на область памяти, а номер элемента- это смещение относительно начала этого массива.
N массивов- N указателей.
1 массив- те же самые N указателей, только лежащие кучкой.
cro096 писал(а):В общем, если речь идет о N массивов 0..M1 или один
[0..N-1, 0..M2] то разницы никакой.
Все равно, массив- есть указатель на область памяти, а номер элемента- это смещение относительно начала этого массива.
N массивов- N указателей.
1 массив- те же самые N указателей, только лежащие кучкой.
Согласен, однако, на практике, по крайней мере при работе с Фортраном, если используешь большие М, то в первом случае удаётся использовать М1 больше чем M2. Т.е N одномерных массивов позволяют использовать больше элементов, чем один N-мерный массив.
- Alexander
- энтузиаст
- Сообщения: 864
- Зарегистрирован: 18.12.2005 18:10:00
- Откуда: оттуда
- Контактная информация:
В ФП есть ещё и динамические массивы.
И каждый элемент имеет произвольную, изменяемую
динамически размерность. А количество элементов в одном, наверное,
2^32 или 2^31. Много в общем. Никакой памяти не хватит.
Код: Выделить всё
{$LONGSTRINGS ON}
var
a : array of array of array of array of array of array of array of array of array of array of array of array of string;
begin
end.И каждый элемент имеет произвольную, изменяемую
динамически размерность. А количество элементов в одном, наверное,
2^32 или 2^31. Много в общем. Никакой памяти не хватит.
Как всё таки, на счёт меток...
Вопрос конкретизирую: влияет ли большое (опять вопрос на сколько большое) наличие операторов goto на CPU time.
P.S. нет времени самому экспериментальным путём проверить, может кто нибудь уже имеет опыт - проверял.
Вопрос конкретизирую: влияет ли большое (опять вопрос на сколько большое) наличие операторов goto на CPU time.
P.S. нет времени самому экспериментальным путём проверить, может кто нибудь уже имеет опыт - проверял.
- shade
- энтузиаст
- Сообщения: 879
- Зарегистрирован: 21.02.2006 19:15:48
- Откуда: http://shamangrad.net/
- Контактная информация:
Как всё таки, на счёт меток...
Вопрос конкретизирую: влияет ли большое (опять вопрос на сколько большое) наличие операторов goto на CPU time.
P.S. нет времени самому экспериментальным путём проверить, может кто нибудь уже имеет опыт - проверял.
На CPU-time, если и влияет, то не значительно (а насчет направления у меня есть сомнения, как и насчет использования ассемблерных вставок - см. ниже).
А вот на МОЗГИ-time влияет значительно, поэтому в целях повышения вашей (а не программы) производительности, лутше переходить на структурное программирование.
А если у вас проблемы со скоростью работы программы, то:
Есть три уровня оптимизации:
1. Высокий уровень - поиск принициально нового алгоритма.
2. Средний уровень - оптимизация алгоритма (учет особенностей компилятора, платформы...) - имеет смысл если скорость немного не устраивает, иначе см. п.1.
3. Низкий уровень - ассемблер: этот уровень лутше возложить на компилятор - в большинстве случаев хороший оптимизирующий компилятор сделает это быстре и лутше вас - исключение использование возхможностей CPU, не поддерживаемых компилятором (н-р MMX, SSE и т.д и т.п.)
