Newsgroup: it.comp.lang.c
Titolo: Abnormal program termination

#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
void main(){
 FILE *p;
 char t;
 int car;
 struct{
  char nome[30];
  char cognome[30];
  char indirizzo[40];
  char cap[3];
 } ind;
if((p=fopen("file.dat", "a"))==NULL){
 printf("\nError in open file...!");
 exit(1);
 }
do{
 clrscr();
 printf("\t\t*********** ISERIMENTO DATI ***********\n");
 printf("\nInserire il nome: ");
 gets(ind.nome);
 printf("\nInserire il cognome: ");
 gets(ind.cognome);
 printf("\nInserire l'indirizzo: ");
 gets(ind.indirizzo);
 printf("\nInserire il CAP: ");
 gets(ind.cap);
 fprintf(p, "%s %s\n %s %s\n", ind.nome, ind.cognome, ind.indirizzo,
ind.cap);
 printf("\nSi desidera continuare? s/n: ");
 cin >> t;
}while(t!='n');
fclose(p);
clrscr();
if((p=fopen("file.dat", "r"))==NULL){
 printf("\nError in open file...!");
 exit(1);
 }
while(!feof(p)){
 fscanf(p, "%s %s\n %s %s\n", &ind.nome, &ind.cognome, &ind.indirizzo,
&ind.cap);
 printf("%s %s\n %s %s\n", ind.nome, ind.cognome, ind.indirizzo, ind.cap);
 }
fclose(p);
}
Perchè mi da: "Abnormal program termination" ?
Grazie!
Mr_G_

&ind.cap);
Questa riga e' sicuramente sbagliata! Il nome di queste variabili, essendo
array, e' gia' l'indirizzo della variabile, non devi mettere la & davanti.
Poi se in input superi la dimensione delle su dette variabili, (es:
inserisci un CAP maggiore di 2 caratteri), ottieni piantamenti o casini
simili!
,gets(),,scanf(), non sono il massimo per l'input di array di carattere,
proprio perche' non puoi controllare quanti byte verranno scritti. Per
programmi MS-DOS prova a usare cgets().
ciao
donCiccio

array, e' gia' l'indirizzo della variabile, non devi mettere la & davanti.
Ho provato a togliere l'opertore & ma mi da sempre un messaggio di Abnormal
program termination
Grazie per l'attenzione
Mr_G_

...


program termination
hai fatto attenzione a non superare i limiti delle variabili quando
inserisci i dati da tastiera?
fai una prova con tutto lungo un solo carattere.
ciao
donCiccio

...


array, e' gia' l'indirizzo della variabile, non devi mettere la & davanti.
Non e' sbagliata, anzi.
Se ind.nome e' un "array-of-T" la & davanti vuol dire "pointer-to-array-of-T".
D'altra parte, scrivere soltanto il nome dell'array stabilisce una conversione
nel puntatore al suo primo elemento ovvero si passa da "array-of-T" a
"pointer-to-array-of-T" e quindi, come vedi, e' la stessa cosa.
L'errore e' dovuto sicuramente ad altre cause.
Andrea Laforgia
----
I guai ve li andate a cercare : 
quando Bill Gates annuncio' che avrebbe fatto scrivere 
Windows98 a Topo Gigio perche' non gli avete creduto ?

>Non e' sbagliata, anzi.
Hai ragione! chiedo scusa per la gaffe!
ciao
donCiccio

...




 L'errore e' dovuto sicuramente ad altre cause.
Attenzione: anche se č vero che in quel caso i problemi erano piů di
uno, passare un puntatore ad array di caratteri ad una funzione che si
aspetta un puntatore a carattere č sbagliato in quanto i tipi sono
incompatibili (ed un compilatore serio dovrebbe per lo meno dare un
warning). Pensa, ad esempio, a cosa succede all'aritmetica dei due
puntatori. Comunque basta provare il seguente esempio per vedere che la
cosa non funziona:
#include <stdio.h>
void pippo( char *a )
{
    printf( "%s\n", a );
    printf( "%s\n", &a );
}
int main()
{
    char a[] = "Prova di scrittura.";
    pippo( a );
    return 0;
}
EMG

}
Per dimostrare l'incompatibilita' degli argomenti il programma andrebbe
riscritto come :
#include <stdio.h>
void pippo( char *a )
{
    printf( "%s\n", a );
}
int main()
{
    char a[] = "Prova di scrittura.";
    pippo( a );
    pippo( &a );
    return 0;
}
In questo caso il contenuto di a[] viene scritto correttamente in entrambi i
casi nonostante pippo( &a ) generi un warning.
Pero' e' giusto quello che dici : l'aritmetica sul puntatore potrebbe condurre
ad altri risultati.




 Attenzione : nel tuo programma la situazione e' diversa :
Tutto giusto.
EMG