LINUX.ORG.RU

[C++][Segment Fault]cout<

 


0

1

Писал программу, и столкнулся со следующей проблемой. В программе я использовал цикл while, в котором от значения m уменьшается переменная int i с шагом в единицу, и когда она равна минус единице, цикл заканчивается. В цикле мне понадобилось вывести на экран значение i+1. При запуске программы выскакивает Segment Fault.

Что интересно, при cout <<i; программа работает(хоть и некорректно, ибом не необходимо ввывести значение i=1), меняю на cout <<i+1; -выдает сегфаулт. Я так понял, предложение cout <<i+1; изменяет i на единицу? Что в свою очередь приводит к тому что в цикле одновременно я увеличиваю и уменьшаю i на 1, что приводит к бесконечному циклу и, соответственно, к переполнению стека?

Можно ли в С++ вывести на экран значение i+1, не изменив значение i, и при этом не используя костыли, наподобие

cout <<i+1;
i-=1;

или без этого никак?



Последнее исправление: BlacKeeper (всего исправлений: 1)

У тебя ошибка где-то в коде. Покажи код.

Deleted
()
Ответ на: комментарий от anonymous
          i=m;
          j=0;
          while(i!=-1)
          {
              if(i==m) cout<<P[j]<<"X^"<<i;
              else
              {
                switch(i)
                {
                  case 1:
                  if (P[j]>=0) cout<<"+"<<P[j]<<"X";
                  else cout<<"-"<<P[j]<<"X";
                  break;

                  case 0:
                  if (P[j]>=0) cout<<"+"<<P[j];
                  else cout<<"-"<<P[j];
                  break;

                  default:
                  if (P[j]>=0) cout<<"+"<<P[j]<<"X^"<<i;
                  else cout<<"-"<<P[j]<<"X^"<<i;
                  break;
                }
              }

              i--;
              j++;
          }
BlacKeeper
() автор топика
Ответ на: комментарий от BlacKeeper

Так программа работает некорректно. А если заменить <<i на <<i+1 выдает сегфаулт.

BlacKeeper
() автор топика
Ответ на: комментарий от BlacKeeper

typeof P ?

sizeof P ?

wtfis P ???

LD_PRELOAD=libastral.so echo «у вас там выход за рамки массива»

arsi ★★★★★
()
std::cout << (i + 1)

или нет ???

>>case 0:
>>if (P[j]>=0) cout<<"+"<<P[j];
>>else cout<<"-"<<P[j];
>>break;

может заменить на:

case 0: 
   if (p[j]>=0) cout << "+"; 
   cout << p[j]; 
   break;

AoD314
()
Ответ на: комментарий от anonymous
/*Сия программа выводит на экран два многочлена, ввведенных пользователем в виде матрицы их коэффициентов*/

#include <iostream>

using namespace std;

int main()
{
  int m,n;//степени многочленов P и Q
  int P[m],Q[n];//массивы коэффициентов многочленов P и Q
  int i,j;//счетчики циклов

  cout <<"Введите степени многочленов\n";
  cout <<"m="; cin >>m;
  cout <<"n="; cin >>n;

  if(m<0 && n<0) cout<<"Вы ввели отрицательную степень!";
  else
  {
      if(m<n) cout<<"Коэффициент m меньше n!";
      else
      {
          cout <<"Введите коэффициенты многочленов\n";

          cout <<"Многочлен P:\n";
          for(i=0;i<m;i++)
          {
            cout <<"A["<<i<<"]= "; cin>>P[i];
          }

          cout <<"Многочлен Q:\n";
          for(j=0;j<n;j++)
          {
            cout <<"A["<<j<<"]= "; cin>>Q[i];
          }

          cout <<"\n";
          cout <<"Введенные вами многочлены:\n";


          i=m-1;
          j=0;
          while(i!=-1)
          {
              if(i==m-1) cout<<P[j]<<"X^"<<i;
              else
              {
                switch(i)
                {
                  case 1:
                  if (P[j]>=0) cout<<"+"<<P[j]<<"X";
                  else cout<<"-"<<P[j]<<"X";
                  break;

                  case 0:
                  if (P[j]>=0) cout<<"+"<<P[j];
                  else cout<<"-"<<P[j];
                  break;

                  default:
                  if (P[j]>=0) cout<<"+"<<P[j]<<"X^"<<i;
                  else cout<<"-"<<P[j]<<"X^"<<i;
                  break;
                }
              }

              i--;
              j++;
          }
          cout <<"\n";

      }

  }

    return 0;
}
BlacKeeper
() автор топика
Ответ на: комментарий от BlacKeeper

int m,n;//степени многочленов P и Q int P[m],Q[n];//массивы коэффициентов многочленов P и Q

Интересно, почему g++ даже с Wall не выдает хотя бы ворнинга на это?

anonymous
()
Ответ на: комментарий от BlacKeeper

Конструкция P[m] выделяет массив размера m. (Кстати, это не кроссплатформенно.) Переменная m на текущий момент не инициализирована, в ней мусор.

anonymous
()
Ответ на: комментарий от BlacKeeper

Вот нельзя так делать. Кто же задает размерность до указания его размера? Тогда надо динамические массивы использовать.

  int m,n;//степени многочленов P и Q
  int P[m],Q[n];//массивы коэффициентов многочленов P и Q
  int i,j;//счетчики циклов

  cout <<"Введите степени многочленов\n";
  cout <<"m="; cin >>m;
  cout <<"n="; cin >>n;

Zodd ★★★★★
()
Ответ на: комментарий от anonymous

>>используй vector, после ввода m и n делай resize

Вы хотите сказать, что некооректным является объявление величины массива переменной, которая еще не инициализирована? Я так попробовал- вроде компилятор не ругается, значит формально так сделать можно. В данной программе сразу в начале m и n инициализируются, так что по идее какие могут быть ошибки с выходом за массив?

BlacKeeper
() автор топика
Ответ на: комментарий от Zodd

Я догадывался о том, что так делать нельзя, и впредь обещаю так не делать:) Тем более, раз уж это не кросплатформенно.

BlacKeeper
() автор топика
Ответ на: комментарий от BlacKeeper

Пока вам не намекнули самым толстым образом... :)

int n,m; // создает неинициализированные переменные
int P[m], Q[n];//здесь компилятор :facepalm: и уже неведомо ему что делать.
Поэтому:
int n,m;
int *P, *Q;

после того, как юзер ввёл размер матрицы:

cin >> n >> m;//как угодно, лишь пример, можете задать вручную
делаем так:
P=new int[m];
Q=new int[n];

//по окончанию работы:

delete P;
delete Q;

А если не надо вам динамичный размер массива, то всё просто:

const int n=5,m=4;//какие-то конкретные значения
int P[m];
int Q[n];

blinkenlichten
()
Ответ на: комментарий от BlacKeeper

> В данной программе сразу в начале m и n инициализируются, так что по идее какие могут быть ошибки с выходом за массив

Ошибка будет здесь:

int P[m];

напиши перед этой строчкой cout << m и подумай, что в ней происходит.

anonymous
()
Ответ на: комментарий от BlacKeeper

Хотя бы вот так.

  int m,n;//степени многочленов P и Q
  int P[m],Q[n];//массивы коэффициентов многочленов P и Q
  int i,j;//счетчики циклов

  cout <<"Введите степени многочленов\n";
  cout <<"m="; cin >>m;
  cout <<"n="; cin >>n;

  P = new int[m];
  Q = new int[n];

  ...
  delete[] P;
  delete[] Q;

Zodd ★★★★★
()

Благодарю всех за критику. Еще остался один вопросец. Выражение cout <<i+1; изменяет i на единицу?

BlacKeeper
() автор топика
Ответ на: комментарий от BlacKeeper

>Благодарю всех за критику. Еще остался один вопросец. Выражение cout <<i+1; изменяет i на единицу?

нет. что бы изменяла должен быть =.

Andaril
()
Ответ на: комментарий от anonymous

Та понятно, что STL безопаснее, но основы знать-то надо.

Эту задачу во всех универах задают решить, бородатая она этакая :-)

blinkenlichten
()

<script>alert("Hello")</script>

XSS?

anonymous
()
Ответ на: комментарий от anonymous

Только что заметил. Копипаста вышла неудачно. Конечно же

  int *P, *Q;//массивы коэффициентов многочленов P и Q
  int i,j;//счетчики циклов

  cout <<"Введите степени многочленов\n";
  cout <<"m="; cin >>m;
  cout <<"n="; cin >>n;

  P = new int[m];
  Q = new int[n];

  ...
  delete[] P;
  delete[] Q;

Zodd ★★★★★
()
Ответ на: комментарий от BlacKeeper

>Вы хотите сказать, что некооректным является объявление величины массива переменной, которая еще не инициализирована? Я так попробовал- вроде компилятор не ругается, значит формально так сделать можно. В данной программе сразу в начале m и n инициализируются, так что по идее какие могут быть ошибки с выходом за массив?

Ну если ты не будешь выходить за границы массива размеров m и n, то ошибок и не будет. Вот только размеры то ты не знаешь, так как они у тебя случайные.

Если объяснять втупую, то у тебя есть некая m, которая забита мусором, ты объявляешь массив, и у него размер становится равным... этому мусору. Удивительно, правда?:)

А что ты потом делаешь с данной переменной, уже не важно. Массив то уже объявлен, память выделена.

//Судя по твоей аватарке, ты, вместо чтения книжек, играешься в ВоВ. Завязывай с этим.

anonymous
()
Ответ на: комментарий от Zodd

Та я тоже ошибся в простых вещах, delete[] вместо просто delete надобно тут использовать.

//сам-то только в C опыт имел пока, free(ptr) rules :-)

blinkenlichten
()

Только я не понял что этот код в итоге делать должен? Просто выводить многочлен или ..?

Zodd ★★★★★
()

Размер массива всегда должен быть константой. У тебя это не так. Твои массивы в данном случае это указатель-константа, но ты не задал им размер.

anonymous
()
Ответ на: комментарий от anonymous

C99 умеет переменные массивы. Но в этом случае в n и m мусор.

creepnee
()
Ответ на: комментарий от anonymous

>Твои массивы в данном случае это указатель-константа, но ты не задал им размер.

Да задал он размер, задал. Просто не тот:)

anonymous
()
Ответ на: комментарий от BlacKeeper

/*Сия программа выводит на экран два многочлена, ввведенных пользователем в виде матрицы их коэффициентов*/

Ух!

int m,n;//степени многочленов P и Q
int P[m],Q[n];//массивы коэффициентов многочленов P и Q

#define M 10
#define N 10

int P[M],Q[N];
Zhbert ★★★★★
()

=)

Это-ж цедзип просто какой-то =) А дальше изучения синтаксиса С/С++ Вы не ушли?) Приоритет операций? Статическое/динамическое выделение памяти ( и под массивы тоже )?

Вообще эта тема мне напоминает дядек с русфака. Они сами себе вопросы задают и повышают рейтинг. А тут результат - количество ответов в теме за 100. Или это ЛОР-стиль такой?

Не мучились бы уже.

Все задачки ваши запостите на фрилансе. Поставьте 200р за работу и всё. Вам даже каждую строчку с комментариями сделают.

Может я ошибаюсь. В одной из Ваших трёх тем вы писали, что изучали раньше Pascal. Но ведь там всё строго. Этот язык просто учит правильно писать программы. Тоже работа с массивами есть....хм.

Почему я считаю, что это задачки для студента? Да потому что про многочлены только оттуда может быть. Хорошо хоть не вычисление площади методом Монте-Карло. Если хотите изучать, то просто начните с интересного. Если задача получается слишком сложной, то разбейте на подзадачи и вперёд. И пару справочников всегда под рукой держите.

m4n71k0r
()
Ответ на: =) от m4n71k0r

>Все задачки ваши запостите на фрилансе. Поставьте 200р за работу и всё. Вам даже каждую строчку с комментариями сделают.

Насколько я знаю, он скачал учебник какой-то, или задачник, и по нему «учится».

Если хотите изучать, то просто начните с интересного. Если задача получается слишком сложной, то разбейте на подзадачи и вперёд. И пару справочников всегда под рукой держите.


Согласен. У меня при разработке всегда лежат под рукой справочник Шлее по Qt и Шмидт по плюсам. Ну и гугль юзать приходится.

Zhbert ★★★★★
()
Ответ на: комментарий от Zhbert

С ней всё отлично, а у автора темы и вовсе великолепно.

ugoday ★★★★★
()
Ответ на: комментарий от anonymous

>>Если объяснять втупую, то у тебя есть некая m, которая забита мусором, ты объявляешь массив, и у него размер становится равным... этому мусору. Удивительно, правда?:)

В Delphi было проще- если переменная неинициализирована, ее значение 0...

//Судя по твоей аватарке, ты, вместо чтения книжек, играешься в ВоВ. Завязывай с этим.

Варкрафт я удалил два месяца назад, когда бубунту ставил, и ничуть об этом не жалею:) А аватарка мне просто нравится.

BlacKeeper
() автор топика
Ответ на: комментарий от BlacKeeper

>В Delphi было проще- если переменная неинициализирована, ее значение 0...

Та забудь ты про него уже! =)

Zhbert ★★★★★
()
Ответ на: комментарий от Zodd

В конечном итоге программа будет делить два многочлена уголком. ПРосто я вот сейчас застрял на стадии «красивого» вывода введенного массива коэффициентов многочленов. ну чтобы было Ax^m+Bx^(m-1)+...+Cx+D.

BlacKeeper
() автор топика
#include <iostream>

using namespace std;

int main()
{
  int m,n;//степени многочленов P и Q
  int i,j;//счетчики циклов
  bool alnul;

  cout <<"Введите степени многочленов\n";
  cout <<"m="; cin >>m;
  cout <<"n="; cin >>n;

  int P[m],Q[n];//массивы коэффициентов многочленов P и Q

  if(m<0 || n<0) cout<<"Вы ввели отрицательную степень!";
  else
  {
      if(m<n) cout<<"Коэффициент m меньше n!";
      else
      {
          cout <<"Введите коэффициенты многочленов\n";

          alnul=false;
          cout <<"Многочлен P:\n";
          for(i=0;i<m;i++)
          {
            cout <<"A["<<i<<"]= "; cin>>P[i];
            if(P[i]!=0) alnul=true;
          }

          alnul=false;
          cout <<"Многочлен Q:\n";
          for(i=0;i<n;i++)
          {
            cout <<"A["<<i<<"]= "; cin>>Q[i];
            if(Q[i]!=0) alnul=true;
          }

          if(P[0]==0 || Q[0]==0) cout<<"Старшие коэффициенты должны отличаться от нуля!!!";
          else
          {
            if(alnul==false) cout<<"Все коэффициенты равны нулю!!!";
            else
            {
                cout <<"\n";
                cout <<"Введенные вами многочлены:\n";

                cout<<"P=";
                i=m-1;
                j=0;
                while(i!=-1)
                {
                    if(i==m-1 && i!=0) {if(P[j]!=0) cout<<P[j]<<"X^"<<i;}
                    else
                    {
                        switch(i)
                        {
                            case 1:
                            if(P[j]==0) break;
                            if (P[j]>0) cout<<"+"<<P[j]<<"X";
                            else cout<<P[j]<<"X";
                            break;

                            case 0:
                            if(P[j]==0) break;
                            if (P[j]>0) {cout<<"+"; if(m==1) cout<<"\b";cout <<P[j];}
                            else cout<<P[j];
                            break;

                            default:
                            if(P[j]==0) break;
                            if (P[j]>0) cout<<"+"<<P[j]<<"X^"<<i;
                            else cout<<P[j]<<"X^"<<i;
                            break;
                        }
                     }

                     i--;
                     j++;
            }

            cout<<"\n\n"<<"Q=";

            i=n-1;
            j=0;
            while(i!=-1)
            {
              if(i==n-1 && i!=0) {if(Q[j]!=0) cout<<Q[j]<<"X^"<<i;}
              else
              {
                switch(i)
                {
                  case 1:
                  if(Q[j]==0) break;
                  if (Q[j]>=0) cout<<"+"<<Q[j]<<"X";
                  else cout<<Q[j]<<"X";
                  break;

                  case 0:
                  if(Q[j]==0) break;
                  if (Q[j]>=0) {cout<<"+"; if(n==1) cout<<"\b";cout <<Q[j];}
                  else cout<<Q[j];
                  break;

                  default:
                  if(Q[j]==0) break;
                  if (Q[j]>0) cout<<"+"<<Q[j]<<"X^"<<i;
                  else cout<<Q[j]<<"X^"<<i;
                  break;
                 }
               }

              i--;
              j++;
              }
            cout<<"\n";

          }
        }

      }

  }

    return 0;
}

Наконец-то всё работает как нужно! Спасибо всем!

BlacKeeper
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.