RISOLTO Avviare progetto C++ da prompt dei comandi

Stato
Discussione chiusa ad ulteriori risposte.

Peri

Nuovo Utente
82
3
Salve gente
Ho scritto con Visual Studio un programmino che legge un file txt, analizza il suo contenuto e ne crea un altro con dentro suddette analisi.
Ora dovrei fare questo giochetto per tutti i file presenti in una cartella.
La mia idea era: scrivere un file batch che aziona automaticamente l'eseguibile su tutti i file txt presenti in una cartella (l'output sarà messo in un'altra cartella)
Abbastanza lineare direi ?
Nota: la scelta della cartella la fa il programma stesso, infatti esiste una specifica cartella di input e di output (quindi non si passa per input)

Per dirla breve ho fatto sì che il main del progettino (scritto in C++) ammetta i tipici input argc argv
Così facendo si concede la possibilità di eseguire il programma passandogli degli input.
In particolare quindi il file batch dovrebbe chiamare l'eseguibile con il nome del file.

La domanda è: come realizzo un file batch del genere?
Dunque io mi sono letto qualche cosina e a naso direi di fare un ciclo for dove la variabile è il nome del file presente nella cartella. Questa è l'idea, ma comunque rimane la domanda, come?
Per giunta temo di essermi dimenticato come si avvia manualmente l'eseguibile passandogli gli input.

DOMANDA BONUS PER VISUAL STUDIO
L'altra domanda è più specifica e breve... Visual Studio mi dice che è un errore mettere dei parametri nel main, probabilmente perché c'è un luogo dove dovrei appunto scriverli ma che non trovo perché sono cretino.
Pertanto non termina la compilazione e quindi non mi genera l'eseguibile che mi serve, come fo?
 

BrutPitt

Utente Attivo
1,166
1,262
DOMANDA BONUS PER VISUAL STUDIO
L'altra domanda è più specifica e breve... Visual Studio mi dice che è un errore mettere dei parametri nel main, probabilmente perché c'è un luogo dove dovrei appunto scriverli ma che non trovo perché sono cretino.
Pertanto non termina la compilazione e quindi non mi genera l'eseguibile che mi serve, come fo?
Posso farti io una domanda?
Come mai sei cosi' restio nel pubblicare le tue righe di codice?

Dico questo perche' e' gia' accaduto che tui preferissi descrivere,anche prolissamente, "a parole", il tuo codice, piuttosto che darci modo di analizzarlo direttamente (cosa che ci avrebbe decisamente facilitato il compito di aiutarti).

Ora, se avessi inserito il tuo "prototipo" di main, si sarebbe capito immmediatamente se fosse stato un errore di sintassi o un problema di configurazione di progetto (hai scelto "Console" come tipologia dell'eseguibile?, altrimenti il compilatore si aspetta WinMain, non main)

Se invece fosse un errore di sintassi, la dichiarazione corretta avrebbe la forma:
C++:
int main(int argc, char** argv)
// o nell'analoga connotazione
int main(int argc, char* argv[])

Ma soprattutto, qual'e' l'errore che ti restituisce il compilatore?
(questo aiuterebbe non poco)

Per giunta temo di essermi dimenticato come si avvia manualmente l'eseguibile passandogli gli input.
In che senso?
Intendi, da prompt dei comandi:
> pincopallino.exe parametro_1 parametro_2 parametro_3 ...
(basta separarli da uno spazio)

Ma questo dipende da chi ha sviluppato il programma, se ha inserito dei "tag" di identificazione potrebbe essere nella forma:
> pincopallino.exe -a parametro_1 -b parametro_2 -c parametro_3 ...

Se intendevi invece i parametri del tuo programma, i parametri:
> pincopallino.exe parametro_1 parametro_2 parametro_3 ...
vengono acquisiti consecutivamente in argv e il conteggio degli stessi e' in argc (nome del programma compreso)

Stessa cosa se fosse .bat o .cmd, ed internamente i parametri si acquisiscono con %1, %2, %3 ... etc

P.S.
Credo che sia un argomento piu' inerente la programmazione (@DispatchCode @BAT)
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
Salve gente
Ho scritto con Visual Studio un programmino che legge un file txt, analizza il suo contenuto e ne crea un altro con dentro suddette analisi.

Toh, un tutorial che spiega come usare i tool cli installati con VS https://riptutorial.com/cplusplus/example/5959/compiling-with-visual-cplusplus--command-line-

Comunque sia, VS compila il programma C++ in un exe e quello puoi spostarlo dove ti pare ed eseguirlo dal terminale. Attenzione alle dll se decidessi di portarlo su un altro computer. Ma mi pare di capire che lo userei sullo stesso pc dove l'hai scritto.

DOMANDA BONUS PER VISUAL STUDIO
L'altra domanda è più specifica e breve... Visual Studio mi dice che è un errore mettere dei parametri nel main, probabilmente perché c'è un luogo dove dovrei appunto scriverli ma che non trovo perché sono cretino.
Pertanto non termina la compilazione e quindi non mi genera l'eseguibile che mi serve, come fo?

Si, esiste un posto dove mettere gli argomenti https://dailydotnettips.com/how-to-pass-command-line-arguments-using-visual-studio/
 
  • Mi piace
Reazioni: Peri

Peri

Nuovo Utente
82
3
Posso farti io una domanda?
Come mai sei cosi' restio nel pubblicare le tue righe di codice?

Dico questo perche' e' gia' accaduto che tui preferissi descrivere,anche prolissamente, "a parole", il tuo codice, piuttosto che darci modo di analizzarlo direttamente (cosa che ci avrebbe decisamente facilitato il compito di aiutarti).

Ora, se avessi inserito il tuo "prototipo" di main, si sarebbe capito immmediatamente se fosse stato un errore di sintassi o un problema di configurazione di progetto (hai scelto "Console" come tipologia dell'eseguibile?, altrimenti il compilatore si aspetta WinMain, non main)

Se invece fosse un errore di sintassi, la dichiarazione corretta avrebbe la forma:
C++:
int main(int argc, char** argv)
// o nell'analoga connotazione
int main(int argc, char* argv[])

Ma soprattutto, qual'e' l'errore che ti restituisce il compilatore?
(questo aiuterebbe non poco)


In che senso?
Intendi, da prompt dei comandi:
> pincopallino.exe parametro_1 parametro_2 parametro_3 ...
(basta separarli da uno spazio)

Ma questo dipende da chi ha sviluppato il programma, se ha inserito dei "tag" di identificazione potrebbe essere nella forma:
> pincopallino.exe -a parametro_1 -b parametro_2 -c parametro_3 ...

Se intendevi invece i parametri del tuo programma, i parametri:
> pincopallino.exe parametro_1 parametro_2 parametro_3 ...
vengono acquisiti consecutivamente in argv e il conteggio degli stessi e' in argc (nome del programma compreso)

Stessa cosa se fosse .bat o .cmd, ed internamente i parametri si acquisiscono con %1, %2, %3 ... etc

P.S.
Credo che sia un argomento piu' inerente la programmazione (@DispatchCode @BAT)

Ho scritto qui perché domandavo cose relative a Visual Studio e i file batch, pensavo fosse competenza della sezione Windows.

Mi sono accorto ora che non mi dà un errore di compilazione ma di Debug perché appunto non ho detto a VS quali siano i parametri del main.
Il codice C++ dovrebbe essere impeccabile ma comunque eccolo qui:
C++:
#include "my_header.h" //header che permette di raggiungere tutte le dichiarazioni e referenze del progetto

#include <string.h> //necessario per i parametri del main



int main(int argc, char** argv)

{

  // trasformo i parametri negli input inseriti manualmente nel codice

    char str[] = "Data/";

    char out[] = "Output/";

    strcat(str, argv[1]);

    strcat(out, argv[1]);

  // { . . . } codice funzionante inserendo manualmente i parametri nel codice

    return 0;

}

Se si è curiosi ecco l'errore generato dal debugger
Eccezione generata in corrispondenza di 0x00007FF9F981D1EA (ucrtbased.dll) in THESIS_newmethod.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0x0000000000000000.
Il progetto è stato creato con la seguente procedura di Visual Studio
- Crea un nuovo progetto
- Progetto Vuoto (C++, Windows, Console)
- opzione: inserisci progetto e soluzione nella stessa directory

Ok quindi non mi preoccupo più di tanto visto che la compilazione è avvenuta e, suppongo, sia stato generato anche l'eseguibile.
In che senso?
Intendi, da prompt dei comandi:
> pincopallino.exe parametro_1 parametro_2 parametro_3 ...
(basta separarli da uno spazio)
Good, ora manca solo il problema con il file batch perché adesso dovrebbe dire tipo:
Codice:
pincopalla.exe file.txt //per ogni file.txt presente nella directory
E non ho idea di come scriverlo
Post unito automaticamente:

Toh, un tutorial che spiega come usare i tool cli installati con VS https://riptutorial.com/cplusplus/example/5959/compiling-with-visual-cplusplus--command-line-

Comunque sia, VS compila il programma C++ in un exe e quello puoi spostarlo dove ti pare ed eseguirlo dal terminale. Attenzione alle dll se decidessi di portarlo su un altro computer. Ma mi pare di capire che lo userei sullo stesso pc dove l'hai scritto.



Si, esiste un posto dove mettere gli argomenti https://dailydotnettips.com/how-to-pass-command-line-arguments-using-visual-studio/
Grande, sono diventato matto a cercare qualcuno che ne abbia già parlato.
Ora rimane da capire solo come va scritto il file batch
 
Ultima modifica:

BrutPitt

Utente Attivo
1,166
1,262
Mi sono accorto ora che non mi dà un errore di compilazione ma di Debug perché appunto non ho detto a VS quali siano i parametri del main.


Se si è curiosi ecco l'errore generato dal debugger
Eccezione generata in corrispondenza di 0x00007FF9F981D1EA (ucrtbased.dll) in THESIS_newmethod.exe: 0xC0000005: violazione di accesso durante la lettura del percorso 0x0000000000000000.
Non e' questione di essere curiosi, e' che se avessi postato immediatamente l'errore avrebbe agevolato l'analisi senza dover fare "ipotesi" al buio
Inizialmente avevo pensato anche io a questa causa, ma poi aggiunge che non gli termina la compilazione generando un errore....
(sei stato decisamente piu' lungimirante ?)

Per questo scrivevo che la pubblicazione di due rige di codice, due, ci avrebbe facilitato il compito.

P.S.
Un suggerimento: controlla che il numero di argomenti accettato dal programma sia corretto, attraverso argc, questo evita problemi come quello da te riscontrato, anche in caso di semplice dimenticanza
 
Ultima modifica:

pabloski

Utente Èlite
2,868
916
Inizialmente avevo pensato anche io a questa ipotesi, ma poi aggiunge che non gli termina la compilazione generando un errore....
(sei stato decisamente piu' lungimirante ?)

Per questo scrivevo che la pubblicazione di due rige di codice, due, ci avrebbe facilitato il compito.

Peri ha fatto un pò di confusione sull'errore. Quello che ha indicato è chiaramente un errore a runtime ed è ovviamente dovuto alla mancanza dei parametri sulla riga di comando.

E giustamente, come scrivevi, farebbe bene ad usare un if per verificare il numero dei parametri.
Post unito automaticamente:

Good, ora manca solo il problema con il file batch perché adesso dovrebbe dire tipo:

Perchè un file batch? Non puoi farlo direttamente in c++ usando le funzioni per la lettura delle directory?


Se vuoi usare un batch, puoi fare "dir *.txt | pincopalla.exe".
Codice:
pincopalla.exe file.txt //per ogni file.txt presente nella directory
E non ho idea di come scriverlo
Post unito automaticamente:


Grande, sono diventato matto a cercare qualcuno che ne abbia già parlato.
Ora rimane da capire solo come va scritto il file batch
 
Ultima modifica:
  • Mi piace
Reazioni: Andretti60

Andretti60

Utente Èlite
6,440
5,091
Solitamente un file batch si usa per eseguire programmi di cui si ha solo il eseguibile, altrimenti si modifica il sorgente. Nulla di male ovviamente, ma conviene solo se si conosce già un linguaggio scripting in quanto scrivere un batch richiede pochi minuti (se semplice), e se la creazione (e conseguente test) richieda meno tempo che modificare il programma. Se tu non conosci nessun linguaggio scripting devi impararne almeno uno (ci sono parecchie scelte adesso) e ovviamente dipende dal sistema operativo a meno che non decidi per un linguaggio universale (tipo Python) che però poi devi installare. @pabloski ti ha dato la dritta su come iterare una cartella usando il linguaggio C

Ma veniamo al tuo codice, che è completamente sbagliato
C:
char str[] = "Data/";
char out[] = "Output/";

strcat(str, argv[1]);
strcat(out, argv[1]);
dichiari due stringhe, che va bene, ma poi le copi in un elemento di argv (perché poi solo a quello di indice uno) e qui c’è un errore di fondo, ossia la allocazione del vettore argv è lasciata al compilatore e quindi non si sa se sia sicuro modificare manualmente i suoi elementi, e quindi non lo si fa mai. E ovviamente, se non si passa nessun parametro, argv sarà NULL.

Domanda finale: è questo un compito scolastico? Non è una critica, qui sui aiuta tutti, solo per sapere se è il compito che ti richiede di scrivere un file batch.

Come ti hanno detto sopra, per favore dacci più informazioni quando ci esponi i problemi, possiamo in quella maniera aiutare molto meglio. Specialmente nei momenti in cui la nostra sfera magica non è disponibile perché sta facendo un upgrade si sistema :)
 
  • Mi piace
Reazioni: BrutPitt

Peri

Nuovo Utente
82
3
Solitamente un file batch si usa per eseguire programmi di cui si ha solo il eseguibile, altrimenti si modifica il sorgente. Nulla di male ovviamente, ma conviene solo se si conosce già un linguaggio scripting in quanto scrivere un batch richiede pochi minuti (se semplice), e se la creazione (e conseguente test) richieda meno tempo che modificare il programma. Se tu non conosci nessun linguaggio scripting devi impararne almeno uno (ci sono parecchie scelte adesso) e ovviamente dipende dal sistema operativo a meno che non decidi per un linguaggio universale (tipo Python) che però poi devi installare. @pabloski ti ha dato la dritta su come iterare una cartella usando il linguaggio C

Ma veniamo al tuo codice, che è completamente sbagliato
C:
char str[] = "Data/";
char out[] = "Output/";

strcat(str, argv[1]);
strcat(out, argv[1]);
dichiari due stringhe, che va bene, ma poi le copi in un elemento di argv (perché poi solo a quello di indice uno) e qui c’è un errore di fondo, ossia la allocazione del vettore argv è lasciata al compilatore e quindi non si sa se sia sicuro modificare manualmente i suoi elementi, e quindi non lo si fa mai. E ovviamente, se non si passa nessun parametro, argv sarà NULL.

Domanda finale: è questo un compito scolastico? Non è una critica, qui sui aiuta tutti, solo per sapere se è il compito che ti richiede di scrivere un file batch.

Come ti hanno detto sopra, per favore dacci più informazioni quando ci esponi i problemi, possiamo in quella maniera aiutare molto meglio. Specialmente nei momenti in cui la nostra sfera magica non è disponibile perché sta facendo un upgrade si sistema :)
Ci sono due ragioni per cui faccio questa cosa con i file batch
La prima è che mi piacerebbe imparare a scrivere i file batch (giusto per divertirsi), la seconda è che le analisi di questi file txt mi servono per la tesi di laurea. Quindi visto che non si smette mai di imparare ne ho approfittato ahahahahahah
Inoltre in C++ non saprei come eseguire una analisi automatica su tutti i file di testo presenti in una cartella ( non mi vengono in mente trucchi o librerie che ti permettono di fare questa cosa ).
Infatti con quel poco che so ho detto, uso la funzione system e comunico con il sistema operativo. Ok... ma a questo punto uso un file batch che avvia l'eseguibile ( prendo la palla al balzo per divertirmi un po' )
Ad ogni modo torniamo al codice C++
Ho seguito i suggerimenti per compiere il debug su VS con i file passati come parametro e mi sono accorto che mi dava comunque errore. E mi sono accorto (VS permette di esaminare ogni singola variabile in gioco) che sarebbe il caso di specificare quante componenti hanno le stringhe
Quindi ho scritto
C++:
char str[20] = "DATA/";
char out[20] = "OUT/";
strcat(str, argv[1]);
strcat(out, argv[1]);
E fila liscio, riguardo a ciò che dicevi non ho ben capito a cosa ti riferisci perché strcat modifica il primo parametro e lascia costante il secondo. Probabile che intendevi proprio quello che ho modificato poco fa ?.

Poi passando una giornata di navigazione su vari forum ho finalmente capito come scrivere il file batch (già testato e funziona)
Quindi riporto qui la mia soluzione per chi vedrà questa discussione

Ho generato una cartella e ho messo al suo interno due cartelle (DATA e OUT), l'eseguibile (chiamato READING.exe ) e un file batch chiamato RunApplication.bat
Essi riportano il seguente codice
Codice:
@echo off
cd DATA
echo avvio programma di reading
FOR %%i IN (*.txt) DO (
    cd../OUT
    if exist %%i (
        echo %%i aggiornato. #
    ) else (
        echo %%i in elaborazione...
        cd ..
        start READING.exe %%i
        cd DATA
        echo %%i aggiornato. #
    )
)
echo programma terminato, premere un tasto per uscire
pause>nul
EXIT
 
Ultima modifica:

BrutPitt

Utente Attivo
1,166
1,262
Quindi ho scritto
C++:
char str[20] = "DATA/";
char out[20] = "OUT/";
strcat(str, argv[1]);
strcat(out, argv[1]);
Tutti i files che vai a leggere, tra nome ed estensione, hanno meno di 15 caratteri di lunghezza?
Cosa succede se un domani ne aggiungi uno che ha un nome di 15 caratteri (o piu')... e ti sei dimenticato dell'allocazione "su misura" che hai fatto?
Visto che in Windows il limite e' 255 caratteri (come componente individuale di un filename), non succede nulla se utlizzi un'allocazione maggiore, "a scanso di equivoci"... anzi e' uso riferirsi ai "limiti del sistema" in modo che non ci possano essere errori in tal senso.
Oppure attraverso un'allocazione dinamica, tanto il nome ce l'hai in argv (da cui puoi dedurre la lunghezza)
 
Ultima modifica:
  • Mi piace
Reazioni: Peri e Andretti60

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Oltretutto strcat() non fa controlli sulla lunghezza, quindi rischi di scrivere in posizioni non allocate. Dovresti verificare che la destinazione può contenere la sorgente.

Dovresti usare strncat() altrimenti.
 
Ultima modifica:
  • Mi piace
Reazioni: Peri e Andretti60
Stato
Discussione chiusa ad ulteriori risposte.

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!