Newsgroup: it.comp.lang.c++
Titolo: chiedo perdono, ma devo capire...

ragazzi, poi non rompo piu'
osservate:
#include <iostream.h>
void main()
{
 char *nome1;
 char *nome2;
 nome1 = "Gaetano";
 nome2 = "Gaetano";
  if (nome1 == nome2){
 cout << "I nomi sono uguali!! " << endl;
 }
}
va tutto perfettamente.
se cambio il listato in questo modo:
#include <iostream.h>
void main()
{
 char *nome1;
 char *nome2;
nome1 = "Gaetano";
cin >> nome2;
 if (nome1 == nome2){
cout << "I nomi sono uguali " << endl;
 }
}
si pianta alla grande.
(si pianta proprio, e vuole spedire la segnalazione alla microsoft.)
addirittura se scrivo:
#include <iostream.h>
void main()
{
char *nome;
cout << "Ciao, come ti chiami? " << endl;
cin >> nome;
cout << "Ciao " << nome << "! ";
}
si pianta alla grande e vuole mandare il messaggio di errore alla microsoft.
nonostante il libro da cui ho tratto l'esempio mi dica che funziona tutto
bene
a voi funzia? e se non funzia, PERCHEEEEEEE'????????
ciao
Marcello

 ragazzi, poi non rompo piu'
Ti hanno gią risposto, non TROLLEGGIARE!
-- 
Luc.


nella precedente mail hai scritto:
char RazzaMicio[32];  // per semplicità
--
Luc.
La tua non e' stata una risposta, e' stato un girare attorno al problema.
Tra tutte le risposte che ho avuto non ce n'e' stata una precisa e puntuale.
evidentemente sai fare le cose ma non sai perche' le fai in un certo modo.
Suscettibili questi programmatori in C++. Che sia il linguaggio che li rende
cosi'?

 funziona tutto bene a voi funzia?
Se il libro contiene un esempio identico a uno dei frammenti di codice che
hai riportato, buttalo.
Max

 a voi funzia? e se non funzia, PERCHEEEEEEE'????????
Perche' non hai capito un accidente di quello che stai facendo.
Prendi un buon testo per principianti e studialo con buona volonta'.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

  char *nome2;
usa
char nome1[128]
char nome2[128]
e vedrai che i nomi saranno diversi...(spiegami tu perche')
Secondo appunto  non devi piu' includere iostream.h ma iostream
e metti std::cout invece di cout e std::cin invece di cin.
Se non vuoi usare questa sintassi scrivi
using namespace std
Terzo appunto brucia quel libro, in quanto questo esempio mi sembra
decisamente sconclusionato, invece di vedere se due persone hanno lo stesso
nome, vede se i loro nomi sono allocati nello stesso indirizzo.
Ciao
Emanuele

 Prendi un buon testo per principianti e studialo con buona volonta'.
Mi consolo pensando che anche al dipartimento di fisica non capiscono un
accidente di quello che stanno facendo...compro il testo per principianti e
te lo passo...


 te lo passo...
SACRILEGIO!!!
;-OOO 
-- 
Luc.

 due puntatori puntano.
Se confrontasse il valore dei puntatori l'if non funzionerebbe, perche'
essendo due puuntatori diversi devono per forza puntare a cose diverse,
anche se hanno lo stesso contenuto.
Poi  se tu fai un cout di nome1 e nome2, ottieni Gaetano e non 00FF00 e
cosi' via.
questo perche' per la definizione di stringa in C++., quando dichiari char
*prova
il compilatore sa che vuoi dichiarare una stringa e tratta prova come
stringa.
Questo non dovrei essere io a dirtelo.
comunque copio dal mio testo, prima di bruciarlo:
"Ecco come si crea una stringa:
char *Frase = "Questa č una stringa"
la variabile Frase punta alla stringa
per visualizzare la stringa si puo' utilizzare la seguente istruzione:
cout << Frase"

 per visualizzare la stringa si puo' utilizzare la seguente istruzione:
...sto libro, sempre che esista, il salumiere te l'ha dato
insieme al prosciutto o l'hai pagato a parte?
-- 
// C Ya!
// Someone has already answered your question:
// 
http://www.google.com/advanced_group_search
// ** Cut "DO NOT DISTURB" to reply privately. **

 uguale
senza nessun intento polemico,
ma siamo in un ng di c++, quando qualcuno fa notare qualcosa che va 
contro le tue convinzioni, prima di rispondere "Non e' vero" non ti 
viene un dubbio e fai una prova?
#include <iostream>
int main() {
	char *p1;
	char *p2;
 
	p1="stringa costante";
	p2="stringa costante";
 
	std::cout << static_cast<void*>(p1) << " - " << static_cast<void*>(p2) 
<< std::endl;
}
C:\projects\Fragments\c++\ng>g++ main.cpp
C:\projects\Fragments\c++\ng>a
0x401280 - 0x401280
byez

 allo stesso oggetto.  Per questo hanno lo stesso valore.
Potrebbero anche avere valori diversi. Probabilmente il suo compilatore
aveva attivata l'ottimizzazione di "Merge duplicate string" o qualcosa
del genere.
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 perfettamente
O il tuo testo e' stato scritto da un idiota, o e' stato letto da un
idiota.
-- 


 idiota.
Chi ha responsabilita' e occupa posti importanti dovrebbe esere umile e
possibilista.
Non offendere gli altri.
E con il suo grado di istruzione dovrebbe aumentare la consapevolezza della
sua ignoranza, come disse un tale qualche tempo fa...
Il testo e' stato scritto da uno al di sopra di ogni discussione di noi due
poveri ignoranti.
E' stato letto da un ignorante che ha ravvisato una incongruenza e non e'
stato contento fino a che non la ha risolta.
E che e' maturato un po' grazie alla sua volonta' di ricercare la verita',
grazie al gruppo di simpatici e disponibili praticoni (ma poco rigorosi) a
cui ha chiesto aiuto e grazie all'autore del libro che gli ha spiegato
l'arcano in termini rigorosi.
E che non ti dira' la soluzione del problema, cosi' l'unico che rimarra'
ignorante sarai tu.
gg

 E che e' maturato un po' grazie alla sua volonta' di ricercare la verita',
E' da un po' di tempo che non si vedevano netkook... vabbe', plonk...


 te lo passo...
Se non accetti le spiegazioni di chi, più esperto di te, perde
(inutilmente, sembra) il suo tempo a scrivertele, perché fai domande qui
sul newsgroup?


 anche se hanno lo stesso contenuto.
Funziona perché, come ho già detto, probabilmente il compilatore
ottimizza le due stringhe uguali in una sola per risparmiare memoria.


 sul newsgroup?
Si chiamano netkook, la variante stupida dei troll... inutile 
rispondergli...


 insieme al prosciutto o l'hai pagato a parte?
ma tu sei uno stupido normale o uno stupido ++?

 rispondergli...
e tu ti chiami kooknet, la variante troll degli stupidi

 ragazzi, poi non rompo piu'
[...snip...]
Rispondo qui... ma ho seguito con attenzione tutto il thread.
Dicevo: scusa... ma in questo tuo favoloso libro non c'e' scritto... che ai
puntatori va allocata memoria? Non dev'essere il compilatore ad allocarla
per te sei *tu* che decidi
quanta memoria necessitano. Il compitatore puo fare delle deduzioni ma non č
un essere umano e solo un programma, per quanto complesso, per computer.
I puntatori contengono indirizzi di memoria la quale DEVE avere dei
"confini" precisi altrimenti contengono solo "spazzatura" del tuo Sistema
Operativo e dei tuoi programmi.
A parte il fatto che quello che scrivi non č C++ ma C perchč il C++ a parte
le differenze che ha con il C (costrutti sintattici in piů) fa un uso
intensivo della STL (Standard Template Library) per "semplificare" la vita
ai programmatori.
Ad esempio puoi allocare staticamente o dinamicamente lo spazio di memoria
per stringhe:
/* #> scritto in C <# */
#include <stdio.h> /* per la printf() */
#include <string.h> /* per la strcpy() */
#include <stdlib.h> /* per la malloc() */
int main() {
  const int SIZE = 30;
  int msgElem = 0;
  const char strExample[] = {"String Example"};
  const char strMsg[2][2 + 1] = {"No", "Si"};
  /*
  ** buffer da 30 byte allocato staticamente
  ** in un area di memoria che si chiama "stack"
  ** viene distrutto (deallocato) all'uscita del
  ** programma in questo caso.
  */
  char statBuf[SIZE + 1]; /* dichiarazione della variabile */
  strcpy(statBuf, strExample); /* copia la stringa nel buffer */
  /* Stampa il buffer su stdout */
  printf("\nIl buffer statico contiene: %s\n", statBuf);
  /*
  ** buffer da 30 byte allocato dinamicamente
  ** in un area di memoria che si chiama "heap"
  ** DEVI essere tu a liberare la memoria occupata.
  */
  char *dynBuf; /* dichiarazione della variabile */
  dynBuf = (char*)malloc(SIZE + 1); /* inizializzazione della variabile */
  strcpy(dynBuf, strExample); /* copia la stringa nel buffer */
  /* Stampa il buffer su stdout */
  printf("\nIl buffer dinamico contiene: %s\n", dynBuf);
  /* Confronto di stringhe case-insensitive */
  if (strcmpi(statBuf, dynBuf) == 0) msgElem = 1;
  /* Stampa il confronto su stdout */
  printf("\nLa prima stringa e': %s\n\nLa seconda stringa e': %s\n\
          \nSono uguali? %s\n", statBuf, dynBuf, strMsg[msgElem]);
  free(dynBuf); /* Libera la memoria */
  return 0;
}
/* #> scritto in C++ <# */
#include <string>
#include <iostream>
int main() {
  const char strExample[] = {"String Example"};
  int msgElem = 0;
  const char strMsg[2][2 + 1] = {"No", "Si"};
  /*
  ** buffer allocato staticamente
  ** in un area di memoria che si chiama "stack"
  ** viene distrutto (deallocato) all'uscita del
  ** programma in questo caso.
  */
  std::string statBuf; // dichiarazione della variabile.
  // copia la stringa nel buffer.
  statBuf = strExample;
  // Stampa il buffer su stdout
  std::cout << "\nIl buffer statico contiene: "<< statBuf << std::endl;
  /*
  ** buffer allocato dinamicamente
  ** in un area di memoria che si chiama "heap"
  ** DEVI essere tu a liberare la memoria occupata.
  */
  // dichiarazione e inizializzazione della variabile
  std::string *dynBuf;
  dynBuf = new std::string(strExample);
  // Stampa il buffer su stdout
  std::cout << "\nIl buffer dinamico contiene: "<< dynBuf->c_str() <<
std::endl;
  // Confronto di stringhe
  if (statBuf.compare(dynBuf->c_str()) == 0) msgElem = 1;
  // Stampa il confronto su stdout
  std::cout << "\nLa prima stringa e': " << statBuf << std::endl
            << "\nLa seconda stringa e': " << dynBuf->c_str() << std::endl
            << "\nSono uguali? " << strMsg[msgElem] << std::endl;
  delete dynBuf;
  return 0;
}
Sperando di essere stato chiaro vorrei esprimere una mia opinione e cioe:
Non ho intenzione di difendere il Prof. Loreti, si sa difendere benissimo da
solo, ma personalmente penso che tu abbia leggermente esagerato.
Mi spiace se quello che ho scritto nel modo "col cucchiaino" ti disturba ma
mi hai dato l'impressione che tu sia *veramente* a digiuno di come
funzionano i puntatori e annessi e connessi.
Cordiali Saluti
Rosario Ianuale