[C++] Problema con system() e Netbeans [RISOLTO]

alle.fabbri
Ciao a tutti.
Ho un problemino con la funzione system su windows. Il codice è
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main ()
{
  string  cmd2 = "ipconfig";          // mostra la configurazione ip
  system(cmd2.c_str());

  string file12open="c:\\testo.txt";              // apre il file testo.txt con il notepad
  string cmd1 = "notepad " + file12open;
  system(cmd1.c_str());
 
  string file2open="c:\\plot.ps";                 // apre plot.ps con gsview32
  string cmd = program2call + file2open;
  system(cmd.c_str());

  cout << cmd << endl;
  return 0;
}


Il mio problema è che le prime due chiamate di system funzionano mentre l'ultima restituisce l'errore di dos
"gsview32" non è riconosciuto come comando interno o esterno,
 un programma eseguibile o un file batch.

Mi sapete dire perchè? Penso che sia un problema del sistema e non del codice per questo ho aggiunto alle PATH di sistema la directory in cui si trova gsview32.exe....ma non è servito. La cosa strana è che se faccio partire il programma da linea di comando funziona, mentre da dentro all'IDE (uso Netbeans) mi da quell'errore....forse il problema è proprio Netbeans, se così fosse mi sapreste consigliare un buon IDE alternativo?
Grazie in anticipo.

Risposte
Rggb1
Probabilmente il searchpath è sbagliato/mancante. Prova a mostrarlo, dallo stesso programma che hai fatto (comando set o comando path), vedrai manca qualcosa.

[ Ma usare il path completo non ti va bene? ]

apatriarca
Forse NetBeans ridefinisce la variabile d'ambiente PATH. Non ho il plugin di NetBeans per sviluppare in C/C++, ma secondo me dovresti guardare nelle opzioni del progetto.

alle.fabbri
Grazie a tutti!

@Rggb
Già provato...non funziona.

@apatriarca
Non ho trovato nulla che assomigli a quello che mi suggerisci.

hamming_burst
forse e dico solo forse, usare le librerie solo proprie del C++, cioè senza lo standard del C con gli header .h

stdio.h in c++ mi sembra sia cstdio.

da provare.

Umby2
"alle.fabbri":

Il mio problema è che le prime due chiamate di system funzionano mentre l'ultima restituisce l'errore di dos


Le prime due chiamate sono funzioni di windows, pertanto i relativi file eseguibili sono all'interno delle classiche cartelle windows, e quindi presenti nel path.
La terza chiamata si tratta di un programma "non windows" pertanto ti conviene inserire il percorso completo del programma.

Se apri il "command prompt" ed esegui manualmente quella chiamata, vedrai che ti dara' lo stesso errore.

apatriarca
Nelle proprietà del progetto, sotto la voce Run, c'è la proprietà Environment. Prova a definire un nuovo path lì.

alle.fabbri
Grazie apatriarca. Funziona!!!

alle.fabbri
Ho editato il titolo.

Rggb1
@apatriarca
Nice shot.

@alle.fabbri:
"Rggb":
Probabilmente il searchpath è sbagliato/mancante.
Visto? ;)

Certo, mi rimane un dubbio: come mai non funziona con il path completo? Mi sembra molto strano. :?

alle.fabbri
Non ne ho idea... Per farti capire meglio, se chiamo
system("C:\\Programmi\\gsview32")    // supponendo che questa sia la path di gsview32.exe

mi restituisce l'errore di dos
"C:\Programmi" non è riconosciuto come comando interno o esterno, 
 un programma eseguibile o un file batch.

però si vede che è solo un problema di Netbeans (risolto da apatriarca...) perchè se eseguo il programma da linea di comando o da win funziona.
In ogni caso ragazzi....che delirio programmare....

hamming_burst
scusa ma l'errore non è perchè scrivi la path in modo sbagliato.

la suddivisione testuale del file system di win, utilizza la singola "\"

apatriarca
Ma per inserire una singola '\' in una stringa in C è necessario inserirne due. È forse invece possibile usare '/'.

Rggb1
"alle.fabbri":
Non ne ho idea... Per farti capire meglio, se chiamo
system("C:\\Programmi\\gsview32")    // supponendo che questa sia la path di gsview32.exe

mi restituisce l'errore di dos
"C:\Programmi" non è riconosciuto come comando interno o esterno, 
 un programma eseguibile o un file batch.

Può essere, mi torna: system() probabilmente ha bisogno del file naming convertito nel formato compatibile (a-la-DOS, per intendersi) quindi il path di cui sopra sarà in realtà C:\PROGRA~1\gsview.exe (assumo che il naming sia questo, puoi vedere qual è da prompt, con il comando dir). Prova pure.

@apatriarca
Non credo accetti il carattere "/" per lo stesso motivo sopra detto (ma può anche essere).

apatriarca
Io credo che l'errore sia un altro. È possibile che NetBeans esegua il programma in un "ambiente protetto". In cui non sia cioè possibile accedere a qualsiasi cartella del sistema, ma solo ad alcune.

Rggb1
Però se fosse come tu dici mi aspetterei un errore differente... conclusione: boh. Tutto può essere nello strano mondo di \$Finestre\$ :-D

apatriarca
"Rggb":
Però se fosse come tu dici mi aspetterei un errore differente... conclusione: boh. Tutto può essere nello strano mondo di \$Finestre\$ :-D

NetBeans appartiene più che altro al mondo Java e non è del tutto compatibile con gli strumenti di sviluppo nativi di Windows (usa cygwin oppure mingw attraverso msys). Non è quindi proprio colpa del sistema operativo di Microsoft in questo caso. Gli IDE nativi di Windows (come Visual Studio o C++ Builder) o anche quelli multipiattaforma come Code::Blocks non dovrebbero avere questo genere di problemi.

abral
Io consiglio vivissimamente di non utilizzare funzioni non multipiattaforma quando non è strettamente necessario farlo. La funzione system è qualcosa da aborrire!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.