Newsgroup: it.comp.lang.c++
Titolo: Conversione stringa

Ciao a tutti!
Vi chiedo un consiglio su una funzione che dovrebbe essere
semplicissima ma che mi sta creando un sacco di problemi..
Devo creare una funzione che mi compili una stringa carattere per
carattere in base ad una stringa che passo per parametro.. Mi spiego
meglio..
Ho una funzione vfd_write che scrive su un display (tramite un pic)
dei caratteri e la richiamo così: scrivi1(stringa), dove stringa è
definita così:
stringa[0]='C';
stringa[1]='I';
stringa[2]='A';
stringa[3]='0';
stringa[4]='\0';
e sul display mi scrive correttamente CIAO..
Ora vorrei creare una seconda funzione scrivi2 (di cui ho riportato
sotto il listato) da richiamare come scrivi2("CIAO")..
Questa scrivi2 dovrebbe prendere carattere per carattere ciò che le
passo e comporre la stringa senza doverlo fare manualmente..Allora uso
un puntatore e uso un ciclo for..ma quando scrivo sul display mi
vengono fuori schifezze come se il puntatore andasse a puntare chissà
dove e quindi come se la stringa non si componesse correttamente..e
non so più dove sbattere la testa..
Riuscireste a darmi una mano?
Grazie in anticipo
void scrivi2(rom char *p)
{
	char stringa[40];
	unsigned char i;
for(i=0;i<40;i++)
	{
		stringa[i] = *p++;
	}
	scrivi1(stringa);
}

 }
Ciao,
non capisco:
a) cosa sia la parola "rom" prima di char *. E' una macro, una cosa
non-standard, o un popolo dell'est europeo?
b) perché assumi che tutte le stringhe in input siano *esattamente* di
40 caratteri, non uno di più, non uno di meno. Non allochi la memoria
dell'array interno alla funzione con new, quindi non hai garanzia che
la memoria sia a zero, e avrai un array di garbage. In più, se p è
meno lunga di 40 caratteri, può andare in segmentation fault.
c) perché non usi std::string, visto che parliamo di C++, al posto di
vecchi, e proni ad errori, array di char. Le stringhe ti risparmiano
un bel po' di problemi. Se mai, in un giorno distante e magari per
parlare a librerie in C, ti servirà accedere alla rappresentazione in
char* sottostante, c'è il metodo std::string::c_str () -- che si
chiama anche "ultima ratio".
Matteo

 c)
...
Ma soprattutto non capisco perch� anzich� cercare di scrivere una strcpy 
sbagliata, non pu� fare direttamente
scrivi1("CIAO");

 passo e comporre la stringa senza doverlo fare manualmente..
Non si capisce cosa vuoi fare. Spiegati meglio.
E.


Ciao, rispondo a te ma un po' a tutti..intanto vi ringrazio per
l'attenzione..
Allora..purtroppo si parla di C++ ma in realtà sono costretto a
sviluppare in ambiente MPLAB della Microchip, per programmare un
PIC18F97J60, e il relativo compilatore è notoriamente una m***a,
quindi definisco la variabile come rom char perchè sembra che le
variabili vengano allocate nella rom e non nella ram..ho comunque
provato anche a definire, anzichè rom char, altri tipi, ad es.
"unsigned char" o anche solo "char", ma in questo modo la scrivi2 non
scrive proprio nulla..
Definisco 40 caratteri perchè il display è da 40, ma teoricamente se
passo una scrivi2 con stringa da 8 caratteri, essendo tra vigolette mi
viene comunque messo automaticamente il carattere di fine stringa dopo
l'ottavo carattere..quindi il definire una char da 40 caratteri non
dovrebbe comportare problemi..
La scrivi1 è strutturata nel seguente modo:
void scrivi1(char *pnt)
{
unsigned char i=0;
	PORTGbits.RG6=0;
	PORTE=0x01;	STB_LCD
	clock_to_lcd();
	DelayMs(10);
	PORTE=0x02;	STB_LCD
	clock_to_lcd();
	DelayMs(10);
	PORTGbits.RG6=1;
    while(*pnt != 0)
	{
		if(i==20)
		{
			PORTGbits.RG6=0;
			PORTE=0xC0;	STB_LCD
			clock_to_lcd();
			DelayMs(10);
			PORTGbits.RG6=1;
		}
		if(i>=40) return;
		PORTE=*pnt;
		STB_LCD
		Delay10us(10);
		clock_to_lcd();
		Delay10us(10);
		pnt++;
		i++;
	}
}
I dati da scrivere sull'lcd vengono passati ad un latch 3-state 574
tramite la porta E del pic (cioè sugli 8 bit della porta), e poi
tramite lo strobe vengono passati al display..premetto che il display
viene inizializzato correttamente tramite un'altra procedura che non
vi riporto perchè tanto non ha importanza..
tramite la scrivi 1 quindi io passo una stringa che dev'essere però
composta come riportato nel primo mess.. se io passo una scrivi1
("CIAO") non funziona, o meglio mi scrive porcherie..
quindi a me serve semplicemente una funzione che mi prenda la
variabile stringa che le passo, ad es. CIAO e che mi componga una
seconda stringa carattere per carattere puntando ai vari caratteri di
CIAO.. poi questa seconda stringa la passerei a scrivi1 e con questa
dovrebbe scrivere correttamente..la pensavo una cosa semplicissima ma
mi sta creando un sacco di problemi, non so se per colpa del
compilatore o per colpa del tipo di variabile che definisco in
scrivi2..
Non so se sono riuscito a spiegarmi meglio stavolta.. :-)

 ("CIAO") non funziona, o meglio mi scrive porcherie..
...
Dove nel primo mess avevi scritto:
stringa[0]='C';
stringa[1]='I';
stringa[2]='A';
stringa[3]='0';
stringa[4]='\0';
Quello che non capisco io � che differenza ci sia tra chiamare
scrivi1(stringa);
e direttamente
scrivi1("CIAO");
Dovrebbe essere esattamente la stessa cosa.
Le stringhe C (di questo stiamo trattando) sono esattamente array di 
char terminate da 0.

 char terminate da 0.
Eh purtroppo passando la scrivi1("CIAO") mi scrive tutti caratteri
strani e illeggibili.. e tra l'altro non solo 4 ma 7-8-9..dipende..è
davvero una cosa strana,come se andasse a puntare in qualche altra
locazione di memoria..

 }
Quello che ti manca � lo '\0' di fine stringa. Farei cos�:
void scrivi2(const char *p) {
    char stringa[40];
    char *q=stringa;
    while(*p) *(q++)=*(p++);
    *q=0;
    scrivi1(stringa);
}
Il problema che descrivi (nell'altro messaggio) probabilmente � dovuto 
ad una diversa gestione della memoria ROM dalla RAM, per cui sembra che 
il compilatore non sia in grado di copiare direttamente dalla ROM ad un 
registro, ma debba passare dalla RAM.
E.

 - Mostra testo citato -
Ciao, grazie per il consiglio ma purtroppo neanche questa soluzione
funziona... :-(