Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet
Il nuovo Deebot X12 OmniCyclone abbina un sistema di raccolta dello sporco senza sacchetto, un rullo di lavaggio esteso e la tecnologia FocusJet per intervenire più efficacemente sulle macchie più persistenti. Un robot completo e preciso che aiuta a tenere puliti i pavimenti di casa con il minimo sforzo
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2: la pulizia di casa con un mocio a nastro
Narwal Flow 2 implementa un mocio a nastro che esegue una pulizia dettagliata del pavimento di casa, in abbinamento ad un potente motore di aspirazione della polvere: un prodotto ideale per gestire in autonomia e con grande efficacia le necessità di pulizia dei pavimenti di casa
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
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


Ecovacs Deebot X12 OmniCyclone: lava grazie a FocusJet Ecovacs Deebot X12 OmniCyclone: lava grazie a Fo...
Narwal Flow 2: la pulizia di casa con un mocio a nastro Narwal Flow 2: la pulizia di casa con un mocio a...
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Corsair Platform: scrivanie gaming modul...
Assassin's Creed Black Flag Resynced: Ub...
La crisi delle memorie colpisce anche Ap...
NVIDIA accelera il Path Tracing: nuovo a...
Le migliori cuffie gaming wireless del 2...
Anche HONOR avrà il suo Pro Max: ...
Sta arrivando WhatsApp Plus: cosa includ...
Una GeForce RTX 5070 a un prezzo super c...
Nothing Phone (3) 16+512GB crolla a 662,...
Gigabyte risolve il problema dei connett...
Falsa partenza per l'app della verifica ...
PRAGMATA è un successo: raggiunto...
Privacy, il Garante multa Poste Italiane...
Aramco ribalta il concetto di 'ibrido'. ...
Apple cambia tutto: Tim Cook lascia il t...
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: 09:20.


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