|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1469
|
[C] programma scambio contenuto variabili con puntatore dà segmentation fault
Ciao a tutti,
ho scritto un breve programma in C in cui c'è una funzione che passati due interi, scambia il contenuto delle due variabili e restituisce il puntatore al valore più grande. Ho anche scritto un main per testarlo inizializzando le variabili. Il problema è che nell'esecuzione da shell mi dà segmentation fault, mentre sul pc di un mio amico lo stesso programma funziona. Come mai??? ecco il codice in allegato... HELP
__________________
Ho concluso transazioni con: gimor78, Taz83, Phopho, HighVoltage, PsychoWood, lexman, sandru, Alkaiser, Baccomatto, selu, Chris70, devil_luca, Novus88, anakin71, redpepper, renatofast, nucatolo, 8310, JeanCaneo e sirjd |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Messina
Messaggi: 561
|
Quote:
se vuoi una funzione che scambi semplicemente due numeri puoi usare una proprieta molto carina dello XOR che è questa: a^=b; b^=a; a^=b; che vuol dire a=a^b; b=b^a; a=a^b; esempio pratico a=5 b=2 1° step a=a^b;----> a=5^2=7 stato: a=7 b=2 2° step b=b^a;----> b=2^7=5 stato: a=7 b=5 3° step a=a^b;----> a=7^5=2 stato: a=2 b=5 CVD :P un'implementazione della funzioncina potrebbe essere: Codice:
void scambi(int *a, int *b)
{
(*a)^=(*b);
(*b)^=(*a);
(*a)^=(*b);
}
__________________
Bill Gates: "Noi siamo la MicroSoft. Voi sarete assimilati. La resistenza è inutile." Kenneth Olson (fondatore della Digital Equipment Corporation) : "Ma che bisogno avrebbe una persona di tenersi un computer in casa?"
|
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 1060
|
Quote:
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Sep 2005
Città: Messina
Messaggi: 561
|
thx all'uni con il mio prof in ste cose ci ha fatto na testa enorme
__________________
Bill Gates: "Noi siamo la MicroSoft. Voi sarete assimilati. La resistenza è inutile." Kenneth Olson (fondatore della Digital Equipment Corporation) : "Ma che bisogno avrebbe una persona di tenersi un computer in casa?"
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1469
|
Quote:
Comunque il testo dell'esercizio è questo: "Scrivete una funzione che scambi il valore di due variabili intere e restituisca un puntatore al valore massimo. Testate la funzione richiamandola dal main del programma (non è necessario prevedere l’inserimento di input, inizaliz- zate opportunamente le variabili per fare i test necessari)." A questo punto cosa dovrei scrivere? L'implementazione con lo XOR è carina, ma non ce l'hanno mai spiegata, quindi non credo di poterla usare!!
__________________
Ho concluso transazioni con: gimor78, Taz83, Phopho, HighVoltage, PsychoWood, lexman, sandru, Alkaiser, Baccomatto, selu, Chris70, devil_luca, Novus88, anakin71, redpepper, renatofast, nucatolo, 8310, JeanCaneo e sirjd |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ti sconsiglio la soluzione degli XOR, per vari motivi.
E' peggiore sia come performance che come leggibilita' rispetto alla soluzione classica, che penso sia quella che il tuo professore vorrebbe. Inoltre non permette di far capire se hai capito cosa vuol dire scambiare il valore di due variabili. L'unico vantaggio della soluzione XOR e' che non fa uso di variabili d'appoggio, e sarebbe da usarsi in carenza di risorse/registri. Cosa che oggi non capita spesso, soprattutto in un ambiente compilato dove non si ha il controllo sui registri.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1469
|
Quote:
__________________
Ho concluso transazioni con: gimor78, Taz83, Phopho, HighVoltage, PsychoWood, lexman, sandru, Alkaiser, Baccomatto, selu, Chris70, devil_luca, Novus88, anakin71, redpepper, renatofast, nucatolo, 8310, JeanCaneo e sirjd |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Ma pensaci bene. Hai una bottiglia piena di vino e una piena di birra. Devi scambiare il contenuto delle 2 bottiglie. Hai a disposizione tante bottigile vuote quante ne vuoi. Come fai?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 12-06-2008 alle 10:36. |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Messina
Messaggi: 561
|
Quote:
posso capire per la leggibilità ma le prestazioni
__________________
Bill Gates: "Noi siamo la MicroSoft. Voi sarete assimilati. La resistenza è inutile." Kenneth Olson (fondatore della Digital Equipment Corporation) : "Ma che bisogno avrebbe una persona di tenersi un computer in casa?"
|
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
soluzione a XOR 3 letture da memoria 3 scritture su memoria Nessuna possibilita' di accoppiamento istruzioni. 6 step sequenziali, che se va bene sono da 1 ciclo di clock l'uno ma penso che lo XOR su memoria sia piu' pesante. Codice:
a ^= b;
00000026 mov eax,dword ptr [esi]
00000028 xor dword ptr [edi],eax
b ^= a;
0000002a mov eax,dword ptr [edi]
0000002c xor dword ptr [esi],eax
a ^= b;
0000002e mov eax,dword ptr [esi]
00000030 xor dword ptr [edi],eax
Soluzione classica 2 letture da memoria 2 scritture su memoria 1 copia di registro Possibilita' di accoppiamento alta Tutte le istruzioni sono sicuramente da 1 ciclo di clock Codice:
int c = a;
00000028 mov eax,dword ptr [esi]
0000002a mov ebx,eax
a = b;
0000002c mov eax,dword ptr [edi]
0000002e mov dword ptr [esi],eax
b = c;
00000030 mov dword ptr [edi],ebx
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Sep 2005
Città: Messina
Messaggi: 561
|
Quote:
azz grande....non ci avevo mai pensato....queste cose le hai fatte con un semplice debugger no?
__________________
Bill Gates: "Noi siamo la MicroSoft. Voi sarete assimilati. La resistenza è inutile." Kenneth Olson (fondatore della Digital Equipment Corporation) : "Ma che bisogno avrebbe una persona di tenersi un computer in casa?"
|
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
Quote:
Edit: ecco, dopo aver visto la risposta di gugo aggiungerei:"Visto a voler fare il figo, professore universitario?"
__________________
-> The Motherfucking Manifesto For Programming, Motherfuckers Ultima modifica di shinya : 12-06-2008 alle 10:54. |
|
|
|
|
|
|
#13 | ||
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
||
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Aug 2007
Messaggi: 1469
|
Quote:
Non è lo stesso principio secondo cui ho utilizzato la variabile swap?
__________________
Ho concluso transazioni con: gimor78, Taz83, Phopho, HighVoltage, PsychoWood, lexman, sandru, Alkaiser, Baccomatto, selu, Chris70, devil_luca, Novus88, anakin71, redpepper, renatofast, nucatolo, 8310, JeanCaneo e sirjd |
|
|
|
|
|
| Tutti gli articoli | Tutte le news | Tutti i download |
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:50.












posso capire per la leggibilità ma le prestazioni
