Мне всего 15 лет не судите строго. Недавно начал заниматься програмированием. Есть такой код:
int n;
int* mas_pointer=new int[n];
int sort(int n)
{
int max,i,a,k;
for (k=0;k<=n;k++)
{
for (i=k;i<=n;i++)
{
a=*(mas_pointer+k);
if (*(mas_pointer+k)==a) k=max;
}
}
return max;
}
void main()
{
int i;
scanf ("%d\n",&n);
for (i=1;i<=n;i++)
{
scanf ("%d\&n",*(mas_pointer+i-1));
//printf ("\n%d input done\n",i);
}
printf ("\n\n\t\a%d",sort (n));
delete[] mas_pointer;
Делаю .exe файл (Borland c++ 5.02) при запуске и вводе в массив 3-го числа ,всегда 3-го, вылазиет ошибка: Инструкция по адресу "0x00404cc9" обратилась к памяти по адресу "0x00000000" память не может быть "written" Затем ещё одна ошибка : Исключение unknown software exception (0xc0000027) в приложении по адресу "0x7c80e0b9"
Как собственно от этого избавиться?
p.s. win xp sp2
[skip]
A>for (i=1;i<=n;i++) A>{ A> scanf ("%d\&n",*(mas_pointer+i-1)); A> //printf ("\n%d input done\n",i); A>}
[skip]
в строчке со scanf ты используешь разыменованное значение, т.е. то что содержится по адресу mas_pointer + i — 1, а функция scanf ожидает от тебя адрес. Пиши так:
Спасибо всем ответившим, особенно valker. Но я уже разобрался и всё сделал сам.
p.s. 2Amidlokos такого чему равно n*sizeof(int). Если я правильно понял динамическое выделение памяти.
Здравствуйте, Albedo, Вы писали:
A>Спасибо всем ответившим, особенно valker. Но я уже разобрался и всё сделал сам. A>p.s. 2Amidlokos такого чему равно n*sizeof(int). Если я правильно понял динамическое выделение памяти.
n не проинициализирована.
... << А писал я этот бред на RSDN@Home 1.1.4 stable rev. 510, под звуки The Beatles — A Hard Day`s Night>>
Здравствуйте, Albedo, Вы писали:
A>Спасибо всем ответившим, особенно valker. Но я уже разобрался и всё сделал сам. A>p.s. 2Amidlokos такого чему равно n*sizeof(int). Если я правильно понял динамическое выделение памяти.
Разобрался-то верно, но но в n у тебя будет мусор неизвестного происхождения. Инициализировать же надо.
int n = 10; // Для примераint *arr = new int[n];
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
int* mas_pointer=new int[n];
int sort(int n)
{
int max,i,a,k;
for (k=0;k<=n;k++)
{
for (i=k;i<=n;i++)
{
a=*(mas_pointer+k);
Не забываем, что созданный массив имеет размер n (например, 3), но при этом индексируется он с 0, поэтому элементы будет иметь индексы 0, 1, ... (для массива из 3-х элементов: 0, 1, 2).
При доступе к элементам можно использовать индексы от 0 до n-1. А код:
for (k=0;k<=n;k++)
перебиает индексы от 0 и до n. (<=, а надо <). Соответственно, при доступе к mas_pointer+k где k равно n будет выход за пределы массива.
Огромное спасибо всем ответившим однако с первым кодом я уже разобрался ошибок там на самом деле очень много было , но теперь всё работает.
Прошу больше не обсуждать его.
Однако есть другой вопрос
......
class abstract
{
public :
virtual float init(string unic_name,int am)=0;
};
class my_class : public abstract
{
protected:
string unic_name;
..........
public:
float init(string unic_name,int am) const
{
.......
};
ЗДесь у меня абстрактный класс (abstract ) и наследующий класс my_class, при содании обьекта my_class выводится ошибка Cannot create instance of abstract class 'abstract'. Хотя функция init переопределена и конструктор сделан правильно.?
Здравствуйте, Albedo, Вы писали:
A>2. Подскажите функцию для возвращения ASCII кода символа и обратно.
Нет таких функций. char — это число.
char c1 = '0';
char c2 = 0x30;
int a = 'A' + 1;
if (c1 == c2)
std::cout << "c1 and c2 are equal\n";
if (a == 'B')
std::cout << "a and 'B' are equal\n";
new RSDN@Home(1.1.4, 303) << new Message(); std::head::ear << "тссссссссс";
scanf — функция стандартной билиотеки языка С
cin — класс библиотеки iostream C++
std::cin — класс библиотеки STL C++
Здравствуйте, Albedo, Вы писали:
A>Ещё пара вопросов: A>1. В чем отличие scanf от cin >> ? A>2. Подскажите функцию для возвращения ASCII кода символа и обратно.