2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 С++ добавление элементов в массив.
Сообщение01.11.2014, 16:12 


28/07/14
68
Здравствуйте. Есть задача: в одномерном массиве вставить новый элемент между всеми парами элементов,имеющими разные знаки. Я решил,но моё решение падает,ругаясь на переполнение,хотя я вроде очищаю память. Посмотрите пожалуйста,в чем может быть ошибка?

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include<iostream>
using namespace std;
bool sgn(int a, int b)
        {
        if (((a>0)&&(b<0))||((a<0)&&(b>0))) return false;
                else if (((a>0)&&(b>0))||((a<0)&&(b<0))) return true;
        }

int main()
        {
        int n; cin>>n; //размерность массива.
        int elem; cin>>elem; //элемент для замены
        int *mas=new int[n]; // создаём динамический массив mas
        for(int i=0;i<=n-1;i++){cin>>mas[i];} // считываем
        int i=1,k=0,s=0;
        while(i<=n+s)
                {
                if (!sgn(mas[i],mas[i-1]))//sgn - если одного знака - истина, разных - ложь.
                        {
                        s++;
                        k=n+s; //создаем размерность нового массива
                        int *mas_temp=new int[k];
                        for(int j=0;j<=k-1;j++)
                                {
                                if (j<i) mas_temp[j]=mas[j];
                                        else if (j==i) {mas_temp[j]=elem; mas_temp[j+1]=mas[j];}
                                                else if(j>i) mas_temp[j+1]=mas[j];
                                }
                        delete [] mas;
                        mas=new int[k];
                        for(int j=0;j<=k-1;j++){mas[j]=mas_temp[j];}
                        delete [] mas_temp;
                        i+=2;
                        }
                        else i++;
                }
        for(int j=0;j<=k-1;j++){cout<<mas[j]<<" ";}
        delete [] mas;
        return 0;
        }
 

 Профиль  
                  
 
 Re: С++ добавление элементов в массив.
Сообщение01.11.2014, 18:10 
Заслуженный участник


09/05/12
25179
Разберитесь с тем, сколько элементов у Вас в массивах. Например, сколько элементов в массиве int x[5] и в каких пределах меняются их индексы?

 Профиль  
                  
 
 Re: С++ добавление элементов в массив.
Сообщение01.11.2014, 18:41 


27/08/14
207
Вначале посмотрите, что происходит если в массиве только 1 элемент. Также посмотрите, что возвращает sng, если один или оба аргумента равны 0. Всегда обращайте внимание на сообщения компилятора, особенно warning.

 Профиль  
                  
 
 Re: С++ добавление элементов в массив.
Сообщение04.11.2014, 01:38 


22/10/14
23
kvendingoldo в сообщении #925088 писал(а):
моё решение падает,ругаясь на переполнение,хотя я вроде очищаю память.


Очищаешь память это как, оператором free, функцией VirtualFree и т.д?

Это не то, переполнение - это когда ты выходишь за границы массива. Так вот, когда у тебя, допустим, от 0 до 9 элементов, то я догадываюсь, что ты перезаписываешь "10-й" элемент, который лежит на странице памяти недоступной для записи?

Делай проверку на 0-й и последний элемент массива, ведь у последнего элемента номера i не должно быть соседа с номером i+1....

P.S. Код не смотрел, ибо смысла нету - есть отладчик. Он и покажет где ошибка, на какой строчке переполнение происходит.

 Профиль  
                  
 
 Re: С++ добавление элементов в массив.
Сообщение04.11.2014, 01:47 
Заслуженный участник


09/05/12
25179
Nu11ers3t в сообщении #926285 писал(а):
то я догадываюсь, что ты перезаписываешь "10-й" элемент, который лежит на странице памяти недоступной для записи?
К сожалению, доступной. Проблема в том, что в этом месте лежит техническая информация о другом массиве, и именно его потом и не удается корректно удалить.

 Профиль  
                  
 
 Re: С++ добавление элементов в массив.
Сообщение04.11.2014, 01:50 
Админ форума
Аватара пользователя


19/03/10
8952
Nu11ers3t в сообщении #926285 писал(а):
Делай проверку на 0-й и последний элемент массива
 !  Nu11ers3t, замечание за фамильярность. Читайте Правила форума:
Forum Administration в Правилах форума #27356 писал(а):
1) Нарушением считается:

е) ..., фамильярность (у нас принято обращаться друг к другу на "Вы")...

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group