Torna indietro   Hardware Upgrade Forum > Software > Programmazione

CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
La prima tappa italiana della Road to CES porta a Milano i vertici della Consumer Technology Association, con una nuova griglia di lettura dei trend tecnologici e una posizione netta su dazi e regolamentazione dell'IA
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
OPPO ha appena lanciato sul mercato la nuova serie Find X10, che ha come smartphone premium il Find X10 Pro Max, uno smartphone completo, che fa del comparto fotografico il suo vero punto di forza. Ma sono tante le novità, tra cui l'AI che adesso diventa agentica. Ma andiamo a vedere nel dettaglio questo nuovo smartphone.
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato
Abbiamo provato la beta di World of Warcraft: Forever, il Classic+ di Blizzard in arrivo il 4 novembre: la nuova razza Skyborne restituisce la sensazione di un gioco nuovo, ma le zone storiche conservano la noia divertita di Classic. Classi ribilanciate, sciamani anche nell'Alleanza e un motore grafico che in 4K gira bene anche su una RTX 3070. Cosa cambia in Forever? La risposta nell'articolo
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-02-2006, 10:41   #1
alesnoce
Member
 
Iscritto dal: May 2005
Messaggi: 80
[C++] string e char[]

Ciao a tutti.

Questa è la dichiarazione di una funzione che ho scritto e di cui ritengo la definizione non importante, almeno per il momento.
Codice:
void ExecuteAction(string _action, bool _writeSignal);
Debuggando il mio codice, mi sono accorto che se invoco la funzione così:
Codice:
    string trAction(GetTransition(it)->GetAction());
    ExecuteAction(trAction, true);
non ci sono errori né a compile time né a run time, però il programma non funziona.

Per farlo funzionare ho dovuto scrivere:
Codice:
    string trAction(GetTransition(it)->GetAction());
    char bufAction[trAction.size()+1];
    memset(bufAction, '\0', trAction.size()+1);
    trAction.copy(bufAction, trAction.size());

    ExecuteAction(bufAction, true);
Perché se il primo parametro è string devo passare un char* affinché il programma funzioni?

Seconda domanda: ci sono problemi a definire una stringa di un solo carattere?

So che potrei spulciare i manuali, però preferisco avere risposte da un programmatore che mi fornisca suggerimenti pratici: ho scritto un programma da oltre 4500 righe effettive di codice, e sto scoprendo una miriade di bug; mi sembra che anche quelli che non ho ancora risolto siano tutti concernenti la gestione delle stringhe, quindi mi interesserebbero dritte su come trattarle, in particolar modo quelle ottenute come dereferenziazione di iterator STL. Qualcuno può spedirmi per raffronto qualche riga di codice?
Grazie anticipatamente
alesnoce è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2006, 11:36   #2
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Bisognerebbe capire cosa ritorna , e cosa fa la funzione "GetAction()" .

Questa dovrebbe ritornare un reference a "string" a quanto ho capito, ma bisogna vedere come lo riempie questo string .

Inoltre per caso la funzione ExecuteAction fa riferimento in qualche modo al fatto che la stringa finisca con '\0' ? Non sono completamente sicuro che le "string" in C++ ritengano anche il carattere di terminazione nullo (mentre nel char[] che crei con memset il '\0' ce lo metti, quindi potrebbe essere una causa) .

Magari per risolvere velocemente e senza mal di testa puoi provare con :

ExecuteAction(trAction.c_str(), true);

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2006, 14:15   #3
alesnoce
Member
 
Iscritto dal: May 2005
Messaggi: 80
Grazie, adesso provo
alesnoce è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2006, 14:35   #4
alesnoce
Member
 
Iscritto dal: May 2005
Messaggi: 80
Anzi, dal momento che ci sono ti faccio vedere GetAction()
Codice:
  string GetAction() const
  {
    return action;
  }
come vedi è una funzione elementare.

Avrei dovuto implementarla così?
Codice:
  string* GetAction() const
  {
    return &action;
  }
alesnoce è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2006, 15:10   #5
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
No.

Senti , per fare una prova del 9 perchè fai

string trAction(GetTransition(it)->GetAction() + "\0");

Così vediamo se è proprio un problema del '\0'

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2006, 15:21   #6
alesnoce
Member
 
Iscritto dal: May 2005
Messaggi: 80
Purtroppo ora devo andare ma domani ti faccio sapere.
Grazie mille anche per avermi fatto conoscere la funzione c_str() che essendo niubbo sostituivo con più righe di codice.
Ciao
alesnoce è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2006, 09:43   #7
alesnoce
Member
 
Iscritto dal: May 2005
Messaggi: 80
Servono char[] null terminated; aggiungere '\0' limita i danni, per così dire.
Adesso mi metterò a eseguire il programma passo per passo per capire il perché di alcuni comportamenti che non riesco a spiegarmi. Appena lo scopro scriverò cosa ho fatto, chissà che non serva a qualcun altro.

Esempio di comportamento inspiegabile.

Quando legge la stringa "intA=2", il programma deve capire, dalla presenza di "=", che ha a che fare con una variabile, il cui tipo ho imposto possa essere solo int, double o boolean;
poi deve passare a isolare il nome della variabile, in questo caso intA, e il valore della stessa, in questo caso 2;
infine deve aggiungere in map<string, int> integerVariables nome e valore ottenuti.

Bene. Se gli passo intA=2 funziona, se gli passo intB=2 no!, aggiunge intB alla map delle variabili booleane.

Comunque grazie ancora per l'aiuto AnonimoVeneziano, mi ha tolto il dubbio su '\0'.
OT
Mi servirò del tuo howto per aggiornare il kernel di debian; per ora gli ho dato solo un'occhiata, ma è strutturato in maniera chiara
/OT
Ciao
alesnoce è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2006, 10:16   #8
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13827
Quote:
Originariamente inviato da alesnoce
Servono char[] null terminated; aggiungere '\0' limita i danni, per così dire.
Adesso mi metterò a eseguire il programma passo per passo per capire il perché di alcuni comportamenti che non riesco a spiegarmi. Appena lo scopro scriverò cosa ho fatto, chissà che non serva a qualcun altro.

Esempio di comportamento inspiegabile.

Quando legge la stringa "intA=2", il programma deve capire, dalla presenza di "=", che ha a che fare con una variabile, il cui tipo ho imposto possa essere solo int, double o boolean;
poi deve passare a isolare il nome della variabile, in questo caso intA, e il valore della stessa, in questo caso 2;
infine deve aggiungere in map<string, int> integerVariables nome e valore ottenuti.

Bene. Se gli passo intA=2 funziona, se gli passo intB=2 no!, aggiunge intB alla map delle variabili booleane.

Comunque grazie ancora per l'aiuto AnonimoVeneziano, mi ha tolto il dubbio su '\0'.
OT
Mi servirò del tuo howto per aggiornare il kernel di debian; per ora gli ho dato solo un'occhiata, ma è strutturato in maniera chiara
/OT
Ciao
Prova a ripassarti un po' il codice di ExecuteAction e vedi un po' cosa fa di strano

Comunque per l'howto sul kernel , adesso dovrebbe essere un po' datato, la configurazione dei sorgenti del kernel linux da 2.4 ( che è il kernel per cui avevo fatto l'howto) a 2.6 è cambiata un po' , mentre la fase di build sotto debian (usando make-kpkg) è rimasta pressochè identica. Purtroppo non l'ho mai aggiornato e me ne dispiaccio, lo farò in futuro

Ciao
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 09-02-2006, 10:21   #9
alesnoce
Member
 
Iscritto dal: May 2005
Messaggi: 80
Risolto il busillis.

I bachi non erano nel codice, ma nei dati di ingresso!!!
Il mio programma infatti acquisisce in input dati provenienti da due file, che io erroneamente reputavo entrambi XML, mentre uno è simil XML.
Per questo la gestione di stringhe all'apparenza identiche era diversa: le stringhe ERANO diverse.

Che peccato però, credevo di aver creato per primo del "codice quantistico"
alesnoce è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato WoW Forever provato: il MMORPG che la community ...
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
HUAWEI MatePad Air recensione: OLED opaco e tastiera dedicata per lavorare meglio HUAWEI MatePad Air recensione: OLED opaco e tast...
Kimi K3.1 Pro, Moonshot AI rilancia sui ...
Dove sono finite tutte le GeForce RTX 50...
Nintendo Switch 2 già violata gra...
OpenAI apre a tutti la sua IA che scegli...
Apple estende il Self Service Repair a i...
Linux, falle critiche del kernel pubblic...
Gli agenti AI diventano un incubo per le...
Fastweb e Vodafone verso il sistema unic...
70mai A800 Nano a 69,99€ su Amazon: dash...
Mini pacchi extra Ue, la tassa da 2 euro...
Metro 2033 Redux e Last Light Redux si a...
Silicio a 1.000 °C in un microonde: ...
Sigma FP2 senza mirino né slitta ...
Huawei Pura 90 Plus, preordini aperti in...
Addio al limite di 1,5 °C: il nuovo ...
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:30.


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