Пожалуйста помогите!
От: Albedo Россия  
Дата: 18.07.05 11:30
Оценка:
Мне всего 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
Re: Пожалуйста помогите!
От: valker  
Дата: 18.07.05 11:41
Оценка:
Здравствуйте, Albedo, Вы писали:

[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 ожидает от тебя адрес. Пиши так:

scanf("%d", (mas_pointer + i - 1));


Удачи!
Re: Пожалуйста помогите!
От: Amidlokos Россия  
Дата: 18.07.05 11:42
Оценка: :)
Здравствуйте, Albedo, Вы писали:

A>Мне всего 15 лет не судите строго. Недавно начал заниматься програмированием. Есть такой код:

A>int n;
A>int* mas_pointer=new int[n];


Как ты думаешь, какого у тебя размера будет массив?
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
WARNING: expression "to_be || !to_be" is always true
Re[2]: Пожалуйста помогите!
От: Albedo Россия  
Дата: 18.07.05 12:24
Оценка:
Спасибо всем ответившим, особенно valker. Но я уже разобрался и всё сделал сам.
p.s. 2Amidlokos такого чему равно n*sizeof(int). Если я правильно понял динамическое выделение памяти.
Re[3]: Пожалуйста помогите!
От: Mr.Chipset Россия http://merlinko.com
Дата: 18.07.05 12:38
Оценка:
Здравствуйте, 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>>
"Всё что не убивает нас, делает нас сильнее..."
Re[3]: Пожалуйста помогите!
От: Amidlokos Россия  
Дата: 18.07.05 13:36
Оценка:
Здравствуйте, 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
Re: Для поиска - истиная причина ошибки
От: EyeOfHell  
Дата: 18.07.05 14:57
Оценка:
День добрый.


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 будет выход за пределы массива.

С уважением, Око.
Re[2]: Для поиска - истиная причина ошибки
От: Albedo Россия  
Дата: 19.07.05 00:29
Оценка:
Огромное спасибо всем ответившим однако с первым кодом я уже разобрался ошибок там на самом деле очень много было , но теперь всё работает.
Прошу больше не обсуждать его.
Однако есть другой вопрос

......
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 переопределена и конструктор сделан правильно.?
Re[3]: Для поиска - истиная причина ошибки
От: _Dreamer Россия  
Дата: 19.07.05 01:35
Оценка:
Здравствуйте, Albedo, Вы писали:

A>Однако есть другой вопрос

A>......

A>class abstract
A>{
A>public :
A>virtual float init(string unic_name,int am) = 0; // здесь нет const
A>};

A>class my_class : public abstract
A>{
A>public:
A>     float init(string unic_name,int am) const
A>     {
A>           .......
A>     }
A>};


Либо убери const у метода my_class::init(string, int), либо добавь его к abstract::init(string, int).
Re[4]: Для поиска - истиная причина ошибки
От: Albedo Россия  
Дата: 19.07.05 12:19
Оценка:
Ещё пара вопросов:
1. В чем отличие scanf от cin >> ?
2. Подскажите функцию для возвращения ASCII кода символа и обратно.
Re[5]: Для поиска - истиная причина ошибки
От: ansi  
Дата: 20.07.05 12:04
Оценка:
Здравствуйте, 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 << "тссссссссс";
Re[5]: Для поиска - истиная причина ошибки
От: Nazik Россия  
Дата: 20.07.05 12:27
Оценка:
scanf — функция стандартной билиотеки языка С
cin — класс библиотеки iostream C++
std::cin — класс библиотеки STL C++

Здравствуйте, Albedo, Вы писали:

A>Ещё пара вопросов:

A>1. В чем отличие scanf от cin >> ?
A>2. Подскажите функцию для возвращения ASCII кода символа и обратно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.