Come compilare direttamente dal prompt dei comandi (windows)

di il
22 risposte

Come compilare direttamente dal prompt dei comandi (windows)

Ciao a tutti. Dovrei eseguire un programma dal prompt dei comandi (ho windows). Mi sono installato il compilatore gcc (minGW). Questo perchè vorrei vedere se facendo così, ottengo gli stessi output che mi dà il programma se lo eseguo con la IDE code:blocks (sono lo stesso che aveva aperto la discussione sul fatto che un programma su macchine diverse dava risultati diversi).
Però non sono sicuro di averlo eseguito bene. In pratica al prompt dopo avergli indicato il path in cui è il programma ho fatto gcc nomeprogramma.c -> mi ha generato un eseguibile a.exe, che se lanciato fa partire il programma.
E' giusto eseguirlo in questo modo? Il fatto è che il programma ha bisogno di un header esterno (nome.h) che io in quel comando non richiamo..qual'è la sintassi giusta?
Inoltre il mio obiettivo sarebbe quello di eseguirlo direttamente dal prompt, non dal file eseguibile che genera.
Grazie a tutti in anticipo.

22 Risposte

  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Puoi anche indicare il nome dell'eseguibile nella linea di comando ma il procedimento è corretto.

    Non si capisce cosa intendi con il resto. Il programma è rappresentato dal file eseguibile che fai partire dal prompt dopo la compilazione. Non vedo altro modo.

    La questione del diverso comportamento del programma tra computer diversi non l'ho ancora chiara... che intendi esattamente?
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    oregon ha scritto:


    Puoi anche indicare il nome dell'eseguibile nella linea di comando ma il procedimento è corretto.

    Non si capisce cosa intendi con il resto. Il programma è rappresentato dal file eseguibile che fai partire dal prompt dopo la compilazione. Non vedo altro modo.

    La questione del diverso comportamento del programma tra computer diversi non l'ho ancora chiara... che intendi esattamente?
    Io ho questo programma che genera delle statistiche in dei file blocco note. Soltanto che in altri computer genera le stesse statistiche..mentre nel mio ne genera di diverse (intendo diversi valori), cosa apparentemente inspiegabile.
    Siccome io compilo con il compilatore integrato della IDE code::blocks, mi hanno consigliato di installare un altro compilatore come gcc, e vedere se i risultati sono ancora diversi. E purtroppo sì, i risultati che mi escono sono diversi sia rispetto a quelli generati con code::blocks che da quelli generati con gli altri pc.

    Tra l'altro, l'eseguibile dalla linea di comando non me lo fa lanciare, perchè mi dice che è il programma è di una versione a 16bit mentre la mia versione di windows è a 64bit, quindi non è supportata.
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    C'è una grande confusione ...

    IDE non è una marca ma il programma con editor per scrivere/modificare il sorgente. Il compilatore usato può essere uno tra i tanti (anche gcc). CodeBlocks è un IDE ma il compilatore usato è quello installato e impostato nella configurazione.

    Se l'eseguibile che vuoi lanciare è a 16 bit vuol dire che hai compilato con un vecchio compilatore 16 bit e non va bene. Devi usare un compilatore da 32/64 bit. E' alquanto strano che tu abbia un eseguibile a 16 bit ... a meno che tu non abbia tentato di utilizzare Turbo C o simili.

    Sul fatto che i risultati siano diversi, mi permetto di essere d'accordo con VBExtreme che, nell'altro thread in cui si è discusso di questo tuo problema, ti invitava a trovare il problema isolando le varie parti del codice. Magari visualizza i risultati intermedi durante l'elaborazione e cerca di comprendere da dove cominciano a differire.

    Se poi vuoi fare chiarezza, esponi in una tabella con le seguenti informazioni

    PC SistemaOperativo Compilatore ValoreAtteso ValoreOttenuto

    le prove che hai fatto
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    oregon ha scritto:


    C'è una grande confusione ...

    IDE non è una marca ma il programma con editor per scrivere/modificare il sorgente. Il compilatore usato può essere uno tra i tanti (anche gcc). CodeBlocks è un IDE ma il compilatore usato è quello installato e impostato nella configurazione.

    Se l'eseguibile che vuoi lanciare è a 16 bit vuol dire che hai compilato con un vecchio compilatore 16 bit e non va bene. Devi usare un compilatore da 32/64 bit. E' alquanto strano che tu abbia un eseguibile a 16 bit ... a meno che tu non abbia tentato di utilizzare Turbo C o simili.

    Sul fatto che i risultati siano diversi, mi permetto di essere d'accordo con VBExtreme che, nell'altro thread in cui si è discusso di questo tuo problema, ti invitava a trovare il problema isolando le varie parti del codice. Magari visualizza i risultati intermedi durante l'elaborazione e cerca di comprendere da dove cominciano a differire.

    Se poi vuoi fare chiarezza, esponi in una tabella con le seguenti informazioni

    PC SistemaOperativo Compilatore ValoreAtteso ValoreOttenuto

    le prove che hai fatto
    Per quanto riguarda l'IDE lo so che non è la marca ci mancherebbe. Era per dire che lo lanciavo da un programma con l'editor ecc. e non dal prompt.
    Comunque sono riuscito a lanciarlo dal prompt..mi ero scaricato una versione di gcc vecchissima, ora è sistemato.
    Il codice l'abbiamo controllato più e più volte..su due macchine che hanno linux i risultati sono identici..col mio sony vaio che ha windows no.
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Scusa, ho capito che ci sono risultati diversi tra vari sistemi ma ti avevo consigliato di fare una tabella e indicare quei dati ...
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Come salvi i valori sul file?
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    vbextreme ha scritto:


    Come salvi i valori sul file?
    Con degli fprintf dentro i cicli for. Ho provato su più pc che montano windows e i risultati sono uguali. Mentre i risultati ottenuti con due pc linux sono diversi (ma uguali tra loro due). Lo so sembra impossibile.
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Rosas ha scritto:


    vbextreme ha scritto:


    Come salvi i valori sul file?
    Con degli fprintf dentro i cicli for. Ho provato su più pc che montano windows e i risultati sono uguali. Mentre i risultati ottenuti con due pc linux sono diversi (ma uguali tra loro due). Lo so sembra impossibile.
    Non è impossibile ma non rispondi alla mia domanda ... difficile risponderti ancora se ignori le domande ...
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Se sei cosi generico amen.
    Posta il codice che usi per salvare i dati.
    Meglio tutte le funzioni che accedono ai file.
    Tu hai windows io ho linux, magari se isoliano insieme le varie funzioni ci riusciamo.
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    oregon ha scritto:


    Scusa, ho capito che ci sono risultati diversi tra vari sistemi ma ti avevo consigliato di fare una tabella e indicare quei dati ...
    Oregon ho fatto quello che avevi consigliato. Ecco le prime 100 righe di valori di uno dei file che vengono generati.
    
    1 1331.013163 0
    2 1879.761031 0
    3 2012.550587 0
    4 2057.389136 0
    5 2071.129038 0
    6 2116.844142 0
    7 2071.250794 0
    8 2115.048444 0
    9 2126.669167 0
    10 2271.284614 0
    11 2246.503573 0
    12 2301.787103 0
    13 2332.998303 0
    14 2403.967109 0
    15 2488.538922 0
    16 2523.534832 0
    17 2556.949682 0
    18 2595.734126 0
    19 2628.314103 0
    20 2691.765689 0
    21 2737.912098 0
    22 2722.956585 0
    23 2724.514226 0
    24 2779.799186 0
    25 2812.218523 0
    26 2750.877533 0
    27 2781.391468 0
    28 2860.804224 0
    29 2907.627381 0
    30 2925.832534 0
    31 2872.763573 0
    32 2889.766339 0
    33 2839.201856 0
    34 2890.637403 0
    35 2886.127721 0
    36 2903.570951 0
    37 2892.722638 0
    38 2872.056168 0
    39 2914.008911 0
    40 2874.185853 0
    41 2875.940311 0
    42 2931.472631 0
    43 2928.037823 0
    44 3062.235198 0
    45 3131.751021 0
    46 2954.971565 0
    47 3016.983195 0
    48 3043.489148 0
    49 3016.300029 0
    50 3095.028805 0
    51 3096.213638 0
    52 2954.618510 0
    53 3017.356968 0
    54 3000.149398 0
    55 3056.332410 0
    56 3079.101606 0
    57 3062.168578 0
    58 3122.290511 0
    59 3157.495545 0
    60 3103.267422 0
    61 3090.970827 0
    62 3011.925456 0
    63 3069.746778 0
    64 3114.726607 0
    65 3071.482501 0
    66 3004.900281 0
    67 2988.316435 0
    68 3016.320288 0
    69 3022.356049 0
    70 3135.467720 0
    71 3109.686104 0
    72 3112.757030 0
    73 3164.798246 0
    74 3172.599371 0
    75 3255.131685 0
    76 3231.867054 0
    77 3123.903487 0
    78 3092.287197 0
    79 3084.988562 0
    80 3154.603388 0
    81 3245.491726 0
    82 3153.383178 0
    83 3132.824972 0
    84 3158.513307 0
    85 3149.214903 0
    86 3083.977224 0
    87 3091.989196 0
    88 3035.191563 0
    89 3051.021391 0
    90 3107.075160 0
    91 3098.549632 0
    92 3084.432038 0
    93 3065.070778 0
    94 3102.358736 0
    95 3142.052389 0
    96 2980.538053 0
    97 3028.992769 0
    98 3041.658228 0
    99 3096.999987 0
    100 3087.962544 0
    
    Questi sono fatti con windows, vengono uguali sia dal prompt con gcc sia con code::block (vengono uguali con due pc che hanno windows)

    Questi:
    
    1 1331.013163 0
    2 1879.761031 0
    3 2012.550587 0
    4 2057.389136 0
    5 2071.129038 0
    6 2116.844142 0
    7 2071.250794 0
    8 2115.048444 0
    9 2126.669167 0
    10 2271.284614 0
    11 2246.503573 0
    12 2301.787103 0
    13 2332.998303 0
    14 2403.967109 0
    15 2488.538922 0
    16 2523.534832 0
    17 2556.949682 0
    18 2595.734126 0
    19 2628.314103 0
    20 2691.765689 0
    21 2737.912098 0
    22 2722.956585 0
    23 2724.514226 0
    24 2779.799186 0
    25 2812.218523 0
    26 2750.877533 0
    27 2781.391468 0
    28 2860.804224 0
    29 2907.627381 0
    30 2925.832534 0
    31 2872.763573 0
    32 2889.766339 0
    33 2839.201856 0
    34 2890.637403 0
    35 2886.091110 0
    36 2903.189977 0
    37 2892.526653 0
    38 2871.946286 0
    39 2914.006495 0
    40 2874.131032 0
    41 2875.974459 0
    42 2931.516161 0
    43 2928.077253 0
    44 3062.274891 0
    45 3131.784180 0
    46 2955.002307 0
    47 3017.015137 0
    48 3043.522329 0
    49 3016.336382 0
    50 3095.064540 0
    51 3096.248356 0
    52 2954.653878 0
    53 3017.392052 0
    54 3000.184367 0
    55 3056.370422 0
    56 3079.144715 0
    57 3062.203718 0
    58 3122.328466 0
    59 3157.537685 0
    60 3103.302272 0
    61 3091.007182 0
    62 3011.964328 0
    63 3069.792074 0
    64 3114.767346 0
    65 3071.391646 0
    66 3004.979755 0
    67 2993.272352 0
    68 3029.865963 0
    69 3072.699563 0
    70 3005.756699 0
    71 2990.250924 0
    72 3021.994546 0
    73 2932.012512 0
    74 2869.869256 0
    75 2897.521791 0
    76 2885.639316 0
    77 2980.381727 0
    78 2972.803928 0
    79 3010.777927 0
    80 3079.266296 0
    81 3044.310455 0
    82 3095.173291 0
    83 3095.130033 0
    84 3055.397684 0
    85 3075.639952 0
    86 3045.255603 0
    87 3044.287846 0
    88 2991.178882 0
    89 2962.062467 0
    90 3021.429314 0
    91 2993.576237 0
    92 2942.479592 0
    93 3040.878507 0
    94 3084.259447 0
    95 3034.455652 0
    96 2996.149915 0
    97 2960.151480 0
    98 3032.842871 0
    99 3104.184068 0
    100 3169.001736
    
    sono invece stati generati con linux, usando sempre gcc dal prompt da un mio collaboratore. Nessuno dei due sono "valori attesi", soltanto che io preferirei che il mio pc li generasse come gli ultimi...visto che producono dei grafici presentabili e i miei no, e quelli dell'università mi dicono che finché non sono uguali..non si va avanti perchè non è una cosa normale che non siano uguali.
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Il tdm-mingw, compilatore che USA code blocks arrotonda i numeri diversamente da quello che fa GCC di linux e il cc di windows.
    Io proverei a compilare tramite il visuale studio c++ che nonostante il nome permette la compilazione del codice c, in alternativa puoi settarlo anche in c::b anche se l operazione è complessa.
    Una volta fatto ciò si potrà escludere o meno un errore di arrotondamento.

    Edit: potresti provare su linux la compilazione tramite -ffloat-store
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    É possibile avere il progetto completo da scaricare e compilare?5
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    vbextreme ha scritto:


    Il tdm-mingw, compilatore che USA code blocks arrotonda i numeri diversamente da quello che fa GCC di linux e il cc di windows.
    Io proverei a compilare tramite il visuale studio c++ che nonostante il nome permette la compilazione del codice c, in alternativa puoi settarlo anche in c::b anche se l operazione è complessa.
    Una volta fatto ciò si potrà escludere o meno un errore di arrotondamento.

    Edit: potresti provare su linux la compilazione tramite -ffloat-store
    Ok, proverò con quel compilatore
  • Re: Come compilare direttamente dal prompt dei comandi (windows)

    Inanzitutto il codice che mi hai iniato in privato è un pò da rivedere, e forse anche il caso di postarlo direttamente sul thread.
    un cosa come questa
    
    for(firm = 0; firm < N; firm++){
    		if(failF[firm] ==1){
    		    for(bank = 0; bank < Bk; bank++){
    		        if(amico[firm] == bank && dMarketMatrix[firm][bank] == 1 && failB[bank] == 1 ){
    			        for(lender = 0; lender < Bk; lender++){
    			            if(vicino[bank] == lender && marketBank[bank][lender] == 1 && real_interbank[bank][lender] == 1 ){
    							fprintf(out35,"%d %d %d %d %d %lf %lf %d %lf %lf %lf %lf %lf %lf %d\n",t,firm,bank,lender,failB[bank],profitB[bank],badDebtB[bank],failB[lender],badDebtB[lender],equityB[lender],leverageB[bank],leverageB[lender],size[bank],size[lender],n_sim);
    							//fflush(out35);
    						}
    					}
    				}
    			}
    		}
    	}
    
    è inguardabile! illeggibile! INUTILMENTE complessa!
    Anche il quantitativo di fflush sono inutili se non a rallentare l'applicazione.
    Manca il riferimento a time.h e usi tante variabili ma proprio tante che nemmeno usi realmente.
    Non commentato, Identato alla cavolo, NON STRUTTURATO, esci da funzioni senza return.
    Data la mole di calcolo vedere solo un microprocessore al lavoro al mondo d'oggi mi fa arrabbiare!
    Ho 4 core, uno fa le flessioni mentre gli altri 4 lo guardano ridendo!
    E meno male che ho tolto quasi(perchè sicuramente ne è scappato qualcuno) tutti i fflush, recuperando qualche secondo...

    questi sono i primi 100 valori:
    
    1 1331.013163 0
    2 1879.761031 0
    3 2012.550587 0
    4 2057.389136 0
    5 2071.129038 0
    6 2116.844142 0
    7 2071.250794 0
    8 2115.048444 0
    9 2126.669167 0
    10 2271.284614 0
    11 2246.503573 0
    12 2301.787103 0
    13 2332.998303 0
    14 2403.967109 0
    15 2488.538922 0
    16 2523.534832 0
    17 2556.949682 0
    18 2595.734126 0
    19 2628.314103 0
    20 2691.765689 0
    21 2737.912098 0
    22 2722.956585 0
    23 2724.514226 0
    24 2779.799186 0
    25 2812.218523 0
    26 2750.877533 0
    27 2781.391468 0
    28 2860.804224 0
    29 2907.627381 0
    30 2925.832534 0
    31 2872.763573 0
    32 2889.766339 0
    33 2839.201856 0
    34 2890.637403 0
    35 2886.091110 0
    36 2903.189977 0
    37 2892.526653 0
    38 2871.946286 0
    39 2914.006495 0
    40 2874.131032 0
    41 2875.974459 0
    42 2931.516161 0
    43 2928.077253 0
    44 3062.274891 0
    45 3131.784180 0
    46 2955.002307 0
    47 3017.015137 0
    48 3043.522329 0
    49 3016.336382 0
    50 3095.064540 0
    51 3096.248356 0
    52 2954.653878 0
    53 3017.392052 0
    54 3000.184367 0
    55 3056.370422 0
    56 3079.144715 0
    57 3062.203718 0
    58 3122.328466 0
    59 3157.537685 0
    60 3103.302272 0
    61 3091.007182 0
    62 3011.964328 0
    63 3069.792074 0
    64 3114.767346 0
    65 3071.391646 0
    66 3004.979755 0
    67 2993.194327 0
    68 3021.083440 0
    69 3025.908139 0
    70 2998.705953 0
    71 2978.042671 0
    72 3016.717432 0
    73 2902.686880 0
    74 2914.295093 0
    75 2908.488639 0
    76 2884.120712 0
    77 2972.572655 0
    78 3020.392039 0
    79 3063.986611 0
    80 3064.078401 0
    81 3047.597302 0
    82 2999.027539 0
    83 2951.502204 0
    84 2969.137946 0
    85 2965.790370 0
    86 2988.788459 0
    87 3007.894560 0
    88 3142.153684 0
    89 3272.637027 0
    90 3268.085113 0
    91 3267.732118 0
    92 3150.521547 0
    93 3241.968299 0
    94 3261.837254 0
    95 3242.612442 0
    96 3247.932237 0
    97 3259.576350 0
    98 3210.240890 0
    99 3254.696020 0
    100 3296.789792 0
    
    questi sono i valori con -fflush-store
    
    1 1331.013163 0
    2 1879.761031 0
    3 2012.550587 0
    4 2057.389136 0
    5 2071.129038 0
    6 2116.844142 0
    7 2071.250794 0
    8 2115.048444 0
    9 2126.669167 0
    10 2271.284614 0
    11 2246.503573 0
    12 2301.787103 0
    13 2332.998303 0
    14 2403.967109 0
    15 2488.538922 0
    16 2523.534832 0
    17 2556.949682 0
    18 2595.734126 0
    19 2628.314103 0
    20 2691.765689 0
    21 2737.912098 0
    22 2722.956585 0
    23 2724.514226 0
    24 2779.799186 0
    25 2812.218523 0
    26 2750.877533 0
    27 2781.391468 0
    28 2860.804224 0
    29 2907.627381 0
    30 2925.832534 0
    31 2872.763573 0
    32 2889.766339 0
    33 2839.201856 0
    34 2890.637403 0
    35 2886.091110 0
    36 2903.189977 0
    37 2892.526653 0
    38 2871.946286 0
    39 2914.006495 0
    40 2874.131032 0
    41 2875.974459 0
    42 2931.516161 0
    43 2928.077253 0
    44 3062.274891 0
    45 3131.784180 0
    46 2955.002307 0
    47 3017.015137 0
    48 3043.522329 0
    49 3016.336382 0
    50 3095.064540 0
    51 3096.248356 0
    52 2954.653878 0
    53 3017.392052 0
    54 3000.184367 0
    55 3056.370422 0
    56 3079.144715 0
    57 3062.203718 0
    58 3122.328466 0
    59 3157.537685 0
    60 3103.302272 0
    61 3091.007182 0
    62 3011.964328 0
    63 3069.792074 0
    64 3114.767346 0
    65 3071.391646 0
    66 3004.979755 0
    67 2993.194327 0
    68 3021.083440 0
    69 3025.908139 0
    70 2998.705953 0
    71 2978.042671 0
    72 3016.717432 0
    73 2902.686880 0
    74 2914.295093 0
    75 2908.488639 0
    76 2884.120712 0
    77 2972.572655 0
    78 3020.392039 0
    79 3063.986611 0
    80 3064.078401 0
    81 3047.597302 0
    82 2999.027539 0
    83 2951.502204 0
    84 2969.137946 0
    85 2965.790370 0
    86 2988.788459 0
    87 3007.894560 0
    88 3142.153684 0
    89 3272.637027 0
    90 3268.085113 0
    91 3267.732118 0
    92 3150.521547 0
    93 3241.968299 0
    94 3261.837254 0
    95 3242.612442 0
    96 3247.932237 0
    97 3259.576350 0
    98 3210.240890 0
    99 3254.696020 0
    100 3296.789792 0
    
    Come vedi i miei valori non coincidono ne con il tuo ne con quello dei tuoi prof.
    Forse perchè io uso una architettura risc.

    Ora se io procederei cosi:
    1- tiro una bella riga sul codice scritto.
    2 - Torno a riscrivere il codice usando un pò di buon senso.
    3 - Cerco di non usare double che creano molti problemi, salvando solo alla fine in double es:
    0.5 / 2 = 0.25 == 500 / 2 = 250 / 1000
    quindi usi numeri interi moltiplicati ad esempio per mille e solo alla fine nel momento di salvarli li trasformi in double dividendoli per mille o 10000 a seconda dei casi.
    Sempre che sia possibile questa tecnica toglie tutti gli errori dei calcoli double che per loro natura perdono precisione a lungo andare.

    In bocca al lupo
Devi accedere o registrarti per scrivere nel forum
22 risposte