Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
WaRLoCK_UA
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 20
#1

Скажите в чем ошибся! - C++

09.10.2008, 20:50. Просмотров 837. Ответов 7
Метки нет (Все метки)

Друзья, спасайте, не могу понять в чем здесь у меня ошибка!
Вроде синткасически все написано правильно, логически... ну не уверен...
Выскакивает ошибка на этапе выполнения! Если у когото ошибка на этапе компиляции то измените в свойствах проэкта кодировку с Юникода на любую другую...
Код
//Программа осуществляет добавление/удаление строки или столбца в любое место двумерной матрицы по выбору пользователя.

#include <time.h>
#include <iostream>
#include <windows.h>
using namespace std;

void print(char* src);
void InitArray(int** mas,int size_y,int size_x);
void PrintArray(int** mas,int size_y,int size_x);
void DeleteString(int**& mas,int& size_y,int size_x);

void main()
{
	system("color f0");
	srand(time(0));
	int size_y; print("Введите \"высоту\" двухмерного массива: "); cin>>size_y;
	int size_x; print("Введите \"ширину\" двухмерного массива: "); cin>>size_x;
	system("CLS");
	int** mas=new int*[size_y];
	for(int i=0;i<size_y;i++)
		mas[i]=new int[size_x];
	InitArray(mas,size_y,size_x);
	PrintArray(mas,size_y,size_x);
	DeleteString(mas,size_y,size_x);
	PrintArray(mas,size_y,size_x);
}

void print(char* src)
{
	char dst[256];
	CharToOem(src,dst);
	cout<<dst;
}
void InitArray(int** mas,int size_y,int size_x)
{
	for(int i=0;i<size_y;i++)
		for(int j=0;j<size_x;j++)
			mas[i][j]=rand()%10;
}
void PrintArray(int** mas,int size_y,int size_x)
{
	cout<<' '<<' '<<' ';
	for(int i=0;i<size_x;i++)
		cout<<i+1<<' ';
	cout<<'\n'<<'\n';
	for(int i=0;i<size_y;i++)
	{
		cout<<i+1<<' '<<' ';
		for(int j=0;j<size_x;j++)
			cout<<mas[i][j]<<' ';
		cout<<'\n';
	}
	cout<<'\n';
}
void DeleteString(int**& mas,int& size_y,int size_x)
{
	print("Какую строку будем удалять?"); int key; cin>>key;
	for(;key<1||key>size_y;){print("Такой строки нет! Смотри номерацию! "); cin>>key;}
	int** tmp=new int*[size_y-1];
	for(int i=0,j=0;i<size_y-1;i++,j++)
	{
		if(j==key-1)
			j++;
		else
			tmp[i]=mas[j];
	}
	delete[]mas[key-1];
	delete[]mas;
	mas=tmp;
	size_y--;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2008, 20:50     Скажите в чем ошибся!
Посмотрите здесь:

Скажите в чем разница?? (Ассемблеровские вставки C++) - C++
здравствуйте! написал программу на C++ с помощью ассемблеровских вставок: &quot;Подсчитать, сколько раз в данной строке встречается буква...

Скажите пожалуста чем отличается массив целого числа от массива строк? - C++
чем отличается массив целого числа от МАССИВа строк?

Не правильно складываеться в масив. ТОлько не пишите ответ кодом ,а скажите в чем там ошибка - C++
//--------------------------------------------------------------------------- #include &lt;vcl.h&gt; #pragma hdrstop #include&lt;conio.h&gt; ...

Скажите в чем разница между Visual C++ и обычным C++, и с какого следует начать, если я знаю только Паскаль - C++
Скажите в чем разница между Visual C++ и обычным C++, и с какого следует начать, если я знаю только Паскаль

в чём я ошибся - C++
// ConsoleApplication12.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include&lt;conio.h&gt; ...

Ошибся в цикле for - C++
Я хотел что бы программа выдала все числа от 0 до 9 включительно с шагом 0.1, программа не выдаёт ошибки но шаг делает всё равно 1. Где я...

Где я ошибся? - C++
#include &lt;iostream&gt; using namespace std; int sumdigits(int x) void main () { int x; cout&lt;&lt;&quot;Enter a number&quot;&lt;&lt;endl; cin&gt;&gt;x; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Linux forever!
3 / 3 / 0
Регистрация: 08.10.2008
Сообщений: 37
09.10.2008, 21:22     Скажите в чем ошибся! #2
Слово "двумерного" пишется без буквы Х, слово "нумерация" пишется через букву У.

В функции DeleteString
mas=tmp;
size_y--;
не имеет смысла. После окончания выполения функции новые значения не сохранятся. Чтобы добиться требуемого эффекта, нужно mas и size_y описать не в main(), а в глобальном уровне, а имена параметров функции DeleteString переименовать, чтобы они не совпадали с именами переменных в глобальном уровне (если имена будут совпадать, то изменяться будут параметры функции, а не глобальные переменные).

И наконец, у тебя происходит ненужное тебе преобразование типов. Получается что попало. В функции DeleteString типы первых двух параметров не совпадают с типами передаваемых значений при вызове. Эта ошибка исправляется удалением двух амперсандов ('&') из прототипа и определения функции.

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

Если остались вопросы, задавай.
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
09.10.2008, 21:39     Скажите в чем ошибся! #3
Цитата Сообщение от Linux forever! Посмотреть сообщение
size_y--;
не имеет смысла. После окончания выполения функции новые значения не сохранятся. Чтобы добиться требуемого эффекта, нужно mas и size_y описать не в main(), а в глобальном уровне, а имена параметров функции DeleteString переименовать, чтобы они не совпадали с именами переменных в глобальном уровне (если имена будут совпадать, то изменяться будут параметры функции, а не глобальные переменные).
Начнем с того,что.... код будет иметь эффект,поскольку передана ссылка на объект. См. прототип. Закончим тем,что использование глобальных переменных - худшее решение из всех возможных.

Добавлено через 11 минут 41 секунду
WaRLoCK_UA,ошибка в цикле,в ф-ии удаления
Код
for(int i=0,j=0;i<size_y-1;i++,j++)
    {
        if(j==key-1)
            j++;
        else // <---- Вот ошибка! закомментируй else и будет работать.
            tmp[i]=mas[j];
    }
Думаю,объяснять,почему она вылетает - не нужно.Просто приглядись)
WaRLoCK_UA
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 20
09.10.2008, 21:43  [ТС]     Скажите в чем ошибся! #4
Примечание: Я сейчас в Linux, мне неудобно компилировать такой код (он зачем-то специально использует НЕкроссплатформенные функции, хотя вполне можно было заменить их кроссплатформенными, чтобы программа компилировалась в любой системе).
Я пока еще только учусь и много не знаю, так что...

WaRLoCK_UA,ошибка в цикле,в ф-ии удаления
Спасибо, дошло что не так...))
Linux forever!
3 / 3 / 0
Регистрация: 08.10.2008
Сообщений: 37
09.10.2008, 21:46     Скажите в чем ошибся! #5
В прототипе-то передаётся ссылка, а реально при вызове передаются не ссылки. Эти значения распознаются как ссылки и происходят непредвиденные операции. Чтобы исправить, нужно при вызове DeleteString тогда добавить два &.
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
09.10.2008, 21:58     Скажите в чем ошибся! #6
Linux forever!, ссылки - синтаксическая конструкция. если в прототипе указана ссылка - компилятор передает адрес переменной,которая будет указана при вызове.Более того,если ты попытаешься указать адрес при вызове - получишь синтаксическую ошибку.

В качестве бонуса приведу пример.

Код
#include <stdio.h>
int f(int & a ) {
    a++;
    return a;
};
int main() {
    int a=2;
    f(a);
    for(int j=0;j<10;j++) {
        printf("%d ",f(a));
        printf("%d \n",a);
    }
    return 0; 
};
и дизассемблер интересующего кода
Код
       f(a); вызов f(a)
0040107F   lea         eax,[ebp-4]
00401082   push        eax
00401083   call        @ILT+5(f) (0040100a)
00401088   add         esp,4
Код
3:        a++; (в функции f (int & a) )
00401038   mov         eax,dword ptr [ebp+8]
0040103B   mov         ecx,dword ptr [eax]
0040103D   add         ecx,1
00401040   mov         edx,dword ptr [ebp+8]
00401043   mov         dword ptr [edx],ecx
Linux forever!
3 / 3 / 0
Регистрация: 08.10.2008
Сообщений: 37
09.10.2008, 22:24     Скажите в чем ошибся! #7
Спасибо. Я был неправ.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.10.2008, 16:12     Скажите в чем ошибся!
Еще ссылки по теме:

Где я ошибся? - C++
Подскажите почему в этом куске кода у меня A не сравнивается с 0.02257, а просто выводится какое есть for ( i=0; i&lt;10; i++){ ...

Где я ошибся? - C++
Доброго времени суток, подскажите, где я ошибся, компилятор выдает ошибку: In function 'void M5(int*, int*, int, int, float, float)': ...

Подскажите, где ошибся - C++
Получаю следующий результат на нижеуказанный код: Enter two integers: 13 5 integer part of the quotient is 10 integer remainder...

Подправить программу, где-то ошибся) - C++
Не выводит седловые точки #include&lt;conio.h&gt; #include&lt;stdio.h&gt; void main(void) { int i,j, a, imin, imax,m,n,max,min,f; ...

не могу понять где я ошибся - C++
вот задание: Вычислить и вывести на экран в виде таблицы значение функции, заданной с помощью ряда Тейлора, на ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
WaRLoCK_UA
0 / 0 / 0
Регистрация: 09.10.2008
Сообщений: 20
10.10.2008, 16:12  [ТС]     Скажите в чем ошибся! #8
Спасибо всем за помощь, я закончил кому интересно - вот результат:
Код
//Программа осуществляет добавление/удаление строки или столбца в любое место двумерной матрицы по выбору пользователя.

#include <time.h>
#include <iostream>
#include <windows.h>
using namespace std;

void print(char* src);
void InitArray(int** mas,int size_y,int size_x);
void PrintArray(int** mas,int size_y,int size_x);
void DeleteString(int**& mas,int& size_y,int& size_x);
void AddString(int**& mas,int& size_y,int& size_x);
void DeleteColumn(int**& mas,int& size_y,int& size_x);
void AddColumn(int**& mas,int& size_y,int& size_x);

void main()
{
	system("color f0");
	srand(time(0)); int key;
	void (*function[4])(int**&,int&,int&)={DeleteString,AddString,DeleteColumn,AddColumn};
	int size_y; print("Введите \"высоту\" двумерного массива: "); cin>>size_y;
	int size_x; print("Введите \"ширину\" двумерного массива: "); cin>>size_x;
	system("CLS");
	int** mas=new int*[size_y];
	for(int i=0;i<size_y;i++)
		mas[i]=new int[size_x];
	InitArray(mas,size_y,size_x);
	do
	{
		system("CLS");
		PrintArray(mas,size_y,size_x);
		cout<<'\n'<<'\n';
		print("Что делать будем?\n\n");
		print("1. Удалить строку  2. Добавить строку  3. Удалить столбец  4. Добавить столбец\n");
		cin>>key; for(;key<1||key>4;){print("Здесь всего 4 варианта! 1-й, 2-ой, 3-ий и 4-й! "); cin>>key;}
		function[key-1](mas,size_y,size_x);
		cout<<'\n'<<'\n';
		PrintArray(mas,size_y,size_x);
		print("Наберите \"0\"-(ноль) чтобы выйти из программы или любую другую ЦИФРУ чтоб выйти!\n "); cin>>key;
	}while(key!=0);
}

void print(char* src)
{
	char dst[256];
	CharToOem(src,dst);
	cout<<dst;
}
void InitArray(int** mas,int size_y,int size_x)
{
	for(int i=0;i<size_y;i++)
		for(int j=0;j<size_x;j++)
			mas[i][j]=rand()%10;
}
void PrintArray(int** mas,int size_y,int size_x)
{
	cout<<' '<<' '<<' ';
	for(int i=0;i<size_x;i++)
		cout<<i+1<<' ';
	cout<<'\n'<<'\n';
	for(int i=0;i<size_y;i++)
	{
		cout<<i+1<<' '<<' ';
		for(int j=0;j<size_x;j++)
			cout<<mas[i][j]<<' ';
		cout<<'\n';
	}
	cout<<'\n';
}
void DeleteString(int**& mas,int& size_y,int& size_x)
{
	print("Какую строку будем удалять?"); int key; cin>>key;
	for(;key<1||key>size_y;){print("Такой строки нет! Смотри нумерацию! "); cin>>key;}
	int** tmp=new int*[size_y-1];
	for(int i=0,j=0;i<size_y-1;i++,j++)
	{
		if(j==key-1)
			j++;
		tmp[i]=mas[j];
	}
	delete[]mas[key-1];
	delete[]mas;
	mas=tmp;
	size_y--;
}
void AddString(int**& mas,int& size_y,int& size_x)
{
	print("После какой строки добавить еще одну? "); int key; cin>>key;
	for(;key<1||key>size_y;){print("Такой строки нет! Смотри нумерацию! "); cin>>key;}
	int** tmp=new int*[size_y+1];
	for(int i=0,j=0;i<size_y+1;i++,j++)
	{
		if(j==key-1)
		{
			tmp[i]=mas[j];
			i++;
			tmp[i]=new int[size_x];
			for(int k=0;k<size_x;k++)
				tmp[i][k]=0;
		}
		else
			tmp[i]=mas[j];
	}
	delete[]mas;
	mas=tmp;
	size_y++;
}
void DeleteColumn(int**& mas,int& size_y,int& size_x)
{
	print("Какой столбец будем удалять? "); int key; cin>>key;
	for(;key<1||key>size_x;){print("Такого столбца нет! Смотри нумерацию! "); cin>>key;}
	int** tmp=new int*[size_y];
	for(int i=0;i<size_y;i++)
	{
		tmp[i]=new int[size_x-1];
		for(int j=0,k=0;j<size_x-1;j++,k++)
		{
			if(k==key-1)
				k++;
			tmp[i][j]=mas[i][k];
		}
		delete[]mas[i];
	}
	delete[]mas;
	mas=tmp;
	size_x--;
}
void AddColumn(int**& mas,int& size_y,int& size_x)
{
	print("После какого столбца добавить еще один? "); int key; cin>>key;
	for(;key<1||key>size_x;){print("Такого столбца нет! Смотри нумерацию! "); cin>>key;}
	int** tmp=new int*[size_y];
	for(int i=0;i<size_y;i++)
	{
		tmp[i]=new int[size_x+1];
		for(int j=0,k=0;j<size_x;j++,k++)
		{
			if(k==key-1)
			{
				tmp[i][j]=mas[i][k];
				j++;
				tmp[i][j]=0;
			}
			else
				tmp[i][j]=mas[i][k];
			tmp[i][size_x]=mas[i][size_x-1];
		}
		delete[]mas[i];
	}
	delete[]mas;
	mas=tmp;
	size_x++;
}
Еще раз спасибо за помощь!
Yandex
Объявления
10.10.2008, 16:12     Скажите в чем ошибся!
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru