Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
Необходимо было написать программу, которая меняет местами указанные строки в массиве размером 3х4. Код получился такой Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. Но на выходе программа вместо ожидаемого результата выдает массив тот что на скрине. В чем у меня ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 21:27 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
nick95nickВ чем у меня ошибка? Ты индексы перепутал. И кроме того, неправильно их используешь. Закомментируй код обмена и увидишь. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 22:33 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
nick95nick, посмотрите на объявление вашей функции. Она получает Одномерный массив в первом параметре. А в теле функции Вы пишете Array[][], т.е. обращаетесь к нему как к 2-мерному, что ведет к неопределенному поведению программы. На самом деле идея отличная, поскольку позволяет обрабатывать любые массивы (любой размерности и с любым количеством элементов в строках и столбцах). Но тогда необходимы дполнительные параметры: кол-во строк N и столбцов M. Без них - никак. И нужно понимать, как храниться 2-мерный массив в памяти. Допустим, Ваш массив в памяти выглядит так: a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3]. Т.е. в памяти по адресу Array находится одномерный массив из 3*4=12 элементов, сначала вся нулевая строка, потом - первая и т.д. Array дает адрес первого элемента, N*M - их кол-во, а с помощью M можно найти адрес начала каждой строки. Если внимательно над этим подумаете, то поймете, откуда берется такая формула адресной арифметики: a[i][j]= *(a+M*i+j) А ежели еще подумать, то для решения задачи достаточно 3-х вызовов memcpy. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.03.2014, 22:49 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
Видимо я не очень понимаю как работать с указателями(( Получился код, но в нем все еще остается несколько ошибок Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. Ошибки такие 6 IntelliSense: выражение должно иметь константное значение e:\Users\Коля\Desktop\Program2\Program2\Program2.cpp 36 8 Program2 7 IntelliSense: выражение должно иметь константное значение e:\Users\Коля\Desktop\Program2\Program2\Program2.cpp 36 11 Program2 Ошибка 1 error C2109: для индекса требуется массив или указатель e:\users\коля\desktop\program2\program2\program2.cpp 12 1 Program2 Ошибка 2 error C2109: для индекса требуется массив или указатель e:\users\коля\desktop\program2\program2\program2.cpp 13 1 Program2 Ошибка 3 error C2109: для индекса требуется массив или указатель e:\users\коля\desktop\program2\program2\program2.cpp 14 1 Program2 Ошибка 4 error C2109: для индекса требуется массив или указатель e:\users\коля\desktop\program2\program2\program2.cpp 21 1 Program2 Ошибка 5 error C2059: синтаксическая ошибка: ] e:\users\коля\desktop\program2\program2\program2.cpp 49 1 Program2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 01:17 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
nick95nick, компилятор, когда встречает ОПРЕДЕЛЕНИЕ переменной, выделяет место в памяти для нее. Например, если встретилось long a; то компилятор ВО ВРЕМЯ КОМПИЛЯЦИИ зарезервирует для "а" 4 байта в стеке или сегменте данных. Вы же делаете так: int X, Y ; cout << "Enter size of matrix"; cin >> X; cin >> Y; int a[X][Y]; Ваше желание понятно! Но компилятору непонятно :) сколько байт резервировать для массива, ведь при компиляции переменные Х и У еще ничему не равны. Два варианта: 1) const int X=3, Y=4; и работаем с конкретными размерностями. 2) cin >> X; cin >> Y; выделяем память для массива динамически а= new int[X*Y]; и применяем технику, что описана выше. Рекомендую начать с 1) PS. Желательно все-таки навести порядок с именами. Dim(ension) - размерность, а у Вас- это номер строки для перестановки. При чтении кода шарики за ролики. Может так: void ExchangeRows(int * Array, int N, int M, int row1, int row2). N и M - размеры массива, лучше их поближе к Array поставить... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 02:08 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
От себя добавлю: 1. можно использовать Variable-length_array из С99 ( http://en.wikipedia.org/wiki/Variable-length_array ), но тойгда забыть о С++ (я в примере, кроме cin/cout, от С++ не увидел ни строчки) 2. вспомнив, что мы в С++ (а не С), использовать контейнеры 3. дождаться стандарта С++14 и использовать std::dynarray ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 10:03 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
Извините, что беспокою еще раз, но что-то все еще не так. Программа больше не выдает ошибок, но ведет себя неадекватно, т.е вместо того чтобы менять строки выводит несуразный набор введенных значений. Я пока не смог понять из-за чего это может быть. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 12:06 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
interester, Вы же делаете так: int X, Y ; cout << "Enter size of matrix"; cin >> X; cin >> Y; int a[X][Y]; Ваше желание понятно! Но компилятору непонятно :) сколько байт резервировать для массива, ведь при компиляции переменные Х и У еще ничему не равны. Кстати, в последнем C это допустимая конструкция. Не знаю, правда, пронесли ли эту фичу в стандарт C++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 13:03 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
nick95nick, Индексация для матрицы у тебя неверная. Думай еще. Над каждым знаком, тщательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 13:05 |
|
||
|
Почему программа работает неправильно?
|
|||
|---|---|---|---|
|
#18+
>> Кстати, в последнем C это допустимая конструкция. Не знаю, правда, пронесли ли эту фичу в стандарт C++. MasterZiv, есть proposal в стандарт С++14, но в урезанном виде (пока вроде как только для одномерных массивов и с некоторыми ограничениями на тип элемента) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.03.2014, 21:59 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38582281&tid=2019631]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 133ms |

| 0 / 0 |
