Torna indietro   Hardware Upgrade Forum > Software > Programmazione

ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz
ASUS ROG Swift OLED PG34WCDN è il primo monitor gaming con pannello QD-OLED Gen 5 a layout RGB Stripe Pixel e 360 Hz su 34 pollici: lo abbiamo misurato con sonde colorimetriche e NVIDIA LDAT. Ecco tutti i dati
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico
Nothing Phone (4a) Pro cambia pelle: l'alluminio unibody sostituisce la trasparenza integrale, portando una solidità inedita. Sotto il cofano troviamo uno Snapdragon 7 Gen 4 che spinge forte, mentre il display è quasi da top dig amma. Con un teleobiettivo 3.5x e la Glyph Matrix evoluta, è la prova di maturità di Carl Pei. C'è qualche compromesso, ma a 499EUR la sostanza hardware e la sua unicità lo rendono un buon "flagship killer" in salsa 2026
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro
Con Midnight, Blizzard tenta il colpaccio: il player housing sbarca finalmente su Azeroth insieme a una Quel'Thalas ricostruita da zero. Tra il dramma della famiglia Ventolesto e il nuovo Prey System, ecco com'è la nuova espansione di World of Warcraft
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-11-2008, 16:26   #1
mto89
Senior Member
 
L'Avatar di mto89
 
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
[c] grossi dubbi con le stringhe

ho un po di problemi con le stringhe in c:

1. perchè se scrivo
char prova[5]={"ciao"}; funziona ma se scrivo:

char prova[5];
prova="ciao"; oppure prova={"ciao"}; non va???

in piu ho notato che scrivendo
char *prova[5];
prova="ciao"; funziona, ma per quale motivo?

2. ho una struct del tipo:
struct prova{ char stringa[5]};
struct prova struttura;
struttura.stringa="ciao"; e non funziona quest'ultima riga, come faccio?

vi sarei davvero grato di una mano! In sostanza come posso modificare una stringa dopo l'inizializzazione?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit
mto89 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2008, 23:47   #2
royaleagle
Senior Member
 
L'Avatar di royaleagle
 
Iscritto dal: Jan 2007
Messaggi: 1237
Non funziona perchè prova (nel punto 1) e stringa (nel punto 2) sono puntatori al primo elemento dei rispettivi array, che sono array di char.
Quindi tu invece assegni una stringa ad un char.
__________________
59 trattative ok (ultimo: IntoTrouble)
royaleagle è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 00:09   #3
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
1. "Ciao" è un cosiddetto literal constant. Di fatto è un stringa che è allocata in memoria al momento della creazione del programma. Ha quindi una sua allocazione ed una sua posizione in memoria.

char *p = "Ciao";

assegna al puntatore p l'indirizzo del literal constant.

{"Ciao"} o "Ciao" si possono usare per inizializzare le stringhe...ma SOLO in fase di inizializzazione.
Infatti se io scrivo:

char x[5];
x = "ciao";

è un errore perché x ha un puntatore predefinito durante l'inizializzazione e NON MODIFICABILE. Quindi è impossibile modifcare x assegnandogli il puntatore a literal constant.

2. Per modificare il valore di una stringa si usa la funzione di libreria strcpy.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 13:20   #4
mto89
Senior Member
 
L'Avatar di mto89
 
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
Quote:
Originariamente inviato da cionci Guarda i messaggi
1. "Ciao" è un cosiddetto literal constant. Di fatto è un stringa che è allocata in memoria al momento della creazione del programma. Ha quindi una sua allocazione ed una sua posizione in memoria.

char *p = "Ciao";

assegna al puntatore p l'indirizzo del literal constant.

{"Ciao"} o "Ciao" si possono usare per inizializzare le stringhe...ma SOLO in fase di inizializzazione.
Infatti se io scrivo:

char x[5];
x = "ciao";

è un errore perché x ha un puntatore predefinito durante l'inizializzazione e NON MODIFICABILE. Quindi è impossibile modifcare x assegnandogli il puntatore a literal constant.

2. Per modificare il valore di una stringa si usa la funzione di libreria strcpy.
grazie mille, quindi se scrivo
char*prova;
*prova="ciao";
funziona perchè vado ad agire sul contenuro dell'indirizzo puntato giusto?

quindi senza le function della libreria string è praticamente impossibile lavorare bene con le stringhe no?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit
mto89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 13:37   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da mto89 Guarda i messaggi
quindi senza le function della libreria string è praticamente impossibile lavorare bene con le stringhe no?
No, puoi lavorarci lo stesso, ma in pratica ciò significa andare a implementarsi le stesse funzionalità che quella libreria espone.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 13:52   #6
royaleagle
Senior Member
 
L'Avatar di royaleagle
 
Iscritto dal: Jan 2007
Messaggi: 1237
Quote:
Originariamente inviato da mto89 Guarda i messaggi
grazie mille, quindi se scrivo
char*prova;
*prova="ciao";
funziona perchè vado ad agire sul contenuro dell'indirizzo puntato giusto?
No, devi scrivere:
Codice:
char*prova;
prova="ciao";
__________________
59 trattative ok (ultimo: IntoTrouble)
royaleagle è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 14:00   #7
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 royaleagle Guarda i messaggi
No, devi scrivere:
Codice:
char*prova;
prova="ciao";
E' legale, ma attenzione...è rischioso perché questo provoca un errore:

char *prova;
prova = "ciao";
prova[1] = 'b'; <------è errato perché si va a modificare un literal constant

Non so in C, ma in C++ prova = "ciao" genera uno warning:
/home/cionci/provacpp/prova.cpp|163|warning: deprecated conversion from string constant to ‘char*’|

Al contrario questo non lo genera su prova = "ciao", ma viene segnalato un errore sulla riga succesiva:

const char *prova;
prova = "ciao";
prova[1] = 'b'; <------errore
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 16:47   #8
mto89
Senior Member
 
L'Avatar di mto89
 
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
ok ora è tutto un poco più chiaro! sono alle prese col c da qualche mese, prima avevo studiato java e pascal, trovo che una delle "pecche" maggiori del c sia la mancanza di una variabile di tipo string, che renderebbe la risoluzione di molti problemi piu semplici, non trovate anche voi?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit
mto89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 16:54   #9
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
Concordo...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 17:11   #10
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da mto89 Guarda i messaggi
ok ora è tutto un poco più chiaro! sono alle prese col c da qualche mese, prima avevo studiato java e pascal, trovo che una delle "pecche" maggiori del c sia la mancanza di una variabile di tipo string, che renderebbe la risoluzione di molti problemi piu semplici, non trovate anche voi?
Più semplice ma meno performante. È il rovescio della medaglia

x Cionci :
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 17:15   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
Più semplice ma meno performante. È il rovescio della medaglia

x Cionci :
C'avrei giurato
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 17:18   #12
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
C'avrei giurato
Ohé banryu,

sto sperimentando delle faccine che non avevo mai utilizzato e che mi piacciono un sacco. Perciò tie':


Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 17:20   #13
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Allora buon week end , lol
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 15:32   #14
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da mto89 Guarda i messaggi
ho un po di problemi con le stringhe in c:

1. perchè se scrivo
char prova[5]={"ciao"}; funziona ma se scrivo:

char prova[5];
prova="ciao"; oppure prova={"ciao"}; non va???
char prova[5] = "ciao";

analizziamo da destra a sinistra :
-"ciao"
questo non fa altro che creare una stringa costante (const char *)

-char prova[5]
questo crea un vettore di 5 elementi di tipo char;
come è gestito un vettore : un vettore è gestito come un puntatore costante al primo elemento, infatti utilizzando il suo nome (nel tuo caso - prova) non fai altro che utilizzare l'indirizzo della prima locazione di memoria puntata da tale variabile.
come si gestiscono i puntatori costanti, devono essere subito inizzializzati all'atto della dichiarazione, quindi bisogna definirli subito.

ecco perchè nel primo caso funziona.
poi nel secondo caso, come detto, essendo un puntatore costante, non puo essere riassegnato.

Quote:
Originariamente inviato da mto89 Guarda i messaggi
in piu ho notato che scrivendo
char *prova[5];
prova="ciao"; funziona, ma per quale motivo?
prova = "ciao"; NON funziona
per farlo funzionare dovresti fare :
*prova = "ciao";

Quote:
Originariamente inviato da mto89 Guarda i messaggi
2. ho una struct del tipo:
struct prova{ char stringa[5]};
struct prova struttura;
struttura.stringa="ciao"; e non funziona quest'ultima riga, come faccio?
il motivo è lo stesso che ti ho spiegato prima

Quote:
Originariamente inviato da mto89 Guarda i messaggi
vi sarei davvero grato di una mano! In sostanza come posso modificare una stringa dopo l'inizializzazione?
Codice:
//sd = stringa destinazione
//so = stringa origina
char *CopiaStringa(char *sd, const char *so)
{
	char *temp = sd;
	while(*sd++ = *so++) ;
	return sd;
}
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 15:49   #15
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da cionci Guarda i messaggi
E' legale, ma attenzione...è rischioso perché questo provoca un errore:
scusa, ma se da un'errore allora non è legale .... no ?
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 15:53   #16
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 Alex_87_xelA Guarda i messaggi
scusa, ma se da un'errore allora non è legale .... no ?
La modifica della stringa provoca un errore, non l'assegnazione.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 15:55   #17
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da cionci Guarda i messaggi
char *prova;
prova = "ciao";
prova[1] = 'b'; <------è errato perché si va a modificare un literal constant
prova = "ciao"; <----- questo è un'errore
proca[1] = 'b'; <------ questo non è un'errore in questo caso.

era un'errore se si aveva :
const char *prova;
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 15:55   #18
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 Alex_87_xelA Guarda i messaggi
scusa, ma se da un'errore allora non è legale .... no ?
La modifica della stringa provoca un errore, non l'assegnazione.
L'assegnazione di un literal constant provoca uno warning che l'assegnamento è deprecato. Il fatto che sia deprecata non significa che sia illegale, è legale, ma deprecata.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 15:57   #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 Alex_87_xelA Guarda i messaggi
prova = "ciao"; <----- questo è un'errore
proca[1] = 'b'; <------ questo non è un'errore in questo caso.

era un'errore se si aveva :
const char *prova;
No, l'errore è la modifica tramite prova, visto che prova punta ad un literal constant. Se non si usa quel puntatore per modificare il literal costant allora non si avranno problemi ed il codice continuerà a funzionare. Leggi gli errori, non me li sono inventati, li ha scritti il compilatore.
Se invece si va a fare una modifica tramite il puntatore il codice provocherà un segmentation fault a runtime.

Ultima modifica di cionci : 22-11-2008 alle 15:59.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:04   #20
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da cionci Guarda i messaggi
Se invece si va a fare una modifica tramite il puntatore il codice provocherà un segmentation fault a runtime.
ho appena provato e hai ragione
ero andato un po a ricordi
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


ASUS ROG Swift OLED PG34WCDN recensione: il primo QD-OLED RGB da 360 Hz ASUS ROG Swift OLED PG34WCDN recensione: il prim...
Recensione Nothing Phone (4a) Pro: finalmente in alluminio, ma dal design sempre unico Recensione Nothing Phone (4a) Pro: finalmente in...
WoW: Midnight, Blizzard mette il primo, storico mattone per l'housing e molto altro WoW: Midnight, Blizzard mette il primo, storico ...
Ecovacs Goat O1200 LiDAR Pro: la prova del robot tagliaerba con tagliabordi integrato Ecovacs Goat O1200 LiDAR Pro: la prova del robot...
Recensione Samsung Galaxy S26+: sfida l'Ultra, ma ha senso di esistere? Recensione Samsung Galaxy S26+: sfida l'Ultra, m...
Secondo Elon Musk FSD è più...
Anche Cloudflare fissa il 2029 per la si...
Hacker sfruttano da mesi un bug segreto ...
ASUSTOR Lockerstor 24R Pro Gen2: 24 bay ...
Rigetti supera la soglia dei 100 qubit: ...
eFootball raggiunge il miliardo di downl...
Come provare OpenClaw facilmente grazie ...
Microsoft conferma: questo glitch dell'o...
Toyota bZ7: una berlina da oltre 5 metri...
Artemis II, le prime foto del lato nasco...
Sempre più pubblicità su YouTube: arriva...
Polestar fa +80% in Italia e tocca quota...
Il tuo Mac smette di connettersi a Inter...
La nuova alleanza Intel-Google ridefinis...
Energia troppo cara, regole da rivedere:...
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: 05:57.


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