Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo
Plaud Note Pro è un registratore digitale elegante e tascabile con app integrata che semplifica trascrizioni e riepiloghi, offre funzioni avanzate come template e note intelligenti, ma resta vincolato a un piano a pagamento per chi ne fa un uso intensivo
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-11-2005, 16:25   #1
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
[C] Pazzesco! Istruzione successiva manda in errore la precedente!!MA COME?!

Salve!!
Io programmo da una decina d'anni, e una cosa del genere non mi era mai successa.
Ecco lo scenario :

Codice:
double div; //globale

main {

div=xxxx.yy; (un valore qualsisasi)
... creo socket datagram
... creo thread che gestisce il socket
}

void* thread(void* s)
{
unsigned long long cl;
 s è il descrittore del socket
 n=recv(s, ... ... ... ); 
 rdtscll(cl);
 cl/=div;
}
Allora, su UNA delle mie 3 macchine cosa accade :
che se nel codice lascio cl/=div; la recv va sempre in errore ancora prima che venga eseguita la divisione!!!! Mi torna in n il valore -1 !!!
Ossia :
n=recv(s, ... ... ... );
printf("%d\n",n); ---> a schermo stampera' -1
rdtscll(cl);
cl/=div;

Se invece al posto di cl/=div, metto cl=cl/(unsigned long long)div; tutto funziona!! Ossia in n ho il numero di byte giusti!
Il bello è che, in un'altra versione dello stesso codice, la recv funziona con la divisione sottostante...

La domanda è : Come CAVOLO fa una istruzione non ancora eseguita a far andare in errore quella precedente????????
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2005, 16:48   #2
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
A me mi puzza di buffer overflow...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2005, 17:15   #3
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
che macchina (nel senso, che cpu) è quella su cui ti si presenta l' errore?

mi vien l' impressione che sia un problema di pipeline e modo in cui la specifica macchina gestisce le eccezioni al proprio interno (che giusto per complicare un po' le cose , varia da un processore all' altro)...
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2005, 17:22   #4
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
Nel portatile con Centrino M740 non va, invece nel Centrino M725 tutto ok, posso eseguirlo sia in un modo e a maggior ragione nell'altro.
Sia su un XP 2600+ che su vecchiotto Athlon 1Ghz, funziona come nell'M725...
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 02:08   #5
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
Quote:
Originariamente inviato da parisisalvo
Salve!!
Io programmo da una decina d'anni, e una cosa del genere non mi era mai successa.
Ecco lo scenario :

Codice:
double div; //globale

main {

div=xxxx.yy; (un valore qualsisasi)
... creo socket datagram
... creo thread che gestisce il socket
}

void* thread(void* s)
{
unsigned long long cl;
 s è il descrittore del socket
 n=recv(s, ... ... ... ); 
 rdtscll(cl);
 cl/=div;
}
Allora, su UNA delle mie 3 macchine cosa accade :
che se nel codice lascio cl/=div; la recv va sempre in errore ancora prima che venga eseguita la divisione!!!! Mi torna in n il valore -1 !!!
Ossia :
n=recv(s, ... ... ... );
printf("%d\n",n); ---> a schermo stampera' -1
rdtscll(cl);
cl/=div;

Se invece al posto di cl/=div, metto cl=cl/(unsigned long long)div; tutto funziona!! Ossia in n ho il numero di byte giusti!
Il bello è che, in un'altra versione dello stesso codice, la recv funziona con la divisione sottostante...

La domanda è : Come CAVOLO fa una istruzione non ancora eseguita a far andare in errore quella precedente????????


scusa ma tu gestisci una variabile condivisa tra due thread - il main e quello legato al socket - senza un semaforo?
per me il problema è quello
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 09:21   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Black imp
scusa ma tu gestisci una variabile condivisa tra due thread - il main e quello legato al socket - senza un semaforo?
Se ci accede anche dopo la creazione del thread potrebbe essere anche quello...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 13:14   #7
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
l'unica variabile condivisa è il descrittore del socket s...
questo numero non viene mai toccato...
io cmq, ne faccio una copia dentro il thread
con : int *socket=(int*)s;
cmq, nel main quel descrittore non viene usato, resta tale, finche non si chiude il main. Dopo aver creato il socket, il descrittore del socket nel main, nn viene toccato...il main poi resta vivo con un semplice while(1);
Tant'è vero che CODICE identicissimo, tranne che per la divisione, funziona PERFETTAMENTE.
Forse ho un po' troppo semplificato il codice...piu' realisticamente è cosi' :
Codice:
double div; //globale

main {
int sk; //locale al main
div=xxxx.yy; (un valore qualsisasi)
... creo socket datagram -> sk;
... creo thread che gestisce il socket gli passo (void*)&sk
while(1);
}

void* thread(void* s)
{
 int *sock=(int*)s;
 int socket=*sock;
 int n; 
 unsigned long long cl;
 socket è il descrittore del socket
 n=recv(socket, ... ... ... ); 
 printf("Socket ha ricevuto %d byte\n",n);
 rdtscll(cl);
 cl/=div;
}
Per debug, ho messo un printf subito dopo la recv, ossia
printf("Socket ha ricevuto %d byte\n",n);
La printf è messa PRIMA della divisione di cl.
Se lascio la divisione (ossia, tre righe di codice dopo), la recv, andra' in errore, e la printf stampera' -1, se faccio la divisione "per esteso" stampera' 20 (il numero di byte, che effettivamente l'altro calcolatore invia).
La cosa che non mi capacita è :
Come fa la recv ad andare in errore per una istruzione non ancora eseguita???
La divisione, viene poi effettuata correttamente, ma la recv non funziona!!
Vi giuro, se cambio solamente cl/=div con cl=cl/(unsigned long long)div; la recv funziona, e come byte stampa 20.

Ultima modifica di parisisalvo : 19-11-2005 alle 13:24.
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 13:18   #8
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
quello che mi fa strano e a cui sto ancora cercando un senso logico, è che su due macchine su tre non ti dia errori e sulla terza sì... o_O
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 13:29   #9
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
Ancora peggio!!!
Con l'amico mio, per cercare di risolvere abbiamo passato due ore...
a testare e provare linea per linea...
chi l'avrebbe mai detto che era una divisione???
La cosa ancora piu' assurda, è che essendo un progetto molto grosso, ha tante "relase", ogni settimana apportiamo delle migliorie, parti nuove ect ect, fino all'altro ieri, funzionava tutto perfetto (anke sul M740). Ossia Recv con successiva divisione cl/=divclock.
Ma la cosa ancor piu' strana è che solo una macchina presenta il problema!!!
Ossia non è un errore "oggettivo", ma soggettivo...
immaginate la mia crisi di nervi, come faccio a correggere un errore che non c'e'???? è da diventar matti! Su 3 macchine funziona, e sull'altra no. Come correggo un errore che in teoria, solo la mia "vede".
Dopo due orette, a testare linee di codice, e provare...abbiamo visto che era la maledettissima divisione!!!
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 13:47   #10
Black imp
Senior Member
 
Iscritto dal: Nov 2000
Città: MILANO
Messaggi: 2662
quando compilo sotto linux con più thread o addirittura processi mi capita che le print non vengano eseguite subito ma a volte ritardate.

se poi compili con qualche ottimizzazione può essere che una operazione venga svolta in un momento diverso da quello che ti aspetti. per questo ti dicevo di usare dei semafori. la var condivisa era div.
Black imp è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2005, 14:25   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
secondo me si tratta di una race condition: forse il codice generato per l'operatore /= differisce da quello generato per = e / separati; controlla l'assembly generato dal tuo compilatore (a proposito, quale usi?).
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2005, 18:58   #12
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
uso il gcc...
pero', compiliamo sempre su una sola macchina (dove abbiamo installato tutte le librerie) poi passiamo i files alle altre 3 (tra cui l'M740).
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2005, 20:00   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da parisisalvo
uso il gcc...
pero', compiliamo sempre su una sola macchina (dove abbiamo installato tutte le librerie) poi passiamo i files alle altre 3 (tra cui l'M740).
ad ogni modo è impossibile che il gcc compili differentemente su macchine diverse; intendevo dire che per capire la causa dovresti analizzare il codice assembly generato dal compilatore nei due diversi casi (è l'unica cosa che fa la differenza tra le due versioni del programma); molto probabilmente concluderai che si tratta di una race condition.
inoltre, lascia perdere questo fatto della divisione: cerca la causa del problema in maniera "standard"; in maniera "standard" se la recv ti restituisce -1 e tu non capisci perché, devi semplicemente chiamare WSAGetLastError (sempre che usi Winsock 2 su Windows, altrimenti non lo so).
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2005, 20:02   #14
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da parisisalvo
uso il gcc...
pero', compiliamo sempre su una sola macchina (dove abbiamo installato tutte le librerie) poi passiamo i files alle altre 3 (tra cui l'M740).
Hai provato a ricompilare sulla macchina che presenta il problema ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2005, 20:05   #15
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da cionci
Hai provato a ricompilare sulla macchina che presenta il problema ?
secondo me non cambia nulla... e se cambiasse qualcosa mi preoccuperei davvero O_O
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2005, 22:08   #16
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
Ora è ancora piu' grave!!!
Abbiamo fatto un "upgrade" del software...
mettendo quello che quella maledetta recv riceve in un vettore...
chissà per quale maledetto motivo, torna lo stramaledetto -1
Ovviamente SOLO sulla macchina M740!
L'applicazione è fatta con le GTK, le altre macchine hanno su la SuSe 9.3 l'M740 ha la Fedora Core 4. L'M740 è un Acer1692 e non ho potuto installare suse, solo fedora è stata la piu' compatibile (wireless card e s.video).
Voi che dite? puo' essere colpa della distro??

(Se dal codice rimuovo tutta la parte gtk, l'applicativo funziona sempre, inserendo la parte gtk, funziona con le particolarità).
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2005, 22:23   #17
Qu@ker
Member
 
Iscritto dal: Apr 2004
Messaggi: 130
Ma a quale errore si riferisce quel -1? Valore di errno?
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2005, 23:44   #18
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da parisisalvo
(Se dal codice rimuovo tutta la parte gtk, l'applicativo funziona sempre, inserendo la parte gtk, funziona con le particolarità).
in altre parole se ci rimuovi una parte che non c'entra niente funziona: è sicuramente race condition. ribadisco il consiglio di Quaker: errno?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2005, 23:55   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da cionci
Hai provato a ricompilare sulla macchina che presenta il problema ?
Ribadisco...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2005, 13:13   #20
parisisalvo
Senior Member
 
L'Avatar di parisisalvo
 
Iscritto dal: Nov 2002
Messaggi: 845
sulla macchina M740, non ci sono le lib grafiche...sulla Suse si sn installate in un secondo qua' richiede cose che gia' sono installate (tipo pango atk gdlib) arrivate alla gtk mi da errore, ho provato a installare quelle di fedora native, ma è come se non ci fossero, appena do make, mi da errore su tutta la grafica...quindi per compilare devo eliminare la parte gtk, e quindi funziona.

Dite di inserire l'istruzione

n=recv(... ... ...)
if (n<0) perror(" Errore : ");

Ultima modifica di parisisalvo : 22-11-2005 alle 13:20.
parisisalvo è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Plaud Note Pro convince per qualità e integrazione, ma l’abbonamento resta un ostacolo Plaud Note Pro convince per qualità e int...
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Il satellite cinese Jilin-1 ha fotografa...
Arrivano i nuovi iPhone ed è subi...
Il chip N1 degli iPhone 17 supporta il W...
La cinese Space Pioneer riesce a eseguir...
Xiaomi copia Apple: arriva la serie 17 e...
A 10 anni dalla prima rilevazione delle ...
Samsung annuncia il rilascio della One U...
La nuova MG4 spopola: già 26.000 ...
Monopattini pericolosi? Secondo una rice...
La Commissione Europea respinge le richi...
The Witcher: ecco le prime immagini dell...
Mitsubishi Electric verso l'acquisizione...
Pasticcio Tesla: nessuno vuole il Cybert...
Qualcomm, il nuovo SoC top di gamma &egr...
La memoria che cambierà l'AI: il ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 01:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v