Nowe posty

Autor Wątek: Zmienna w lini poleceń (C++)  (Przeczytany 7245 razy)

Offline Michał Tomaszewski

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 417
    • Zobacz profil
Zmienna w lini poleceń (C++)
« dnia: 2005-12-16, 22:10:46 »
Mam Problemz dyskiem a konkretnie za każdym razem jak restartuje system to BIOS nie wykrywa mi dysku - aby działał musze kompa wyłączć i włączyć. Czy to wina linuksa? na windowsie sie tak nie robiło! Mam mandriwe 2006, kontroler firmy (firmy??) SYMBIOS opis: 53c875 (w harddraku tak pisze), nazwa modułu to:  ‎sym53c8xx, dysk twardy:   ‎IBM DNES-309170W. Czy da się zrobić coś aby dysk był widziany przez BIOS po restarcie kompa. POZDRAWIAM!

Offline Michał Tomaszewski

  • Users
  • Prawie jak Guru
  • ****
  • Wiadomości: 417
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #1 dnia: 2005-12-16, 22:29:15 »
> pisze), nazwa modułu to:  ‎sym53c8xx, dysk twardy:   ‎IBM DNES-309170W.

Jakieś głupie dziwne znaczki mi wyskczyły a konkretnie te
‎ nie wiem co to :P

Offline Tadeusz Gruszczyński

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 173
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #2 dnia: 2005-12-16, 19:34:28 »
Prośba o podanie prostego rozwiązania.

Z poziomu programu wydaję przyciskiem polecenie
uruchomienia zewnętrznego programu (lub skryptu)
prez:
{
system ("nazwa_programu PARAMETR")
.....
}
PARAMETR jest wprowadzony wcześniej z klawiatury
jako zmienna.
Jakim sposobem mam dołaczyć do polecenia systemowego tą ZMIENNA, aby była czytana nie jak tekst, ale jako wartość.

Z góry dziekuje za konstruktywne odpowiedzi.

Offline xis

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 1049
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #3 dnia: 2005-12-16, 19:40:25 »
Nie jestem pewien czy dobrze Cię zrozumiałem, ale chyba chcesz przekształcić parametr będący zmienną typu string (a konkretniej char*) na numer, tak?

Jeśli tak, to zainteresuj się f-cją :

int atoi(const char *nptr);

Więcej o niej (i jej podobnych) dowiesz się z 'man 3 atoi'.
Everything should be made as simple as possible, but not simpler
-- Albert Einstein

Offline Tadeusz Gruszczyński

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 173
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #4 dnia: 2005-12-16, 20:23:37 »
> Nie jestem pewien czy dobrze Cię zrozumiałem, ale chyba chcesz przekształcić parametr będący
 > zmienną typu string (a konkretniej char*) na numer, tak?
 
* pewnie źle zasugerowałem.

np. (w uproszczeniu) chcę wykonać program po wciśnieciu przycisku:
sox -t raw NAZWA_PCM -t wav NAZWA_WAV

Zmienną: NAZWA_PCM i NAZWA_WAV
wpiszę z klawiatury lub pobiorę z listy okienkowej plików. A potem chcę wyjść do systemu i wykonąć:
to polecenie:
system ("sox -t raw NAZWA_PCM -t wav NAZWA_WAV"), gdzire pod zmienną będą nazwy plików jako zmienne.

Offline Tadeusz Gruszczyński

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 173
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #5 dnia: 2005-12-16, 20:26:40 »
system ("sox -t raw NAZWA_PCM -t wav NAZWA_WAV")

Jak wykonam to polecenie tak jak piszę to mi wyrzuca komunikat:  nie ma takiego pliku NAZWA_PCM
W tym przypadku NAZWA_PCM to zmienna przechowująca nazwę pliku.

Offline xis

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 1049
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #6 dnia: 2005-12-16, 20:35:31 »
Aaa, już rozumiem :)

Musisz wykonać formatowanie stringu np. tak:

---
char komenda[4096]; // 4 kilo powinno wystarczyć

sprintf( komenta, "sox -t raw %s  -t wav %s",
 NAZWA_PCM, NAZWA_WAV );
system( komenda );
---

Jak widzisz, powołaliśmy do życia nową zmienną (tablicę znaków) i za pomocą sprintf wstawiliśmy w nią odpowiednie wartości z innych zmiennych. Jeśli np. NAZWA_PCM będzie miała wartość "foo", a NAZWA_WAV będzie równa "bar", to program wykona
system( "sox -t raw foo -t wav bar" );

Tak działa %s w sprintf. Poczytaj mana o tej komendzie jeśli chcesz poznać inne tricki związane z formatowaniem stringów.

PS Ciągi znakowe w C reprezentowane przez tablicą muszą kończyć się ostatnim elementem = '0', czyli pustym znakiem. Sprintf sam dba o takie rzeczy - więcej w manualu.
Everything should be made as simple as possible, but not simpler
-- Albert Einstein

Offline Tadeusz Gruszczyński

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 173
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #7 dnia: 2005-12-16, 21:05:40 »
Wielkie DZIĘKUJĘ. Przeanalizuję i zastosuję.

Offline Sebastian Chyba zartujecie

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 191
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #8 dnia: 2005-12-16, 22:04:50 »
2005-12-16 19:34:28 Tad napisał:

> Prośba o podanie prostego rozwiązania.
 >
 > Z poziomu programu wydaję przyciskiem polecenie
 > uruchomienia zewnętrznego programu (lub skryptu)
 > prez:
 > {
 > system ("nazwa_programu PARAMETR")
 > .....
 > }
 > PARAMETR jest wprowadzony wcześniej z klawiatury
 > jako zmienna.
 > Jakim sposobem mam dołaczyć do polecenia systemowego tą ZMIENNA, aby była czytana nie jak
 > tekst, ale jako wartość.
 >
 > Z góry dziekuje za konstruktywne odpowiedzi.


Witam!

Przestrzegam przed mieszaniem C i C++. Jest do dosyć mało profesjonalne, a podstawowe nawyki należy sobie wyrabiać od samego początku!
sprintf() używane jest w programach C. Daje się wykorzystać w C++, ale nie ma sensu gdyż jest o wiele lepsza i mądrzejsza klasa String, która sama troszczy się o zajęcie odpowiedniej ilości miejsca w pamięci (więc odpada Ci limit tych 4kB, ktore bycmoże program niepotrzebnie zaallokował - może akurat będzie potrzebne tylko 100 bajtów? String się o to zatroszczy i zaallokuje tyle ile będzie trzeba :) )

Oto przykładowy program:
using namespace std;
#include
#include

int main(int argc, char *argv[])
{
        string argumenty[2];            //tablica stringów
        argumenty[0] = argv[1];         //ten element będzie zawierał to co jest w argv[1];
        argumenty[1] = argv[2];         //A ten to co w argv[2];
        string Napis;                   //tu będzie siedział nasz napis
        Napis = "nazwa_programu " + argumenty[0] + " -f dupa " +  argumenty[1]; //prosta jak drut operacja łączenia
        cout << "system(" << Napis << ");n";   //wypisywanie (Ty chcesz co innego, ale się zorientujesz :P)
        system(Napis.c_str());          //metoda c_str zwraca tradycyjny string używany w C, bo system tylko to łyka
        return 0;
}


A tutaj znajdziesz więcej informacji jak używać klasy string :)
http://www.msoe.edu/eecs/cese/resources/stl/string.htm

Offline xis

  • Global Moderator
  • Guru
  • *****
  • Wiadomości: 1049
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #9 dnia: 2005-12-16, 22:13:12 »
Rzeczywiście, nie zwróciłem uwagi, że to C++ i myślałem cały czas, że mowa o C :)
Dzięki devilan.
Ale apropos tych 4k to akurat tutaj tablica będzie alokowana na stosie, więc niezależnie od tego ile zajmie, zniknie po wykonaniu f-cji. Fakt, że Stringi są bardziej eleganckie, no i tu nie trzeba się martwić o przepełnienie tych czterech kilo :)

Pozdrawiam
Everything should be made as simple as possible, but not simpler
-- Albert Einstein

Offline Tadeusz Gruszczyński

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 173
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #10 dnia: 2005-12-16, 22:26:31 »
Rzeczywiście, ale ze mnie gapa. sam nie wiem czemu tak nie pomyslałem, a to przecież mozna tak było od razu zrobić. Ale tak czasem się niestety zdarza.

Jeszcze raz dziekuję wam za pomoc

Offline Tadeusz Gruszczyński

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 173
    • Zobacz profil
Zmienna w lini poleceń (C++)
« Odpowiedź #11 dnia: 2005-12-16, 22:53:07 »
system(Napis.c_str());
Ta funkcja zdała egzamin.
Polecenie prawidłowo przekazałem do powłoki.

Pozdrawiam.