PDA

Visualizza la versione completa : [C++] Inserimento di un comando bash


fabio.gentile
16-04-2010, 22:43
Ciao a tutti!
problema, probabilmente piu` semplice di quel che sembra:
in un programma ho bisogno di utilizzare uno script bash col comando:


system("<comando per script>");

nell'utilizzarlo nel main() non mi da problemi, ma dal momento che lo utilizzo in una funzione definita esternamente al main() non funziona piu`ovvero se faccio:


main(){
funzione (arg1,arg2);
}
void funzione(bool arg1, int arg2){
...
system("<comando per script>");
}

il programma funziona lo stesso, ma non mi viene eseguito lo script

qualcuno sa dirmi perche`?
come posso ovviare a questo problema?
grazie

fcaldera
16-04-2010, 23:02
direi che il forum "programmazione" è più adatto
qui si parla di fogli di stile.

ti sposto

fabio.gentile
16-04-2010, 23:07
grazie.... sorry :zizi:

MItaly
16-04-2010, 23:44
Per capire meglio il problema sarebbe bene che tu postassi un po' più di codice, comunque provo ad indovinare: stai chiamando il comando bash tramite un percorso relativo, ma per qualche motivo prima della chiamata alla funzione hai cambiato directory corrente.

fabio.gentile
17-04-2010, 00:42
No tutto quanto e` nella stessa directory, il programma e` una battaglia navale il tentativo e` di colorare un po` il campo.
il fatto e` che nella prima scritta che sta nel main() funziona tutto a dovere, mentre nell'usare printGrid
non colora


questo e` il main del programma:


// battaglia navale, 2-10-2009

/* ancora da includere:

intelligenza artificiale
colori -> non funziona per la griglia!! indagare!!
contorni navi
nessun fuoco doppio -> fatto sia per utente che per pc

*/
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <vector>

using namespace::std;

#include "./data/player.h"
#include "./data/boat.h"

void printGrid (bool, player);

int main()

{
srand(time(0));
system ("./colore.sh blu");
cout << "Benvenuto in questo fantastico gioco di Battaglia Navale \n (ancora in fase di sviluppo - potrebbe ucciderti il gatto e svuotarti il conto in banca!) \n";
system ("./colore.sh");
player user;
player pc;

int vet[]={2,2,3,4,5};
int tot=16;
// sarebbe bello trovare il modo di vedere quante occorrenze di (ad esempio) x ci siano in un vettore
// in modo da vedere subito, dal vettore boats quanti colpi sono stati azzeccati.
pc.boatFiller(5);

int cheat = 0, x,y,o,c = 0;
int puntiuser = 0, puntipc = 0;
cout << "creare le barche in automatico? [0=no 1=si']\n";
cin >> x;

if (x == 0)
{
cout << "\nimmetti le coordinate delle tue navi!\n";
while (c<5)
{
//user.printGrid(1);
printGrid(1,user);
cout << "nave da " << vet[c] << "\nX: ";
cin >> x;
cout << "\nY: ";
cin >> y;
cout << "Orizzontale [1] o verticale [0]?: ";
cin >> o;
boat b(x-1,y-1,o,vet[c]);
if (user.addBoat(b)) {c++;}
else {
system ("sh data/colore.sh rosso"); //scrive in rosso richiamando lo script colore.sh
cout << "\n***********************************\n";
cout << "*valori invalidi: immetterne altri*\n";
cout << "***********************************\n" << endl;
system ("sh data/colore.sh"); //torna al colore di default (nero?)
}

}
}
else {user.boatFiller(5);}

cout << "\n COMINCIA IL GIOCO!!! \n";
cout << "\nLegenda:\n" << "O indica la presenza di una barca sul tuo quadrante\n" << "x indica un colpo in mare\n" <<
"# indica una nave colpita\n";
cout << "\n Per vincere devi totalizzare " << tot << " punti (ogni colpo a segno = 1 punto)\n";

while (true) // ciclo infinito (si ferma quando un giocatore totalizza "tot" punti)
{
cout << "\nle tue navi - hai " << puntiuser << " punti\n";
//user.printGrid(1);
printGrid(1,user);
cout << "\ncampo avversario - ha " << puntipc << " punti\n";
//pc.printGrid(cheat);
printGrid(cheat,pc);

bool controllo = 1;
while (controllo) {
cout << "\n dove vuoi colpire? \n";
cout << "\nX: ";
cin >> x;
cout << "\nY: ";
cin >> y;

//controlla che la posizione di sparo sia valida
if ( x <= 10 && x >= 1 && y <= 10 && y >= 1) { //controlla che lo sparo sia nel campo
if ( pc.grid[x-1][y-1] >= 2 ) //controlla che il punto di fuoco non fosse stato precedentemente colpito
cout << "Hai già sparato qui! Controlla la griglia!\n";
else
controllo=0;
}

else
cout << "Hai sparato fuori dal campo di gioco! Inserisci valori compresi tra 1 e 10!\n";
//cheat = 0;
//if ((x==0)and(y==0)) {cheat = 1;}
}

if (pc.fire(x-1,y-1)) //se il colpo e' andato a segno (pc.fire controlla le navi del pc nel punto di fuoco scelto dall'utente)
{
cout << "Hai colpito una nave!";
puntiuser++;
}

if (puntiuser == tot)
{
cout << "\n -->HAI VINTO!!!<-- \n";
break; // "rompe" il ciclo while di gioco
}

int xpc,ypc;

do
{
xpc = rand()%10;
ypc = rand()%10; }
while (user.getGrid(xpc,ypc)<2); //sceglie punti di fuoco a caso per il pc, a condizione che non siano stati gia' colpiti

if (user.fire(xpc,ypc))
{puntipc++;
cout << "Sei stato colpito!";}
if (puntipc == tot)
{
cout << "\n -->HAI PERSO!!!<-- \n";
break; // "rompe" il ciclo while di gioco
}
}

return 0;
}

void printGrid (bool show, player gioc)
{
cout << " 1 2 3 4 5 6 7 8 9 10\n";
for(int i=0; i<10 ; i++ ) //scorre verticalmente
{
if ( i<9 )
cout << " " << i+1;
else
cout << i+1;

for(int z=0; z<10 ; z++) //scorre orizzontalmente
{
if (gioc.getGrid(z,i) == 0) //mare!
{
system ("sh colore.sh blu");
cout << " _ ";
//system ("./colore.sh");
}

if ((gioc.getGrid(z,i) == 1) and (show == 1)) //barca
{
system ("sh colore.sh verde");
cout << " O ";
// system ("./colore.sh");
}

if ((gioc.getGrid(z,i) == 1) and (show == 0)) //barca invisibile - campo avversario!
{
system ("sh colore.sh blu");
cout << " _ ";
//system ("./colore.sh");
}

if (gioc.getGrid(z,i) == 2) //colpo a mare
{
system ("sh colore.sh giallo");
cout << " x ";
//system ("./colore.sh");
}

if (gioc.getGrid(z,i) == 3) //colpo a segno
{
system ("sh colore.sh rosso");
cout << " # ";
//system ("./colore.sh");
}
system ("sh colore.sh");
}

cout << "\n";
}
cout << "\n";
}


mentre questo lo script [colore.sh]:


#!/bin/bash


#BLUE=`tput setf 1`
#GREEN=`tput setf 2`
#CYAN=`tput setf 3`
#RED=`tput setf 4`
#MAGENTA=`tput setf 5`
#YELLOW=`tput setf 6`
#WHITE=`tput setf 7`

case $1 in

"rosso")
tput setf 5
;;

"verde")
tput setf 2
;;

"blu")
tput setf 1
;;

"ciano")
tput setf 3
;;

"giallo")
tput setf 6
;;

*)
tput sgr0
;;
esac
exit #

grazie :mame:

MItaly
17-04-2010, 13:57
Indipendentemente dal problema specifico, io eviterei la system per i soliti motivi e cambierei i colori del terminale con le normale sequenze di escape.

Loading