LINUX.ORG.RU

Третий день бьюсь над сегфолтом...

 , , , ,


1

4
#include <string.h>
#include <iostream>
using namespace std;
const int ARL=255;
class String{
 char* s[];
 public:
 String(char *s1){
  s=new char[ARL];
  strcpy(s,s1);
 }
 String(){
  cout<<"Введите строку:";
  s=new char[ARL];
  cin>>s;
 }
 ~String(){
  delete[] s;
 }
 int len(){
  for (int i=0;i<ARL;i++)
   if (s[i]==0)
    return i;
  return -1;
 }
 int len(char* s1){
  int l=sizeof(*s1);
  for (int i=0;i<l;i++)
   if (s1[i]==0)
    return i;
  return -1;
 }
 void operator--(){
  int l=this->len();
  int j;
  for(int i=0;i<l;i++){
   ........
  }
 }
..............
};
int main(){
 char* s=new char[255];
 cout<<"Введите начальную строку:"<<endl;
 cin>>s;
 String* s1=new String(s);
 s1->print();
 *s1--;
 s1->print();
...................
 return 0;
}

Первый раз метод len вызывается корректно. При втором - сразу сегфолт. С помощью gdb выяснил, что s почему-то присваивается между этими вызовами адрес 0x21. Где и как - хоть убейте, не пойму. Если s1-- закомментить - не сегфолтится. Пробовал его и со звёздочкой вызывать, и без - результат один и тот же.

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

возьми за правило экранировать *

А если бы ты сделал с самого начала, компилятор намекнул на этот идиотизм в коде куда раньше и не было бы этого треда.

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

Task solved.

лицо-рука-бум-шмяк-очки-дзынь..

Жаль я не Ваш препод. Хрен бы Вы с таким кодом у меня зачет получили...

Где конструктор копирования и оператор присваивания? Че делать будем когда строка over 254 символа (или какого фига там вообще new тогда)? Это для начала.

ЗЫ printf и scanf внезапно работают в плюсах точно так же как и не в плюсах.

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

Не слишком ли велик огород для того, чтобы текст в программу передать?

я откуда знаю, чего ты хочешь? В vim псевдографика набирается. Да и вообще есть compose key в Xorg.

И C-шные строки, и методы работы с ними я уже давным-давно осилил. Вот только толку с этого сейчас 0.

значит — не осилил.

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

Короче, анону спасибо, --(*s1); заработало.

ну радуйся.

хотя всё-же прочитай это: Третий день бьюсь над сегфолтом... (комментарий)

И пойду я спать, а то скоро морду разобью тут с тобой... Жена на кровать не пустит, скажет — что за чмо окровавленное и вытекшими глазами?

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

это ты так думаешь...

В будущем, если буду использовать плюсы - разумеется, пригодятся, сейчас нет.

И вообще, это оказался единственный баганый метод, остальное почти на шару завелось:

#include <string.h>
#include <iostream>
using namespace std;
const int ARL=255;
class String{
 char* s;
 public:
 String(char *s1){
  s=new char[ARL];
  strcpy(s,s1);
 }
 String(){
  cout<<"Введите строку:";
  s=new char[ARL];
  cin>>s;
 }
 ~String(){
  delete[] s;
 }
 int len(){
  for (int i=0;i<ARL;i++)
   if (s[i]==0)
    return i;
  return -1;
 }
 int len(char* s1){
  for (int i=0;i<ARL;i++)
   if (s1[i]==0)
    return i;
  return -1;
 }
void operator--(){
  int l=this->len();
  int j;
  for(int i=0;i<l;i++){
   if (s[i]<-64){
    l--;
    for (j=i;j<l;j++)
     s[j]=s[j+1];
    s[j]=0;
    i--;
   }
  }
 }
 void operator-=(char* s1){
  int l=this->len();
  int l1=this->len(s1);
  if (l<l1) {
   cout<<"Слишком большая строка"<<endl;
   return;
  }
  s[l-l1]=0;
 }
 void operator+=(char* s1){
  int l=this->len();
  int l1=this->len(s1);
  for (int i=0;i<l1;i++)
   s[l+i]=s1[i];
  s[l+l1]=0;
 }
 void operator++(){
  int l=this->len();
  int n,i;
  char max=0;
  cout<<"Введите n:";
  cin>>n;
  if (n>l){
   cout<<"n слишком большое";
   return;
  }
  for (i=0;i<l;i++)
   if (max<s[i])
    max=s[i];
  for (i=0;i<n;i++)
   s[i]=max;
 }
 void print(){
  int l=this->len();
  for (int i=0;i<l;i++)
   cout<<s[i];
  cout<<endl;
 }
};
int main(){
 char* s=new char[255];
 cout<<"Введите начальную строку:"<<endl;
 cin>>s;
 String* s1=new String(s);
 s1->print();
 --(*s1);
 s1->print();
 char *s2=new char[ARL];
 cout<<"Введите дополнительную строку:"<<endl;
 cin>>s2;
 (*s1)-=s2;
 s1->print();
 (*s1)+=s2;
 s1->print();
 ++(*s1);
 s1->print();
 return 0;
}
Task completed. Sleep mode unrestricted. Enabling sleep mode...

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от emulek

делить на ноль нельзя.

Щяс я переопределю деление и у меня можно будет :D

не трогать C++, пока не подрос.

Может, мне ещё в школу пойти?

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

И C-шные строки, и методы работы с ними я уже давным-давно осилил.

бугога, рассмешил учи матчасть школота упоротая

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

Где конструктор копирования и оператор присваивания?

В предыдущих лабах потерялись.

Че делать будем когда строка over 254 символа

Сперва вбей.

ЗЫ printf и scanf внезапно работают в плюсах

Только либа не подключается ни фига.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от emulek

В vim псевдографика набирается.

Да-да, обязательно расскажи преподу, как набирать псевдографику в vim. И самое главное - как её потом оттуда копипастить и чем это удобнее чармапа.

значит — не осилил.

Значит, тебе ясно сказано было - готовые методы конкатенации, замены и прочего юзать нельзя - надо написать свои.

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

Да-да, обязательно расскажи преподу, как набирать псевдографику в vim.

ВНЕЗАПНО: на клавиатуре

И самое главное - как её потом оттуда копипастить

ВНЕЗАПНО: мышкой

и чем это удобнее чармапа.

об этом я как-то не задумывался...

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

У нас ВНО. И да, я тесты честно сдавал, не надо. По математике вообще 200. Впрочем, в 2011-м задания легче были, чем в предыдущих, видимо, потому что выпускников было мало (как раз на рубеж смены учебной программы попали, когда одновременно вернули 4-й класс и должны были для наших последователей ещё 12-й впилить, но в итоге они тоже 11 лет учатся).

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от emulek

здравая мысль.

Да, мозги отдохнут хоть. Только ни фига не выйдет.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от emulek

ВНЕЗАПНО: на клавиатуре

ВНЕЗАПНО: если колошматить в vim по клавиатуре, то ничего хорошего и тихого из этого не получится.

ВНЕЗАПНО: мышкой

Ты так и не объяснил, зачем нужен vim. Я вон в gucharmap наклацал и уже три дня из него копипастю.

об этом я как-то не задумывался...

Линуксоиды такие линуксоиды, лёгких путей не ищут.

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

Короче, анону спасибо, --(*s1); заработало. Task solved.

Случайно бажный код не упал на вашей конфигурации и вы считаете это победой? У меня для вас плохие новости.

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

В предыдущих лабах потерялись.

Сдал-забыл?

Сперва вбей.

Вообще не вопрос, cat война-и-мир.txt | ./your-ugly-application

Удачного поиска следующего сегфолта!

Только либа не подключается ни фига.

#include <stdio.h>

Ваш К.О.

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

Кстати, ещё замечание: вместо char* стОит писать const char* в параметрах тех же операторов, если строку по этому указателю менять не требуется.

int len(const char* s1){
  for (int i=0;i<ARL;i++)
   if (s1[i]==0)
    return i;
  return -1;
 }

Во-первых ряд глупых ошибок поможет избежать в будущем, поскольку char* скастуется в const char* самим компилятором, а вот обратно можно кастовать только явно. Ошибиться и написать if(s1=0) уже не выйдет.

Собственно, к любым параметрам, передаваемым по указателю относится.

И ещё, раз уж про const: методы, не изменяющие внутреннее состояние класса тоже лучше объявлять как const

int len(const char* s1) const {
  for (int i=0;i<ARL;i++)
   if (s1[i]==0)
    return i;
  return -1;
 }

Смысл примерно тот же, предотвращение глупых ошибок на ранней стадии. Понятно, что len(), print() могут быть const, т.к. ничего не меняют, а operator+= уже нет.

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

Случайно бажный код не упал на вашей конфигурации и вы считаете это победой?

Да ему достаточно кодировку поменять, чтобы всё разлетелось. Но мне по барабану.

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

ВНЕЗАПНО: если колошматить в vim по клавиатуре, то ничего хорошего и тихого из этого не получится.

Сдуру и член можно сломать.

Ты так и не объяснил, зачем нужен vim.

Для редактирования текста.

Я вон в gucharmap наклацал и уже три дня из него копипастю.

Оно и видно :)

Линуксоиды такие линуксоиды, лёгких путей не ищут.

О да, вы уже много «легких» путей нам показали :)

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

> И C-шные строки, и методы работы с ними я уже давным-давно осилил.
мини-Царь 2.0 на подходе

Вы зачем мне чужую цитату приписали?

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

Да ему достаточно кодировку поменять, чтобы всё разлетелось. Но мне по барабану.

Кому кодировку поменять?

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

Сдал-забыл?

Да. До тех пор, пока оно реально не нужно.

cat война-и-мир.txt | ./your-ugly-application

Очень сомневаюсь, что там первая строчка больше 255 символов, скорее всего, это заголовок или вообще пустая строка. И вообще, если художественное произведение хранится в txt, то оно наверняка потырено с lib.ru набрано в досовском редакторе и в него вхардкожены переносы строки после каждых 80 символов.

#include <stdio.h>

Вываливаются ошибки где-то глубоко из недр. Думаешь, я не проверял? Ещё когда первый раз на g++ был вынужден слезть?

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от andreyu

Это цитата из ТС-а, я не про Вас ес-но. Я с-но только хотел обратить Ваше внимание на его самооценку;-)

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

Тут форматтер часть откусил, там было

if(s1[i]=0)

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

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

Сдуру и член можно сломать.

Только в vim этот член хрустальный и крепится к туловищу на двухсторонний скотч.

Для редактирования текста.

Спасибо, КЭП.

О да, вы уже много «легких» путей нам показали :)

Я изначально избрал нелёгкий путь, не делая всё это под форточками и MSVC. А впереди две гуёвых лабы... еле уломал, чтобы делать это на Qt, но препод всё равно бурчал, что надо будет подробно в протоколе расписать, почему так, а не эдак, и что на экзамене всё равно будут по MSVC вопросы.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от andreyu

В консоли. Код же КОИ8-Р-only. Кстати, signed char - хороший способ прострелить себе ногу... или это рука снизу растёт. Я уж молчу о том, что будет, если это под юникодной консолью запустить...

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

Да. До тех пор, пока оно реально не нужно.

Оно уже реально нужно.

String a("bebebe"), b("123");
b = a;
Вот и еще один сегфолт на подходе.

Очень сомневаюсь, что там первая строчка больше 255 символов

Я могу и другой файл загнать, который на 1Гб и весь одной строкой. Если Вы не в состоянии нормально сделать примитивную учебную задачу, то нафига Вы вообще учитесь в этом вузе? Не тратьте зря свое время.

Вываливаются ошибки где-то глубоко из недр.

Ах Вы бедняшка... почему же у меня и всех остальных не вываливаются? ЧЯНТД?

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

Это цитата из ТС-а, я не про Вас ес-но. Я с-но только хотел обратить Ваше внимание на его самооценку;-)

Прошу прощения, сразу не сообразил :)

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

Только в vim этот член хрустальный и крепится к туловищу на двухсторонний скотч.

Вы этот vim только на картинках видели, так что ваше «компетентоное» мнение мало кого интересует.

Спасибо, КЭП.

Пожалуйста.

Я изначально избрал нелёгкий путь, не делая всё это под форточками и MSVC.

А в msvc уже добавли кнопку «сделать зашибись»?

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

В консоли. Код же КОИ8-Р-only. Кстати, signed char - хороший способ прострелить себе ногу... или это рука снизу растёт. Я уж молчу о том, что будет, если это под юникодной консолью запустить...

Про кривые руки я уже говорил?

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

А в msvc уже добавли кнопку «сделать зашибись»?

Они с нее завсегда начинают. Но потом она скрывается под слоями других кнопок и выпадающих меню примерно той же направленности... а потом случайно выясняется что если на нее нажать то студия виснет наглухо.

AIv ★★★★★
()

ой мама, кто ж так пишет ёмоё.

char* s=new char[255];
String* s1=new String(s);
«look, i am a java programmer» (c)

invy ★★★★★
()

полистал твой код, и тем более твои ответы... у тебя проблема в ДНК.

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

Я изначально избрал нелёгкий путь, не делая всё это под форточками и MSVC

ты выбрал более лёгкий путь, но ниасилил этого

В консоли. Код же КОИ8-Р-only.

где ты в линуксе консоль-то такую нашёл? Уж поди с прошлого века никто о ней не помнит

Кстати, signed char - хороший способ прострелить себе ногу

signed char, unsigned char, при работе со строками какая впень разница?

У нас ВНО. И да, я тесты честно сдавал

этот тест ты честно не сдал, иди честно получай свой незачёт

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

Сдал-забыл?

Да. До тех пор, пока оно реально не нужно.

надеюсь НИКОГДА не понадобится.

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

Если Вы не в состоянии нормально сделать примитивную учебную задачу, то нафига Вы вообще учитесь в этом вузе? Не тратьте зря свое время.

пойдёт в начальники.

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

А в msvc уже добавли кнопку «сделать зашибись»?

конечно. Но не бесплатно. А бесплатно только

#pragma MiniRoboDancerMode On

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

Вот и еще один сегфолт на подходе.

Для которого нужно править код, бугага.

нафига Вы вообще учитесь в этом вузе?

Ну значит, одним сторожем станет больше...

ЧЯНТД?

Вот я ХЗ если оно у меня нормально не хотело подрубаться ни под MSVC, ни под MinGW, ни под GCC, то это явно о чём-то говорит.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от andreyu

Вы этот vim только на картинках видели

Лол. Я в нём лекции набираю. Писк от моих кривых рук весьма доставляет окружающим:D

А в msvc уже добавли кнопку «сделать зашибись»?

Нет, просто лабы под него рассчитаны.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от alexku

где ты в линуксе консоль-то такую нашёл?

Руками кодировку выставил, а ты как думал?

Уж поди с прошлого века никто о ней не помнит

Эддичка ( Anon) помнит.

при работе со строками какая впень разница?

А такая, что char - это ещё и целочисленный тип.

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