powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему программа работает неправильно?
10 сообщений из 10, страница 1 из 1
Почему программа работает неправильно?
    #38582199
nick95nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо было написать программу, которая меняет местами указанные строки в массиве размером 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.
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;

int Func(int * Array, int Dim1, int Dim2)

{
	for (int j = 0; j < 3; j++)
	{
		int b = Array[Dim1][j];
		Array[Dim1][j] = Array[Dim2][j];
		Array[Dim2][j] = b;
	}

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cout << Array[i][j] << " ";
		}
		cout << '\n';
	}

	system("pause");
	return 0;
}
void main()
{
	SetConsoleOutputCP(1251);
	const int Y = 3, X = 4;
	int a[Y][X];
	int a1, a2;
	cout << "Enter the matrix:\n";
	for (int i = 0; i < Y; i++)
	{
		for (int j = 0; j < X; j++)
		{
			cout << "a[" << i << "][" << j << "] = ";
			cin >> a[i][j];
		}
	}
	cout << "Result:\n";

	cout << "Enter number of strings you want to change:";
	cin >> a1;
	cin >> a2;
	Func(*a, a1,a2).
}



Но на выходе программа вместо ожидаемого результата выдает массив тот что на скрине. В чем у меня ошибка?
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582218
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick95nickВ чем у меня ошибка?
Ты индексы перепутал. И кроме того, неправильно их используешь. Закомментируй код обмена и
увидишь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582222
interester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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. :)
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582254
nick95nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видимо я не очень понимаю как работать с указателями(( Получился код, но в нем все еще остается несколько ошибок

Код: 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.
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;

int Func(int * Array, int Dim1, int Dim2,int N,int M)

{
	for (int j = 0; j < 3; j++)
	{
		int b = *(Array + M*Dim1 + j);
		*(Array+M*Dim1+j) = *(Array+N*Dim2+j);
		*(Array+N*Dim2+j) = b;
	}

	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cout << *(Array+M*i+j) << " ";
		}
		cout << '\n';
	}

	system("pause");
	return 0;
}
void main()
{
	SetConsoleOutputCP(1251);
	int X, Y ;
	cout << "Enter size of matrix";
	cin >> X;
	cin >> Y;
	int a[X][Y];
	int a1, a2;
	cout << "Enter the matrix:\n";
	for (int i = 0; i < Y; i++)
	{
		for (int j = 0; j < X; j++)
		{
			cout << "a[" << i << "][" << j << "] = ";
			cin >> *(a + Y*i + j);
		}
	}
	cout << "Result:\n";

	cout << "Enter number of strings you want to change:";
	cin >> a1;
	cin >> a2;
	Func(*a, a1, a2,X,Y);
}



Ошибки такие

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
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582260
interester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 поставить...
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582281
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
От себя добавлю:
1. можно использовать Variable-length_array из С99 ( http://en.wikipedia.org/wiki/Variable-length_array ), но тойгда забыть о С++ (я в примере, кроме cin/cout, от С++ не увидел ни строчки)
2. вспомнив, что мы в С++ (а не С), использовать контейнеры
3. дождаться стандарта С++14 и использовать std::dynarray
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582310
nick95nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, что беспокою еще раз, но что-то все еще не так. Программа больше не выдает ошибок, но ведет себя неадекватно, т.е вместо того чтобы менять строки выводит несуразный набор введенных значений. Я пока не смог понять из-за чего это может быть.

Код: 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.
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <stdio.h>
using namespace std;

int ExchangeRows(int * Array, int N, int M,int Row1,int Row2)

{
	for (int j = 0; j < N; j++)
	{
		int b = *(Array + M*Row1 + j);
		*(Array+M*Row1+j) = *(Array+N*Row2+j);
		*(Array+N*Row2+j) = b;
	}

	for (int i = 0; i < M; i++)
	{
		for (int j = 0; j < N; j++)
		{
			cout << *(Array+M*i+j) << " ";
		}
		cout << '\n';
	}

	system("pause");
	return 0;
}
void main()
{
	SetConsoleOutputCP(1251);
	const int Y = 3, X = 4;
	int a[X][Y];
	int a1, a2;
	cout << "Enter the matrix:\n";
	for (int i = 0; i < Y; i++)
	{
		for (int j = 0; j < X; j++)
		{
			cout << "a[" << i << "][" << j << "] = ";
			cin >> a[i][j];
		}
	}
	cout << "Result:\n";

	cout << "Enter number of strings you want to change:";
	cin >> a1;
	cin >> a2;
	ExchangeRows(*a, X,Y,a1,a2);
}
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582330
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
interester,

Вы же делаете так:
int X, Y ;
cout << "Enter size of matrix";
cin >> X;
cin >> Y;
int a[X][Y];
Ваше желание понятно! Но компилятору непонятно :) сколько байт резервировать для массива, ведь при компиляции переменные Х и У еще ничему не равны.


Кстати, в последнем C это допустимая конструкция. Не знаю, правда, пронесли ли эту фичу в стандарт C++.
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582335
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nick95nick,

Индексация для матрицы у тебя неверная.
Думай еще.
Над каждым знаком, тщательно.
...
Рейтинг: 0 / 0
Почему программа работает неправильно?
    #38582555
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Кстати, в последнем C это допустимая конструкция. Не знаю, правда, пронесли ли эту фичу в стандарт C++.

MasterZiv,
есть proposal в стандарт С++14, но в урезанном виде (пока вроде как только для одномерных массивов и с некоторыми ограничениями на тип элемента)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему программа работает неправильно?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]