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

    [C] Trova la differenza

    Salve, vorrei sapere se riuscite a trovare (se c'è) la differenza tra questi due codici, che per me sono equivalenti. E se vi trovate delle differenze, dirmi quali sono i casi in cui i due codici si comportano in modo differente (per esempio a causa di architetture differenti e così via)

    Questo è il codice che a me funziona:

    #define SWAP2(a, b) (b = (a + b) - (a = b))
    #define MAX 1000000

    main()
    {
    char c1[MAX];
    int n1,i,z;

    while ((n1=read(0,c1,MAX)))
    {
    for (i=0;i<(n1-3);i+=4)
    {
    SWAP2(c1[i],c1[i+1]);
    SWAP2(c1[i+2],c1[i+3]);
    }
    for (z=i;z<(n1-1);z+=2)
    {
    SWAP2(c1[z],c1[z+1]);
    }
    write(1,c1,n1);
    }
    return 0;
    }

    E questo è il codice, che nel mio pc funziona, però quando lo devo sottomettere nel pc del mio prof (di cui nn so nulla e ne posso accedere all'output generato) mi dice che l'output generato è differente:

    #define SWAP2(a, b) ((k)=((a)<<8) | (b))
    #define MAX 1000000

    main()
    {

    char c1[MAX];
    int n1,i,z;
    unsigned short k;


    while ((n1=read(0,c1,MAX)))
    {
    for (i=0;i<(n1-3);i+=4)
    {
    k^=k;
    SWAP2(c1[i],c1[i+1]);
    *((unsigned short *)(c1 + i)) = k;
    k^=k;
    SWAP2(c1[i+2],c1[i+3]);
    *((unsigned short *)(c1 + i + 2)) = k;
    }
    for (z=i;z<(n1-1);z+=2)
    {
    k^=k;
    SWAP2(c1[z],c1[z+1]);
    *((unsigned short *)(c1 + z)) = k;
    }
    write(1,c1,n1);
    }
    return 0;
    }

    PS: ho fatto anche altre prove usando queste macro, sempre ottenendo insuccessi:
    #define SWAP2(a, b) ((k)=((b)<<8) | (a))
    #define SWAP2(a, b) ((k)=((a)>>8) | (b))
    #define SWAP2(a, b) ((k)=((b)>>8) | (a))

    Ringrazio chiunque mi possa aiutare!!

  2. #2
    Posta il codice nei tag [code]...[/code] così che mantenga l'indentazione... così non si capisce niente.

    Per inciso, sottoporre, non sottomettere.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Salve, vorrei sapere se riuscite a trovare (se c'è) la differenza tra questi due codici, che per me sono equivalenti. E se vi trovate delle differenze, dirmi quali sono i casi in cui i due codici si comportano in modo differente (per esempio a causa di architetture differenti e così via)

    Questo è il codice che a me funziona:
    codice:
    #define SWAP2(a, b) (b = (a + b) - (a = b))
    #define MAX 1000000
    
    main()
    {
         char c1[MAX];
         int n1,i,z;
    
         while ((n1=read(0,c1,MAX)))
               {
                for (i=0;i<(n1-3);i+=4)
                      {
                       SWAP2(c1[i],c1[i+1]);
                       SWAP2(c1[i+2],c1[i+3]);
                       }
                 for (z=i;z<(n1-1);z+=2)
                       {
                       SWAP2(c1[z],c1[z+1]);
                       }
                 write(1,c1,n1);
                }
          return 0;
    }
    E questo è il codice, che nel mio pc funziona, però quando lo devo sottomettere nel pc del mio prof (di cui nn so nulla e ne posso accedere all'output generato) mi dice che l'output generato è differente:
    codice:
    #define SWAP2(a, b) ((k)=((a)<<8) | (b))
    #define MAX 1000000
    
    main()
    {
    
            char c1[MAX];
            int n1,i,z;
            unsigned short k;
    
    
            while ((n1=read(0,c1,MAX)))
                {
                 for (i=0;i<(n1-3);i+=4)
                    {
                     k^=k;
                     SWAP2(c1[i],c1[i+1]);
                     *((unsigned short *)(c1 + i)) = k;
                     k^=k;
                     SWAP2(c1[i+2],c1[i+3]);
                     *((unsigned short *)(c1 + i + 2)) = k;
                    }
                 for (z=i;z<(n1-1);z+=2)
                    {
                     k^=k;
                     SWAP2(c1[z],c1[z+1]);
                     *((unsigned short *)(c1 + z)) = k;
                     }
                 write(1,c1,n1);
                 }
           return 0;
    }
    PS: ho fatto anche altre prove usando queste macro, sempre ottenendo insuccessi:
    #define SWAP2(a, b) ((k)=((b)<<8) | (a))
    #define SWAP2(a, b) ((k)=((a)>>8) | (b))
    #define SWAP2(a, b) ((k)=((b)>>8) | (a))

    Ringrazio chiunque mi possa aiutare!!

  4. #4
    Cos'è che dovrebbero fare i codici in questione?
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Originariamente inviato da MItaly
    Cos'è che dovrebbero fare i codici in questione?
    Prendono in ingresso un file di testo ed scambiano la posizione fra due lettere vicine, tipo:

    IN: 1234567\n
    OUT:214365\n7

  6. #6
    Be', una prima assunzione non necessariamente vera che vedo nel tuo codice è che l'unsigned short sia di dimensione doppia rispetto al char.
    Tra l'altro
    codice:
    k^=k;
    è un assembly-ismo? In C, se non vuoi offuscare il codice, di solito si scrive
    codice:
    k=0;
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    codice:
    k^=k;
    In effetti è molto usato in Assembly ... non l'avevo mai incontrato (e non e' per caso) in C ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da oregon
    In effetti è molto usato in Assembly ...
    xor eax, eax... se l'ho visto io vuol dire che è veramente usato ad ogni angolo.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Originariamente inviato da MItaly
    Be', una prima assunzione non necessariamente vera che vedo nel tuo codice è che l'unsigned short sia di dimensione doppia rispetto al char.
    Ho fatto anche la prova ad usare uint8_t e uint16_t, ma lo stesso non funziona!

  10. #10
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    59
    nel primo blocco di codice la macro SWAP2 setta il valore sia di a che di b, mentre negli altri esempi setta solo il valore di k

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.