PDA

Visualizza la versione completa : [C] Trova la differenza


Leo_Cenzus
15-11-2009, 18:45
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!!

MItaly
15-11-2009, 19:06
Posta il codice nei tag
... cos che mantenga l'indentazione... cos non si capisce niente.

Per inciso, sottoporre, non sottomettere. :mame:

Leo_Cenzus
15-11-2009, 19:18
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!!

MItaly
15-11-2009, 19:37
Cos' che dovrebbero fare i codici in questione?

Leo_Cenzus
15-11-2009, 19:51
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

MItaly
15-11-2009, 20:33
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

k^=k;
un assembly-ismo? In C, se non vuoi offuscare il codice, di solito si scrive


k=0;

oregon
15-11-2009, 20:36
k^=k;

In effetti molto usato in Assembly ... non l'avevo mai incontrato (e non e' per caso) in C ...

MItaly
15-11-2009, 20:53
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. :D

Leo_Cenzus
15-11-2009, 21:59
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!

bitman
16-11-2009, 11:23
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

Loading