Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    inserimento di un comando bash in c++

    Ciao a tutti!
    problema, probabilmente piu` semplice di quel che sembra:
    in un programma ho bisogno di utilizzare uno script bash col comando:
    codice:
     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:
    codice:
    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
    se qualcosa puo` andare storto lo fara`

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    direi che il forum "programmazione" è più adatto
    qui si parla di fogli di stile.

    ti sposto
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    grazie.... sorry
    se qualcosa puo` andare storto lo fara`

  4. #4
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    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:
    codice:
    // 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]:
    codice:
    #!/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
    se qualcosa puo` andare storto lo fara`

  6. #6
    Indipendentemente dal problema specifico, io eviterei la system per i soliti motivi e cambierei i colori del terminale con le normale sequenze di escape.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.