Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo
HP OMEN MAX 16-ak0001nl combina RTX 5080 Laptop e Ryzen AI 9 HX 375 in un desktop replacement potente e ben raffreddato, con display 240 Hz e dotazione completa. Autonomia limitata e calibrazione non perfetta frenano l'entusiasmo, ma a 2.609 euro è tra le proposte più interessanti della categoria.
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta
Google ha appena rinnovato la sua celebre serie A con il Pixel 10a, lo smartphone della serie più conveniente se consideriamo il rapporto tra costo e prestazioni. Con il chip Tensor G4, un design raffinato soprattutto sul retro e l'integrazione profonda di Gemini, il colosso di Mountain View promette un'esperienza premium a un prezzo accessibile. E il retro non ha nessuno scalino
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 26-03-2009, 19:01   #1
anyanka
Senior Member
 
L'Avatar di anyanka
 
Iscritto dal: Feb 2006
Città: Provincia di BA!
Messaggi: 439
[C++] problemi a riconoscere caratteri ASCII

Salve ragazzi, avrei bisogno che mi aiutaste a capire da dove deriva il mio problema:
ho un programmino, creato su win, funzionante, che scrive in un file caratteri che corrispondono a codici (ASCII, unsigned char) che rappresentano altre stringhe.
Dovrebbe funzionare anche su linux perchè non uso nessuna funzione specifica per windows (credo!) invece anzichè scrivere i valori che mi aspetto, ne scrive altri [ad esempio dovrebbe scrivere 1 (codice ascii in decimale) e mi ritrovo un 156].... da cosa può dipendere?
Il codice è questo:

Codice:
 

const unsigned char FLAG_BYTE = '\xFF' ; 
const unsigned char END_OF_VALUES = '\xFE' ;
typedef struct {
	string valore;
	int num_occorrenze ;
	unsigned char codice ;
} VALORI ;

typedef struct {
    char * stringa ;
    int dim ;
    unsigned char flag ; // serve per differenziare un valore che è stato codificato da uno scritto così com'è,

} DATI_OUT ;

............
DATI_OUT contenuto_attributo = recupero_codice_attr(atts[i]) ;
output.write(contenuto_attributo.stringa, contenuto_attributo.dim) ;
output.write((char *)&contenuto_attributo.flag, sizeof(char));




DATI_OUT recupero_codice_attr(string val) {
    DATI_OUT dati ;
    VALORI valore_corrente ;
    if(val.length() >= CARATTERI) {
        valore_corrente = ricerca_valore(val) ;
        if( valore_corrente.codice != FLAG_BYTE ) {
       //     new_output << "sizeof(valore_corrente.codice) =  " << sizeof(valore_corrente.codice) << " " ;
      dati.stringa = (char *)&valore_corrente.codice ;
      // oss: nella conversione da unsigned char a char * il dato diventa da 1 a 3 caratteri....(???)
      dati.dim = sizeof(valore_corrente.codice) ;
      dati.flag = FLAG_BYTE ; // i valori che hanno flag = FLAG_BYTE sono stati codificati

        }
        else {
            dati.stringa =  (char *)val.c_str() ;
            dati.dim = val.length() ;
            dati.flag = END_OF_VALUES ; // ivalori che hanno flag = END_OF_VALUES non sono stati codificati
        }
    } else {
        dati.stringa = (char *)val.c_str() ;
        dati.dim = val.length() ;
        dati.flag = END_OF_VALUES ;
    }

    return dati ;
}
mancano parecchie parti.. ma questo dovrebbe bastare...
__________________
~ Notebook: Dell Studio 1537 - Intel Core 2 Duo T6400 @ 2,00 GHz ~
~ Cel: Nokia 5230 ~ Console: Nintendo Wii

"La menopausa è quando i cacciatori ubriachi sparano alla cicogna che porta i bebè..."
anyanka è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 19:33   #2
BrutPitt
Senior Member
 
L'Avatar di BrutPitt
 
Iscritto dal: Mar 2009
Città: Bologna
Messaggi: 1174
Ma leggi anche da un file i valori?

Hai considerato il fatto che, nei file ASCII, Windows/Dos hanno un CR (carriage return) in piu' nella "andata a capo" rispetto a Unix?

E questo passaggio lo giudico un po' dubbio (o almeno non si evince l'uso che ne fai):

dati.stringa = (char *)&valore_corrente.codice ;

Cioe' associ l'indirizzo di un carattere (char) a un array di carrattei (char *)... e sintatticamente e' corretto... ma poi che fai, lo utilizzi come stringa?
(senza che sia null terminated)

Ultima modifica di BrutPitt : 26-03-2009 alle 19:45.
BrutPitt è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 19:56   #3
anyanka
Senior Member
 
L'Avatar di anyanka
 
Iscritto dal: Feb 2006
Città: Provincia di BA!
Messaggi: 439
Allora approfondisco la spiegazione:
ho un vector di strutture che contiene coppie (stringa, codice)
questo codice è un unsigned char che va da 1 a 255.
la funzione recupero_codice fa questo:
- cerca la stringa nel vector
- legge il codice
- se il codice è != 255 passa alla struttura risultante dati i valori del codice stesso come stringa (cioè l'istruzione che hai evidenziato) , la lunghezza (dim) ovviamente sarà 1 e il flag byte che serve in un'altra fase...
- se il codice è 255 passa direttamente la stringa, dim = alla sua lunghezza e il flag è diverso.
Il cast a char * mi serve per andare a scrivere direttamente il valore nella funzione write(char *, len)
l'output è un file binario, non di testo, quindi non dovrei avere problemi di a capo o simili...
il problema sta proprio nel valore del carattere che su linux viene scritto nel file che in alcuni casi non capisco da dove provenga.
__________________
~ Notebook: Dell Studio 1537 - Intel Core 2 Duo T6400 @ 2,00 GHz ~
~ Cel: Nokia 5230 ~ Console: Nintendo Wii

"La menopausa è quando i cacciatori ubriachi sparano alla cicogna che porta i bebè..."
anyanka è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 20:03   #4
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
dati.stringa = (char *)val.c_str();

Questo non è corretto perché val può cambiare senza che tu te ne renda conto la posizione in cui è allocato il buffer che contiene i caratteri.
In quel caso devi fare un'allocazione dinamica:

dati.stringa = new char[val.size() + 1];
strcpy(dati.stringa, val.c_str());

Ovviamente dopo quella struttura dati deve essere deallocata.
Che funzioni anche senza può anche essere, ma non è corretto.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 20:18   #5
anyanka
Senior Member
 
L'Avatar di anyanka
 
Iscritto dal: Feb 2006
Città: Provincia di BA!
Messaggi: 439
Avevo appena fatto questa modifica:

Codice:
DATI_OUT recupero_codice_attr(string val) {
    DATI_OUT dati ;
    VALORI valore_corrente ;
    if(val.length() >= CARATTERI) {
        valore_corrente = ricerca_valore(val) ;
        if( valore_corrente.codice != FLAG_BYTE ) {
       //     new_output << "sizeof(valore_corrente.codice) =  " << sizeof(valore_corrente.codice) << " " ;
      dati.stringa = new char ;
      dati.stringa = (char *)&valore_corrente.codice ;
      // oss: nella conversione da unsigned char a char * il dato diventa da 1 a 3 caratteri....(???)
      dati.dim = sizeof(valore_corrente.codice) ;
      dati.flag = FLAG_BYTE ; // i valori che hanno flag = FLAG_BYTE sono stati codificati

        }
        else {
            dati.dim = val.length() ;
            dati.stringa = new char[dati.dim] ;
            dati.stringa =  (char *)val.c_str() ;
            dati.flag = END_OF_VALUES ; // ivalori che hanno flag = END_OF_VALUES non sono stati codificati
        }
    } else {
        dati.dim = val.length() ;
        dati.stringa = new char[dati.dim] ;
        dati.stringa =  (char *)val.c_str() ;
        dati.flag = END_OF_VALUES ;
    }
    new_output << *dati.stringa << "- " << dati.dim << " -" << dati.flag << "\n" ;
    return dati ;
}
Va un po' meglio ma ha ancora un comportamento anomalo... ora provo con strcpy...
Grazie a tutti!
__________________
~ Notebook: Dell Studio 1537 - Intel Core 2 Duo T6400 @ 2,00 GHz ~
~ Cel: Nokia 5230 ~ Console: Nintendo Wii

"La menopausa è quando i cacciatori ubriachi sparano alla cicogna che porta i bebè..."
anyanka è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 20:23   #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
dati.stringa = new char[dati.dim] ;
dati.stringa = (char *)val.c_str() ;

Questo è errato proprio dal punto di vista concettuale. Hai un memory leak perché il puntatore alla memoria allocata dinamicamente viene perso. Non dovrebbe assolutamente funzionare meglio, ma al massimo uguale a prima.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 20:34   #7
anyanka
Senior Member
 
L'Avatar di anyanka
 
Iscritto dal: Feb 2006
Città: Provincia di BA!
Messaggi: 439
hai ragione.. era uguale...con strcpy sembra funzionare....
ma com'è che su win non mi dava problemi? nè in compilazione nè nel risultato...

cmq in generale per trasformare una stringa in un char * devo usare sempre strcpy?
__________________
~ Notebook: Dell Studio 1537 - Intel Core 2 Duo T6400 @ 2,00 GHz ~
~ Cel: Nokia 5230 ~ Console: Nintendo Wii

"La menopausa è quando i cacciatori ubriachi sparano alla cicogna che porta i bebè..."
anyanka è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 20:38   #8
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
Dipende dall'uso che ne devi fare...se la devi copiare e ci devi lavorare sopra sì.
Se la devi usare direttamente in forma costante no. Non a caso c_str ritorna un const char *.

Su Win non ti dava problemi probabilmente per una diversa implementazione interna della string.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-03-2009, 20:44   #9
anyanka
Senior Member
 
L'Avatar di anyanka
 
Iscritto dal: Feb 2006
Città: Provincia di BA!
Messaggi: 439
Fosse per me farei tutto con le stringhe ma ci sono alcune funzioni che richiedono i puntatori a char (come la write ad es.) e mi costringono a fare il cambio.. ecco perché avevo fatto quel pastrocchio prima
comunque grazie mille!
__________________
~ Notebook: Dell Studio 1537 - Intel Core 2 Duo T6400 @ 2,00 GHz ~
~ Cel: Nokia 5230 ~ Console: Nintendo Wii

"La menopausa è quando i cacciatori ubriachi sparano alla cicogna che porta i bebè..."
anyanka è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
6G, da rete che trasporta dati a rete intelligente: Qualcomm accelera al MWC 2026 6G, da rete che trasporta dati a rete intelligen...
CHUWI CoreBook Air alla prova: design premium, buona autonomia e qualche compromesso CHUWI CoreBook Air alla prova: design premium, b...
Il nuovo MacBook Neo ha una memoria SSD ...
Xbox Project Helix, le prime specifiche ...
Annunci pubblicitari sulla TV quando cam...
Prezzi aumentati del 50% durante la nott...
Sconti studiati per singolo utente: Sony...
Addio alla Kia Niro EV, il crossover sar...
Apple crede nel suo iPhone Fold: la prod...
Fortnite, un nuovo listino per i pacchet...
Ecco i nuovi Sonos Play ed Era 100 SL: d...
Razer svela il futuro del gaming potenzi...
Tre robot Narwal in offerta: pulizia aut...
Gracenote denuncia OpenAI: ChatGPT addes...
Microsoft AI Tour Milano: dall'efficienz...
Asus ExpertBook Ultra: Intel Core Ultra ...
Intel presenta i processori desktop Core...
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: 04:40.


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