Forum Linux.pl
Programowanie => C/C++ => Wątek zaczęty przez: Małolat w 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!
-
> 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
-
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.
-
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'.
-
> 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.
-
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.
-
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.
-
Wielkie DZIĘKUJĘ. Przeanalizuję i zastosuję.
-
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
-
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
-
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
-
system(Napis.c_str());
Ta funkcja zdała egzamin.
Polecenie prawidłowo przekazałem do powłoki.
Pozdrawiam.