@Limeek

Segfault, не могу найти ошибку, что надо исправить(C++)?

#include <iostream>
#include <string.h>
using namespace std;
#define LIM_S 600
#define LIM_G 5
#define LIM_P 5215470
struct Printer{string str,str2;
  char *str_pr = &str[0u];
  char *quality=&str2[0u]   ;
  int price;  
  int speed;  
};	
int InputP(struct Printer [LIM_G],int*);
int OutputP(struct Printer [LIM_G],int);
int SortP(struct Printer [LIM_G],int);

int InputP(struct Printer P[LIM_G] , int * n)
{ int i,nn;
 
 do{
 cout<<"Введите количество принтеров 0<n<="<<LIM_G<<endl;cin>>nn;
}while(nn<0 || nn>LIM_G);
  cout <<"По запросам программы вводите"<<endl;
  for (i=0;i<nn;i++){
  	cout<<"Принтер №"<<i+1<<endl;
  
  cout << "Введите страну производителя принтера"<<endl;
  cin >> P[i].str_pr;
   
      do{
	  cout << "Введите качество печать Low, Medium или High"<<endl;
    cin >> P[i].quality;
 }while(strcmp(P[i].quality,"Low")!=0 && strcmp(P[i].quality,"Medium")!=0 && strcmp(P[i].quality,"High")!=0);
  do{
    cout<<"Введите скорость печати (страниц в минуту) 0<n<"<<LIM_S<<endl;
    cin>> P[i].speed;
  }while(P[i].speed <=0 || P[i].speed > LIM_S);
  do{
    cout<<"Введите цену принтера  0<n<"<<LIM_P<<endl;
    cin>> P[i].price;
  }while(P[i].price<0 || P[i].price>LIM_P );
}
*n=nn;
}
int OutputP(struct Printer P[LIM_G], int n){
	int i;
	for (i=0;i<n;i++){
		cout<<"Принтер №"<<i+1<<endl;
		cout<<"Страна производитель: "<<P[i].str_pr<<endl;
		cout<<"Качество печати: "<<P[i].quality<<endl;
		cout<<"Скорость печати(страниц в минуту): "<<P[i].speed<<endl;
		cout<<"Цена: "<<P[i].price<<endl;
		}
}
int SortP(struct Printer P[LIM_G], int n){
	int i,j,temp;
	for(i=0;i<n;i++)	
	 for(j=i+1;i<n;j++)
	  if (P[i].price > P[j].price){
	  	temp=P[j].price;
	  	P[j].price=P[i].price;
	  	P[i].price=temp;
	  }
}
int main(){
	int p;
	struct Printer pr[LIM_G];
	cout<<"Сортировка списка принтеров по возрастанию цены"<<endl;
	InputP (pr,&p);
	cout<<"Первоначальный список"<<endl;
	OutputP (pr,p);
	SortP (pr,p);
	cout<<"Отсортированный по возрастанию цены список"<<endl;
	OutputP (pr,p);	
}
  • Вопрос задан
  • 472 просмотра
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
@#$%^#$%^$%^&@#$%^

Вы сайтом ошиблись, это надо на говнокод постить.

#define вместо констант - лажа, но допустимая.

Rainberd углядел, что в самопальной сортировке классическая "ошибка копипаста". Посмотрите внимательно на вложенный цикл, там условие должно быть j<n, а у вас - i < n Это сегфолт номер раз.

А вот это - причина сегфолта номер два:
char *str_pr = &str[0u];
char *quality=&str2[0u]   ;

В версиях до C++11 нет никаких гарантий, что это дело указывает на массив всех символов строки.
В любых версиях нет никаких гарантий, что этот адрес будет неизменным в течении жизни строки.

Кто надоумил вас использовать функционал библиотеки C для работы со строками, да еще и смешивать его с STL?

Самопальная сортировка - тоже ужас. Этот код проще переписать, чем рефакторить.
int i;
for(i=....

Откройте для себя объявление индекса внутри цикла:
for(size_t i=0...

Откройте для себя, что массивы должны индексироваться при помощи size_t, а не int.

Тут в большинстве своем код на C, с операторами C++ в некоторых местах. Печать структур просится, например, в виде дообъявления оператора << у ofstream.

Если это студенческая работа, преподавателя, который "подготовил" такого студента нужно лишить конфет и поставить в угол.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы