[C] Uproszczony bash 3078 13

O temacie

Autor Anonymized

Zaczęty 1.06.2014 roku

Wyświetleń 3078

Odpowiedzi 13

Anonymized

Anonymized

Użytkownicy
posty2957
Propsy6115
NagrodyV
Profesjabrak
  • Użytkownicy
Piszę program na zaliczenie przedmiotu - względnie prosty, ale przyda się pomoc.
Treść zadania: zad1. http://brain.umcs.lublin.pl/~rzookol/systemy_2014/zadanie_zaliczeniowe_2014.pdf
Kod na chwilę obecną wygląda tak: https://www.dropbox.com/s/0jpob5fay5ojj4j/shell.h
Koduję na tym pliku, więc jest on stale aktualizowany.

Pierwszy problem jaki mam jest w main. Po skompilowaniu programu, cokolwiek bym nie wpisał zawsze wywołuje w switchu case 1. Nie mam pojęcia jakim prawem. Widzicie w kodzie coś nie tak?
Brak mi też na razie pomysłu na pobieranie polecenia z argumentami. A tym bardziej połączenie tego ze strumieniami wejścia/wyjścia.
Ogółem - czego nie widzicie w programie, lub macie lepszy pomysł - możecie się nim podzielić. Wdzięczność i propsy gwarantowane :D

 

Drock

Drock

Użytkownicy
posty357
Propsy75
ProfesjaProgramista
  • Użytkownicy
daj pod tym :
icmd=cmd2int(cmd);
wypisanie wartości zmienej icmd
 

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
int cmd2int(char cmd[]) {   
 if(cmd="cd") return 1;   
 else if(cmd="run") return 2;   
  else if(cmd="history") return 3;   
 else if(cmd="quit") return 0;
}

Dlaczego w tych warunkach dajesz po jednym znaku równości? (Ja się tam na C nie znam ale zazwyczaj powinno się chyba dawać dwa razy ==)

Chociaż gdyby tu tkwił problem pewnie wywalałoby błąd...
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator

inż. Avallach
Administrator

[C] Uproszczony bash
#3 2014-06-01, 09:55(Ostatnia zmiana: 2014-06-01, 11:37)
Nie wywalałoby, w C przypisanie w warunku jest w pełni legalne (chociaż często jest pomyłką, tak jak tutaj).
Swoją drogą nawet jak dasz == to porówna ci tylko czy oba wskaźniki wskazują na to samo miejsce w pamięci (cmd i "cd" itd). Oczywiście nigdy nie będą, bo pierwsza tablica to wynik skanowania z klawiatury, a druga to wartość hardcodowana. Musisz albo porównywać je jako stringi, albo napisać własną metodę która iteruje po znakach i sprawdza je po kolei.

Obawiam się że jak robisz takie błędy to to zadanie może być poza twoim zasięgiem :D

@down: właśnie strcmp miałem na myśli przez porównywanie jako stringi :D

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
Cytuj
Musisz albo porównywać je jako stringi, albo napisać własną metodę która iteruje po znakach i sprawdza je po kolei.
Można użyć funkcji strcmp:
if(strcmp(cmd,"cd") == 0) return 1;

No i, nie pisz funkcji main w pliku nagłówkowym :D

Anonymized

Anonymized

Użytkownicy
posty2957
Propsy6115
NagrodyV
Profesjabrak
  • Użytkownicy
Cytuj
Dlaczego w tych warunkach dajesz po jednym znaku równości?
Całe życie to samo :facepalm: dzięki.
Widzę dla strcmp o wiele więcej zastosowań, dzięki :lol:

Cytuj
Obawiam się że jak robisz takie błędy to to zadanie może być poza twoim zasięgiem :D
Przestań :lol2:
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
się zastanawiam czemu nie widzę za bardzo błędów, a to już poprawione :D
 
Popisuje się ciągle menda jedna...

Anonymized

Anonymized

Użytkownicy
posty2957
Propsy6115
NagrodyV
Profesjabrak
  • Użytkownicy
Tak, kompiluje się nawet :lol2: Na razie jednak jedyna w pełni działająca funkcja to historia.
Mam pewien pomysł na pobieranie funkcji z argumentami, ale nie mam pojęcia czy to zadziała i będzie działać wraz z "" do nazw ze spacjami. Można podzielić każdy wyraz na dynamicznie alokowaną dwuwymiarową tablicę charów. char[0][0] na polecenie. char[1][0] na argumenty itd. Co o tym myślicie?
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
stringów używać nie możesz? :lol2:
 
Popisuje się ciągle menda jedna...

Anonymized

Anonymized

Użytkownicy
posty2957
Propsy6115
NagrodyV
Profesjabrak
  • Użytkownicy

Anonymized

[C] Uproszczony bash
#9 2014-06-02, 21:42(Ostatnia zmiana: 2014-06-03, 16:58)
nope

@down: przełamałem się
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
To musi być czysty C, czy jak?
 
Popisuje się ciągle menda jedna...

Anonymized

Anonymized

Użytkownicy
posty2957
Propsy6115
NagrodyV
Profesjabrak
  • Użytkownicy

Anonymized

[C] Uproszczony bash
#11 2014-06-03, 15:52(Ostatnia zmiana: 2014-06-03, 19:18)
http://www.dropbox.com/s/0jpob5fay5ojj4j/shell.h
Dziwnie mi się zapętla te pobieranie polecenia :I

Screen:
https://www.dropbox.com/s/ad2fglqhqkd104j/Zrzut%20ekranu%202014-06-03%2017.23.26.png
Te nowe linie po argumentach niczego nie zepsują? :I
 

Adanos

Adanos

Administrator
Szara eminencja
posty5204
Propsy3870
ProfesjaProgramista
  • Administrator
  • Szara eminencja
int main() {
   const MAX_SIZE = 1024;
    char command[MAX_SIZE];
    int icmd=1;
    char * cmd;
    char * arg1;
    char * arg2;
    char * arg3;
    char * saveptr;


    while (icmd != 0) {                                 //główna pęta do wczytywania komendy;
        printf("./Przykladowa Sciezka/\$:");

        fgets(command, MAX_SIZE, stdin);                    //pobieranie polecenia
        history(command);

        cmd=strtok(command,"' ' ,.-");
        printf("Komenda: %s\n",cmd);
        arg1=strtok(NULL," ,.-");
        printf("Argument 1: %s\n",arg1);
        arg2=strtok(NULL," ,.-");
        printf("Argument 2: %s\n",arg2);
        arg3=strtok(NULL," ,.-");
        printf("Argument 3: %s\n",arg3);

        icmd=cmd2int(cmd);                              //icmd = wersja int polecenia
        switch(icmd) {                                  //obsługa polecenia
            case 1: //cd
                chdir(arg1);
                break;
            case 2: //run
                //run(arg1,arg2...);
                break;
            case 3: //history
                showhistory();
                break;
            case 4: //
                break;
            case 0:
                icmd=0;
                break;
            default:
                printf("Take polecenie nie istnieje\n");
                break;
            }
        printf("\n");

    }

return 0;
}

Anonymized

Anonymized

Użytkownicy
posty2957
Propsy6115
NagrodyV
Profesjabrak
  • Użytkownicy
Dzięki wielkie, MAX_SIZE załatwia przy okazji wiele innych rzeczy. Teraz jednak strtok działa jak trzeba, ale dopisuje znaki nowej linii, jeżeli nie znajdzie kolejnego argumentu. To niestety wszystko psuje :C
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry