Newsgroup: it.comp.lang.c
Titolo: Problemi di programmazione

Salve a tutti!
Da poco sono entrato in questo gruppo e spero di trarne qualche
vantaggio (sono un principiante).
Ho un paio di problemi sulla programmazione in C e sarò grato a
chiunque voglia rispondere a qualunque problema sotto descritto.
Problema 1.
Esaminiamo il seguente programma:
_______________________________
 
	char *p = "Edoardo";
	char *s;
	strcpy(s,p);
_______________________________
Il compilatore sotto Windows risponde:
NULL POINTER ASSIGNMENT.
Il compilatore sotto linux compila, il linker linka, ma in fase di
esecuzione il sistema operativo risponde:
SEGMENTATION FAULT (CORE DUMPED).
Il secondo argomento della strcpy non dà alcun problema (infatti p è
inizializzato, va bè ma che significa che è inizializzato), il
problema è il primo argomento.
Se anzichè scrivere
	char *s;
scrivo ad esempio
	char s[100];
tutto funziona regolarmente!
Oppure, se inizializzo anche *s con
	char *s="eddie";
Allora anche quì tutto funziona!
PERCHE'??
Ho riflettuto a lungo ma non sono riuscito a capire come funziona
l'intera faccenda.
SARO' GRATO A CHIUNQUE MI FORNIRA' CHIARIMENTI.
Problema 2.
Sotto linux mi diverto a scrivere i vari sottoprogrammi e le varie
funzioni in file a parte. ESEMPIO
____________________________
FILE MAIN.CPP
#include<iostream.h>
#include"prototipo.h"
void main(){
int i,d;
cout<<"Insert an integer: ";
cin>>i;
d = doppio(i);
cout<<"Il doppio è: "<<d<<endl;
}
FILE DOPPIO.CPP
int doppio(int x){
return x*2;
}
Poi lo compilo:
g++ -c DOPPIO.CPP
FILE PROTOTIPO.H
int doppio(int);
____________________________
A questo punto creo l'eseguibile:
g++ -o MAIN.CPP DOPPIO.O<invio>
Il problema è il seguente:
Se in qualche sottoprogramma devo usare le funzioni di INPUT/OUTPUT
cin e cout, i file come DOPPIO.CPP non si compilano perchè il
compilatore risponde ad esempio con UNDEFINED SYMBOL COUT.
Invece posso usare tranquillamente le funzioni PRINTF e SCANF.
PERCHE' CIN E COUT NON SONO RICONOSCIUTI, NEPPURE SE INCLUDO NEI FILE
CONTENENTI IL SOTTOPROGRAMMA LO HEADER IOSTREAM.H??  
UN GRAZIE ANTICIPATO A CHIUNQUE VORRA' RISPONDERE. 
 
						EDOARDO




The great question that has never been answered and which I have not
yet been able to answer despite my thirty years of research into the
feminine soul is: WHAT DOES A WOMAN WANT?
                -- Sigmund Freud

compilatore risponde ad esempio con UNDEFINED SYMBOL COUT.
Il C++ implementa i namespace, ovvero degli spazi di nomi entro cui sono
visibili funzioni e variabili.
Tutte le funzioni della libreria standard sono nel namespace std, quindi hai
2 scelte:
1) dichiari come namespace di default std, scrivendo
#include <iostream>
.
. <-- tutti i tuoi altri include
.
using namespace std;
La direttiva using namespace ti permette di vedere cin e cout.
2) al posto di cin e cout usi l'operatore di risoluzione dello scope, ovvero
i ::, ad esempio al posto di cin scrivi std::cin ed al posto di cout scrivi
std::cout.
Dovrebbe funzionare tutto.
Lanugo

CONTENENTI IL SOTTOPROGRAMMA LO HEADER IOSTREAM.H??  
#include <iostream>
using namespace std ;
oppure
#include <iostream>
e forzi l'uso di cin e cout con std::cin e std::cout.
Ma questo e' C++, non C, per cui : it.comp.lang.c++
--
Andrea Laforgia (ICQ 87230455)
http://www.geocities.com/AndreaLaforgia
"ci sono tre tipi di persone nel mondo : quelli che
 sono bravi in matematica e quelli che non lo sono."

>cin e cout, i file come DOPPIO.CPP non si compilano perchè il


Grazie, mi sei stato di aiuto.
A questo punto però mi è sorto un dubbio.
Se io scrivo:
		char *p="Edoardo";
Vado comunque a scrivere in una locazione di memoria arbitraria. Come
faccio a sapere se quì c'è abbastanza spazio per contenere la parola
"Edoardo"? E' allora scorretta questa assegnazione? O è forse il
compilatore che automaticamente conta i caratteri che servono e alloca
memoria di conseguenza come avviene per:
		char p[]="Edoardo";   ??????
Devo fare una puntualizzazione:
malloc ritorna un pointer void, per cui, per assegnarlo al nostro
pointer a char c'è bisogno di un costrutto cast:
if  ( (p = (char*) malloc( sizeof(char) * (strlen(s)+1) ) ) == NULL ) 
{
	printf ("Not enough memory\n");
	exit(-1);
}
Alla fine, questo era il mio programma originario, ora corretto grazie
a te:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
	char *str1, *str2;
	if( ( str1 = (char*) malloc(sizeof(char) * 128) ) == NULL) {
		printf("Errore in allocazione di memoria\n");
		exit(-1);
		}
	/* La gets legge al max 128 caratteri */
	printf("Inserire una frase:\n");
	gets(str1);
	if( ( str2 = (char*) malloc(sizeof(char) * strlen(str1)+1) )
== NULL) {
		printf("Errore in allocazione di memoria\n");
		exit(-1);
		}
	strcpy(str2,str1);
	printf("%s",str2);
}
 
On 25 Feb 2001 18:24:14 GMT, bar...@raffaello.home (Antonio barbone)
wrote:


 Ma che cosa è questo iostream senza il .h???
E' il nome dell'header file cosi' come lo prevede il C++ standard.
Scusa, ma leggi qualche testo di base sul C++ prima di continuare.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Univ. of Padova, Dept. of Physics - Padova, Italy            
lor...@pd.infn.it
The instructions said to use Windows 98 or better - so I installed FreeBSD.

if  ( (p = (char*) malloc( sizeof(char) * (strlen(s)+1) ) ) == NULL ) 
Assolutamente NO.
Attento : e' cosi' in C++, non in C.  Il C e' un linguaggio abbastanza
debole nel controllo dei tipi e forzare un cast significa indebolirlo
ancora di piu'.  Lo stesso Kernighan & Ritchie II versione afferma che
il cast e' necessario, subito smentito dai suoi Errata Corrige.
D'altronde il K&R II e' stato scritto quando lo standard doveva ancora
essere ratificato.  Secondo lo standard ISO, difatti, il cast e'
assolutamente inutile.


  GnuPG Key Fingerprint: 9747 635E B95A B0B3 4370 1CAA CAF7 512B 945C A44C

Non sapevo questo fatto del costrutto cast.
Il guaio è che mi stanno facendo imparare C/C++ insieme, cosi' non mi
accorgo di tutte queste differenze.


accorgo di tutte queste differenze.
Concentrati solo sul C++.
C'e' un libro "C++ Primer" di Lippman-Lajoie, in cui ci sono anche gli
elementi di base di C che ti servono per comprendere il C++.
