• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Enum w C ... jak używać?

Object Storage Arubacloud
0 głosów
678 wizyt
pytanie zadane 28 grudnia 2019 w C i C++ przez Hubertius Bywalec (2,970 p.)
edycja 28 grudnia 2019 przez Hubertius

Cześć

Muszę wykorzystać enum przy wyborze przez użytkownika sortowania tabeli w sposób rosnący i malejący.

Sam projekt składa się oprócz main.c jeszcze z header-a i pliku .c opisującego pewne funkcje z danego header-a.

Tak więc zadeklarowałem enum-a w headerze:

#ifndef sort
#define sort
int bubble_sort_asc(int tab[], int size);
int bubble_sort_desc(int tab[], int size);
int bubble_sort(int tab[], int size, enum direction dir);

#endif
enum direction {ASCENDING=1,DESCENDING=2};

, a tutaj kod z pliku main.c

#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"
#include  "sort.h"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) 
{
	
    int stop_value=0;
    int vec1[50]={0};
    int size=50;
    int newsize;
    int temp=0;
    //printf("Twoj pierwszy dzialajacy projekt.\n Wprowadz dane swojej tablicy\n UWAGA! Pamietaj, ze tablica zakonczy wczytywanie danych przy wprowadzeniu zera!\n");
    printf("Podaj wektor:\n");
    newsize=read_vector(vec1,size,stop_value);
    if(newsize==-2)
    {
        printf("Incorrect input");
        return 1;
    }
    if(newsize==-1 && vec1[0]==0)
    {
        printf("Not enough data available");
        return 3;
    }
    printf("Podaj kierunek:");
    enum direction wybor;
    if(scanf("%d",&wybor)!=1)
    {
    	printf("Incorrect input");
        return 1;	
    }
    if(wybor==ASCENDING)
    {
    	
	}
	else if(wybor==DESCENDING)
	{
		
	}
	else
	{
		printf("Incorrect input data");
		return 2;
	}
	bubble_sort(vec1,newsize,direction wybor);
    //display_vector(vec1,newsize);
    return 0;
}

Niestety, przy próbie wywołania funkcji  pojawia mi się komunikat o tym, ze enum nie zostało zadeklarowane. Co zrobiłem źle? Wcześniej np. Incorrect input data wyświetla się poprawnie dla złych danych.   :/

EDIT

Obecnie przy takim zastosowaniu dla header-a:

#ifndef sort
#define sort
typedef enum{
	ASCENDING=1,DESCENDING=2
}direction;
#endif
int bubble_sort_asc(int tab[], int size);
int bubble_sort_desc(int tab[], int size);
int bubble_sort(int tab[], int size, enum direction dir);

W mian-ie wyświetla mi się komunikat:"storage size of wybor isn't know". Bardzo proszę o pomoc, to ważne bym mógł popchnąć to zadanie do przodu.   :/

 

2 odpowiedzi

0 głosów
odpowiedź 28 grudnia 2019 przez pcalus Użytkownik (920 p.)
wybrane 28 grudnia 2019 przez Hubertius
 
Najlepsza

Usuń direction z wywołania:

bubble_sort(vec1,newsize,direction wybor);

 

Możesz użyć takiej konstrukcji:

typedef enum direction {ASCENDING=1,DESCENDING=2} direction;

Dzięki temu możesz uzywać direction jako typu, zamiast enum direction.

komentarz 28 grudnia 2019 przez Hubertius Bywalec (2,970 p.)
@pcalus Bardzo dziękuję. Miałbym jeszcze jedno pytanie. Jaki łańcuch formatujący jest poprawny dla enum?
0 głosów
odpowiedź 28 grudnia 2019 przez mokrowski Mędrzec (155,460 p.)

Po pierwsze nagłówek. Pierwotnie:

#ifndef sort
#define sort
int bubble_sort_asc(int tab[], int size);
int bubble_sort_desc(int tab[], int size);
int bubble_sort(int tab[], int size, enum direction dir);
 
#endif
enum direction {ASCENDING=1,DESCENDING=2};

Pierwszy błąd to nazywanie makra strażniczego tak jak funkcja. Tak więc poprawka:

#ifndef SORT_H_
#define SORT_H_
int bubble_sort_asc(int tab[], int size);
int bubble_sort_desc(int tab[], int size);
int bubble_sort(int tab[], int size, enum direction dir);
 
#endif /* SORT_H_ */
enum direction {ASCENDING=1,DESCENDING=2};

Drugi błąd to brak definicji typu enum direction w ramach ciała nagłówka. Tak więc poprawka:

#ifndef SORT_H_
#define SORT_H_

enum direction {ASCENDING=1,DESCENDING=2};

int bubble_sort_asc(int tab[], int size);
int bubble_sort_desc(int tab[], int size);
int bubble_sort(int tab[], int size, enum direction dir);
 
#endif /* SORT_H_ */

To na początek. W linii 47 main(), masz błąd składni. Powinno być:

bubble_sort(vec1, newsize, wybor);

 

komentarz 28 grudnia 2019 przez Hubertius Bywalec (2,970 p.)
Tak, dosłownie paręnaście minut temu to ogarnąłem i zadanie zostało mi zaliczone. Jednak na analizie statycznej pokazuje mi błąd z łańcuchem formatującym w scanf. Jaki jest poprawny dla enum?
1
komentarz 28 grudnia 2019 przez mokrowski Mędrzec (155,460 p.)
Oczywiście że "%u". I tu pojawia się inny problem (w prawdziwych aplikacjach). Możesz równie dobrze wprowadzić 20 i scanf(...) to przyjmie. No ale takie przypadki sprawdza się w logice programu co nie jest potrzebne w sprawdzarkach typu SPOJ czy podobnych.

Podobne pytania

0 głosów
2 odpowiedzi 1,108 wizyt
pytanie zadane 29 sierpnia 2016 w Inne języki przez niezalogowany
0 głosów
2 odpowiedzi 1,922 wizyt
0 głosów
1 odpowiedź 647 wizyt
pytanie zadane 23 grudnia 2017 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...