2014 dxdy logo

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

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




 
 С++ добавление элементов в массив.
Сообщение01.11.2014, 16:12 
Здравствуйте. Есть задача: в одномерном массиве вставить новый элемент между всеми парами элементов,имеющими разные знаки. Я решил,но моё решение падает,ругаясь на переполнение,хотя я вроде очищаю память. Посмотрите пожалуйста,в чем может быть ошибка?

код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Разберитесь с тем, сколько элементов у Вас в массивах. Например, сколько элементов в массиве int x[5] и в каких пределах меняются их индексы?

 
 
 
 Re: С++ добавление элементов в массив.
Сообщение01.11.2014, 18:41 
Вначале посмотрите, что происходит если в массиве только 1 элемент. Также посмотрите, что возвращает sng, если один или оба аргумента равны 0. Всегда обращайте внимание на сообщения компилятора, особенно warning.

 
 
 
 Re: С++ добавление элементов в массив.
Сообщение04.11.2014, 01:38 
kvendingoldo в сообщении #925088 писал(а):
моё решение падает,ругаясь на переполнение,хотя я вроде очищаю память.


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

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

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

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

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

 
 
 
 Re: С++ добавление элементов в массив.
Сообщение04.11.2014, 01:50 
Аватара пользователя
Nu11ers3t в сообщении #926285 писал(а):
Делай проверку на 0-й и последний элемент массива
 !  Nu11ers3t, замечание за фамильярность. Читайте Правила форума:
Forum Administration в Правилах форума #27356 писал(а):
1) Нарушением считается:

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

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group