Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2013, 22:08   #21
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
В С выражение
Код:
struct MyStruct {};
не создает новый тип MyStruct, поэтому надо при объявлении переменных использовать полное описание "struct MyStruct MyVar".
В C++ то же самое выражение создает новый тип MyStruct, и слово struct в объявлениях переменных можно не писать.

В каком месте программа крашится?
На моменте сортировки.
enerlol вне форума Ответить с цитированием
Старый 26.11.2013, 02:36   #22
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50
#define LINE "----------------------------------------------------------------------"

struct el {
  char country[15];
  char name[20];
  char chem[20];
  int zip;
} el_list[MAX];

void init_list(void), enter(void);
void delete(void), list(void);
int menu_select(void), find_free(void);


int country_cmp(const void *a, const void *b){
    return strcmp(((struct el*)a)->country, ((struct el*)b)->country);
}

int main(){
/* el_list arr[6] = {
        {.country = "Czehy", .name = "krzytal gorsky", .chem = "SiO2", .zip = 10002},
        {"Polska", "betyl", "Be3Al2Si6O18", 30001},
        {"Polska", "krzytal gorsky","SiO2", 10101},
        {"Polska", "agat","SiO2", 10001},
        {"Polska", "warezyt","ZnS", 00001},
        {.country = "Rosja", .name = "krzytal gorsky",.chem = "SiO2", .zip = 10003},
        };*/
  char choice;
//  register int slot;
//  char s[80];
  init_list(); /* инициализация массива структур */
  while ( 1 ){
        choice = menu_select();
        switch ( choice ){
            case 1:
                list();
                break;
            case 2 :
                enter();
                break;
            case 3 :
                delete();
                enter();
                break;
            case 4:
                qsort(el_list, MAX, sizeof(el_list), country_cmp);
                break;
            case 5:
                exit(0);
                break;
            case 0:
                exit(0);
            default :
                printf("Wrong menu index!\n");
        }
    }
  return 0;
}

/* Инициализация списка. */
void init_list(void)
{
  register int t;
  for(t=0; t<MAX; ++t) el_list[t].country[0] = '\0';
}

/* Получения значения, выбранного меню. */
int menu_select(void)
{   int c;
    printf("\nChoice one:\n1 - Show all\n2 - Add new\n3 - Edit title\n4 - Sort by country/name\n5 - Sort by country/element\n0 - exit\n> ");
        if (scanf("%d%*c",&c)!= 1) return -1;
    return c;
}

/* Ввод адреса в список. */
void enter(void)
{
  int slot;
  char s[80];
  int i=0, error=0;

  slot = find_free();

  if(slot==-1) {
    printf("\nList is full");
    return;
  }
  do{
  printf("Country: ");
  gets(el_list[slot].country);
    i=0;
  while (el_list[slot].country[i]){
        if(el_list[slot].country[i]>='0'&&el_list[slot].country[i]<='9'){
            printf("ERROR COUNTRY\n");
            error=1;
            el_list[slot].country[0] = '\0';
            return;
            break;
        }
    i++;
    }
  el_list[slot].country[0] = toupper(el_list[slot].country[0]);

  printf("El.name: ");
  gets(el_list[slot].name);
  i=0;
  while (el_list[slot].name[i]){
        if(el_list[slot].name[i]>='0'&&el_list[slot].name[i]<='9'){
            printf("ERROR NAME\n");
            error=1;
            el_list[slot].country[0] = '\0';
            return;
            break;
        }
    i++;
    }

  printf("Chem: ");
  gets(el_list[slot].chem);
  i=0;
  while (el_list[slot].name[i]){
        if  (el_list[slot].name[i]=='/' || el_list[1].name[i]=='*' || el_list[1].name[i]=='+' || el_list[1].name[i]=='-'){
            printf("ERROR NAME\n");
            error=1;
            el_list[slot].country[0] = '\0';
            return;
            break;
        }
    i++;
    }

  printf("Indx: ");
  gets(s);
  el_list[slot].zip = strtoul(s, '\0', 10);
  if (el_list[slot].zip==0 || el_list[slot].zip>99999){
      printf("ERROR INDEX\n");
      error=1;
      el_list[slot].country[0] = '\0';
      return;
      }
  }
  while (error==1);
}

/* Поиск свободной структуры. */
int find_free(void)
{
  register int t;
  for(t=0; el_list[t].country[0] && t<MAX; ++t) ;
  if(t==MAX) return -1; /* свободных структур нет */
  return t;
}

/* Вывод списка на экран. */
void list(void)
{
  register int t;
  int e=0;

printf("\n%s\nCOUNTRY                  NAME           NUMBER            CHEM\n%s\n", LINE, LINE);
  for(t=0; t<MAX; ++t) {
    if(el_list[t].country[0]) {
        e=1; printf("%-20s%-20s%05d%18s\n", el_list[t].country, el_list[t].name, el_list[t].zip, el_list[t].chem);
    }
    if (e==0){printf("EMPTY"); break; }
  }
  printf("\n%s\n", LINE);
  printf("\n\n");
}

/* Удаление адреса.*/
void delete(void)
{
  register int slot;
  char s[80];

  printf("vvedite # zapisi: ");
  gets(s);
  slot = atoi(s);

  if(slot>=0 && slot < MAX)
    el_list[slot++].country[0] = '\0';
}
Код:
 qsort(el_list, MAX, sizeof(el_list), country_cmp);
Мне кажется что проблема в MAX.

Такой вопрос. Конкретно в моём случае не нужно ли учитывать память при помощи malloc()? Хотя у меня сейчас всё отлично работает кроме сортировки.

Последний раз редактировалось enerlol; 26.11.2013 в 02:44.
enerlol вне форума Ответить с цитированием
Старый 26.11.2013, 05:21   #23
nikmoon
Форумчанин
 
Регистрация: 13.11.2013
Сообщений: 149
По умолчанию

Давай-ка думать уже начинай.
Во-первых, проверь и напиши сюда, чему равно sizeof(el_list).
Во-вторых, чему, по-твоему, должен быть равен третий аргумент функции qsort?
nikmoon вне форума Ответить с цитированием
Старый 26.11.2013, 18:33   #24
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Цитата:
Сообщение от nikmoon Посмотреть сообщение
Давай-ка думать уже начинай.
Во-первых, проверь и напиши сюда, чему равно sizeof(el_list).
Во-вторых, чему, по-твоему, должен быть равен третий аргумент функции qsort?
  • sizeof = 0
  • Потому что не присвоена память под динамическую структуру.
  • Третий аргумент принимает размеры элемента структуры.
  • Мне нужен malloc().
Куда и как его впихнуть моём случае?

Последний раз редактировалось enerlol; 27.11.2013 в 02:07.
enerlol вне форума Ответить с цитированием
Старый 26.11.2013, 19:59   #25
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Вставил в начало main()
Код:
  int count = 2;
  struct el *base;
  base = malloc(count * sizeof(el_list));
и изменил
Код:
qsort(base, count, sizeof(el_list), country_cmp);
Программа не крашит, но и не сортирует.

Так-же в википедии:
Код:
typedef struct person_t {
    char * name;
    int phone;
 } person_t;
Что это? Для массива и всей таблицы массивов одинаковое имя?
enerlol вне форума Ответить с цитированием
Старый 26.11.2013, 21:05   #26
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

Я же выделаю конкретно 2. Почему оно не сортирует для конкретно ДВУХ.
------
Я не знаю.
Перечитал уже больше двух десятков программ. Всё больше вопросов на которые не могу найти ответы.
Не могу найти адекватной литературы по си.
С преподавателя по практики тоже нечего взять, она только оценку снижает. На лекциях мы только начали проходить что такое структура, когда срок сдачи этой лабораторной работы у этого преподавателя уже истёк.
Или я много хочу или дела так не делают.
enerlol вне форума Ответить с цитированием
Старый 27.11.2013, 01:29   #27
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

При попытке вставить typedef к структуре віваливает несколько десятков
Код:
C:\Users\enerlol\Desktop\lab 2.1 05112013\lab 2.2 15112013\main.c|126|error: expected expression before 'el_list'|
enerlol вне форума Ответить с цитированием
Старый 27.11.2013, 02:37   #28
enerlol
Пользователь
 
Регистрация: 26.03.2011
Сообщений: 24
По умолчанию

sizeof(el_list) - 3000

Код:
int main(){

  char choice;
  int size;
  struct el *base;
  base = malloc(MAX * sizeof(el_list)); // чтоб уже наверняка 
  init_list(); // инициализация массива структур

                size = sizeof(el_list);
                printf("%d",size);

  while ( 1 ){
        choice = menu_select();
        switch ( choice ){
            case 1:
                list();
                break;
            case 2 :
                enter();
                break;
            case 3 :
                delete();
                enter();
                break;
            case 4: //count приезжает с функции enter() 
                qsort(base, count, sizeof(el_list[1].country), country_cmp); //sizeof(char[15])
                list();
                break;
            case 5:
                qsort(base, count, sizeof(int), zip_cmp);
                list();
                break;
            case 0:
                exit(0);
            default :
                printf("Wrong menu index!\n");
        }
    }
  free(el_list);
  return 0;
}
Результат нулевой.

Последний раз редактировалось enerlol; 27.11.2013 в 02:40.
enerlol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка по двум полям по выбору пользователя DerFluch C# (си шарп) 12 18.11.2012 00:00
count по двум полям _SERGEYX_ БД в Delphi 3 05.06.2012 17:44
фильтр по двум полям Alex003 Помощь студентам 2 03.12.2011 11:39
Отбор по двум полям MPa БД в Delphi 4 06.02.2008 20:14
Фильтрация по двум полям Dunkas БД в Delphi 11 21.01.2008 23:59