PDA

View Full Version : Problema Esecuzione programma C


vanhalen
21-06-2005, 20:42
Ho fatto questo programma che conta in un array di struct quante volte compaiono le parole in un testo preso da un file.
Il problema è che l'eseguibile (pure dal prompt) non fa niente... carica un po' e
basta. Il programma è sviluppato su Dev-C++ e pure in questo ambiente la finestra di esecuzione si apre e dopo un istante si chiude!
Help

#include <stdio.h>
#include <string.h>
#define SIZE 20

struct count {
char nome[14];
int n;
};
typedef struct count lista;

int RicercaEsaustiva(lista *,char *);



main(){

lista persone[SIZE];
int i;
for(i=0; i<=SIZE-1; i++){
strcpy(persone[i].nome,"");
persone[i].n=0;
}

char parola[14];
FILE *fPtr;
int resp=0;
i=0;
if ((fPtr=fopen("testo.h", "r")) == NULL)
printf("Non posso aprire il file\n");
else{

while (!feof(fPtr)){
fscanf(fPtr, "%s", parola);
if((resp=RicercaEsaustiva(persone, parola)) != -1)
persone[resp].n=persone[resp].n + 1;

else{
strcpy(persone[i].nome,parola);
persone[i++].n=1; <----------------------------------------

}

}
for(i=0; i<=SIZE-1;i++)
printf("%-14s%10d\n", persone[i].nome, persone[i].n);
}
system("pause");
return 0;
}


int RicercaEsaustiva(lista *p, char *str){
int u=0;
for (u=0; u<=SIZE-1; u++){
if (!strncmp(p[u].nome,str, 14 ))
return u;
}
return -1;
}

.........................................................................................................
Mi da questo problema (strano ma vero) da quando ho messo i++ nell'else del ciclo del main.

Boh!!

kk3z
21-06-2005, 20:59
code
tags

intorno al tuo codice metti [c*de]tuo codice[/c*de] (* = o), altrimenti non si capisce 'na mazza senza indentatura

vanhalen
21-06-2005, 21:03
[c*de]
/* Esame*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define SIZE 20

struct count {
char nome[14];
int n;
};
typedef struct count lista;

int RicercaEsaustiva(lista *,char *);



main(){

lista persone[SIZE];
int i;
for(i=0; i<=SIZE-1; i++){
strcpy(persone[i].nome,"");
persone[i].n=0;
}

char parola[14];
FILE *fPtr;
int resp=0;
i=0;
if ((fPtr=fopen("testo.h", "r")) == NULL)
printf("Non posso aprire il file\n");
else{

while (!feof(fPtr)){
fscanf(fPtr, "%s", parola);
if((resp=RicercaEsaustiva(persone, parola)) != -1)
persone[resp].n=persone[resp].n + 1;

else{
strcpy(persone[i].nome,parola);
persone[i++].n=1;

}

}

for(i=0; i<=SIZE-1;i++)
printf("%-14s%10d\n", persone[i].nome, persone[i].n);
}
system("pause");
return 0;
}


int RicercaEsaustiva(lista *p, char *str){
int u=0;
for (u=0; u<=SIZE-1; u++){
if (!strncmp(p[u].nome,str, 14 ))
return u;
}
return -1;
}

[/c*de] (* = o)


Scusami......

vanhalen
21-06-2005, 21:04
Niente da fare

kk3z
21-06-2005, 21:07
* = o

asterisco = lettera o

sorry sono un po' scrobutico a volte :(

jappilas
21-06-2005, 21:29
hai provato a fare il debug ?
quella che tu vedi aprirsi e chiudersi istantaneamente è la console in cui appare l' errore "non posso aprire il file premere un tasto per continuare..."
anche con un testo, non si vede comunque altro perchè non entra nell' ultimo loop che eseguirebbe la stampa, resp è settato a -1 una volta e non cambia più...

Brazorv
21-06-2005, 22:08
a me funziona.
l'ho provato con Borland c++ code blocks e dev-c++ 4.9.9.2

vanhalen
22-06-2005, 10:10
Grazie a tutti...
Ancora non sono riuscito a risolvere ma vorrei ripetere la stranezza che ho scritto nel primo post:

Se metto i++ nell'else del ciclo while(!feof(fPtr) il problema c'è. Se invece faccio l'ERRORE di mettere 'i' invece di 'i++' la lista viene stampata con l'errore logico.(cioè la lista è vuota tranne per il primo elemento a cui corrisponde l'ultima
parola del testo)(... e il contatore delle parole funziona....)

Grazie ancora

vanhalen
22-06-2005, 11:18
[c*de]

while (!feof(fPtr)){
if ( i != SIZE){ <-----------------------------
scanf(fPtr, "%s", parola);
if((resp=RicercaEsaustiva(persone, parola)) != -1)
persone[resp].n=persone[resp].n + 1;

else{
strcpy(persone[i].nome,parola);
persone[i++].n=1;

}

}
}
for(i=0; i<=SIZE-1;i++)
printf("%-14s%10d\n", persone[i].nome, persone[i].n);
}
system("pause");
return 0;
}


int RicercaEsaustiva(lista *p, char *str){
int u=0;
for (u=0; u<=SIZE-1; u++){
if (!strncmp(p[u].nome,str, 14 ))
return u;
}
return -1;
}

[/c*de] (* = 0)




Trovato l'errore!!!! Andava aggiunto un controllo sulla fine dell' ARRAY.... Non so perchè... ma andava fatto e ora è tutto OK!

GRazie ugualmente.

Ciao a tutti