Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90

    [Visual C++ 2010] Agli altri chiede una dll!

    Ho scritto un programma semplicissimo in C, ho compilato la soluzione, sono andato a prendere l'exe dalla cartella Debug, spostato da un'altra parte e funzionava perfettamente.
    Lo do ad un mio amico e gli richiede una DLL (dovrebbe essere msvcrt.dll o qualcosa di simile a quanto dice).
    Scarica la dll e parte. Ho fatto la prova con tre persone, una con XP, una con Vista e una con 7 e tutte con lo stesso problema.

    Ecco il codice:
    codice:
    #include <stdio.h> 
    #include <math.h>
    int main()
    {
        long int x = 3;
        long int y;
        for( ; ; )
        {
                 y = (x*x - 1 )/2;
                 if(y < 0) continue;
                 if((x*x) == ((y+1)*(y+1) - y*y))
                 printf("\n%d %d %d", x, y, (y+1));
                 x += 2;
                 if(x == 65535) break;
         }
    return 0;
    }
    A parte il codice che può essere osceno quanto vi pare, dove sbaglio?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Grazie!

  4. #4
    Non devi distribuire la versione Debug dell'applicazione, essa infatti è linkata dinamicamente verso la CRT di debug (che peraltro non è distribuibile liberamente), non è ottimizzata ed è particolarmente grossa anche perché contiene le informazioni di debug. Quando vuoi generare l'exe da distribuire, devi mettere il progetto nella modalità release, compilare e prendere l'eseguibile dalla cartella Release.

    Nota comunque che se nel progetto è impostato di usare la versione dll della CRT è necessario comunque che sul PC su cui si andrà ad eseguire il programma sia installato il redist di VC++ 2010 (link); se vuoi che il programma vada senza prerequisiti aggiuntivi, devi impostare nelle proprietà del progetto il linking con la versione statica della CRT. L'eseguibile naturalmente aumenterà di un po' in termini di dimensioni (viene incorporata la parte della CRT impiegata nel tuo programma nell'eseguibile).

    Tutto ciò vale per le applicazioni unmanaged; per le applicazioni managed, invece, è ovviamente sempre necessario che sulla macchina target sia installata la versione adeguata del .NET Framework.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5

    Re: [Visual C++ 2010] Agli altri chiede una dll!

    Originariamente inviato da m4l13n
    Ho scritto un programma semplicissimo in C, ho compilato la soluzione, sono andato a prendere l'exe dalla cartella Debug, spostato da un'altra parte e funzionava perfettamente.
    Lo do ad un mio amico e gli richiede una DLL (dovrebbe essere msvcrt.dll o qualcosa di simile a quanto dice).
    Scarica la dll e parte. Ho fatto la prova con tre persone, una con XP, una con Vista e una con 7 e tutte con lo stesso problema.

    Ecco il codice:
    codice:
    #include <stdio.h> 
    #include <math.h>
    int main()
    {
        long int x = 3;
        long int y;
        for( ; ; )
        {
                 y = (x*x - 1 )/2;
                 if(y < 0) continue;
                 if((x*x) == ((y+1)*(y+1) - y*y))
                 printf("\n%d %d %d", x, y, (y+1));
                 x += 2;
                 if(x == 65535) break;
         }
    return 0;
    }
    A parte il codice che può essere osceno quanto vi pare, dove sbaglio?
    A parte il discorso DLL, vorrei precisare che questo codice potrebbe essere *ottimizzato*, anche da un punto di vista formale: se ti interessa ti posso postare il codice migliorato.


    Ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Come vuoi è sempre bello imparare nuove cose. Comunque è la semplice trasposizione in C di una specie di metodo per scoprire le terne pitagoriche inventato da un mio amico...

    Ho appena notato di aver incluso il <math.h> che poi non utilizzo...

  7. #7
    Ok..

    Innanzitutto questa riga è inutile:
    codice:
    if(y < 0) continue;
    in quanto la variabile y non può essere mai < 0..

    Il ciclo for può essere affrontato così:
    codice:
      
    for (x = 3; x <= 65535; x=x+2)
    oppure:
    codice:
      
    do {
    //serie di istruzioni
    }
    while (x != 65535 )

    Ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Può sembrare una cosa idiota ma ad un certo punto y ci diventa minore di 0...
    Grazie per il for, l'if lo avevo aggiunto dopo...

  9. #9
    Originariamente inviato da m4l13n
    Può sembrare una cosa idiota ma ad un certo punto y ci diventa minore di 0...
    Grazie per il for, l'if lo avevo aggiunto dopo...
    La funzione in questione è questa:
    y = (x*x-1)/2
    La x parte da 3 e va ad aumentare, ma sarà sempre un numero intero (infatti è dichiarato int); se studi la funzione ti accorgi che il minimo è -1/2 infatti:

    - per x = 0 --> y = -1/2
    - per x = 1 --> y = 0
    - per x = " --> y = 3/2

    In definitiva, y diventa negativo sse x = 0 , ma nel tuo ciclo il valore minimo che x assume è 3.


    Ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    90
    Appunto! Così credevo anch'io... prova a togliere la riga, compilare ed eseguire... ad un certo punto stampa y e y+1 negativo

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 © 2024 vBulletin Solutions, Inc. All rights reserved.