2016-03-30 4 views
0

Dieser Code für die Toleranzanalyse kompiliert und läuft, aber die Ausgabe ist falsch und ich glaube, es ist die falsche Behandlung der Datei und der Daten in der Datei.Problem mit FILE I/O und Verwendung von Daten innerhalb

Die Daten in der Datei ist:

PART,2.000,-1,0.050,V 
PART,0.975,-1,0.025,V 
PART,3.000,+1,0.010,F 
GAP,0.000,0.080 

Der Code:

#include <stdlib.h> 
#include <string.h> 
#include <math.h> 

void parsePart(char input[], float*pnom, int*pinp, float*ptol, char*pFV); 
void parseGap(char input[], float *pmin, float *pmax); 
float meanGap(float nom[], float imp[], int size); 
float tolGap(float tol[], int size); 

int main() 
{ 
    FILE *ptable; 
    int i, num_of_parts; 
    int impact[10]; 
    float nominal[10], tolerance[10]; 
    char FV[10]; 
    char input_str[30]; 
    float max, min, gap, tol; 
    float curr_max, curr_min; 

    ptable=fopen("D:\\Input.txt", "r"); 

    for(i=0; i<11; i++); 
    { 
     fgets(input_str, 30, ptable); 
     if(input_str[0] == 'P') 
     { 
      parsePart(input_str, &nominal[i], &impact[i], &tolerance[i], &FV[i]); 
     } 
     else 
     { 
      parseGap(input_str, &min, &max); 
      num_of_parts = i; 

     } 
    } 

    gap = meanGap(nominal, impact, num_of_parts); 
    tol = tolGap(tolerance, num_of_parts); 
    curr_max = gap+tol; 
    curr_min = gap-tol; 

    printf("Gap mean is: %f inches\n", gap); 
    printf("Gap tolerance is: %f inches\n", tol); 

    if(fabs(max-curr_max)< 0.0001 && curr_max > (gap*2)) //they are equal 
    { 
     printf("The maximum gap is %f which is greater than the allowed %f\n", curr_max, gap*2); 
    } 
    else 
    { 
     printf("The maximum gap is %f which is within the allowed %f\n", curr_max, gap*2); 
    } 
    if(fabs(min+curr_min)<0.0001 && curr_min < gap-gap) 
    { 
     printf("The minimum gap is %f which is less than the allowed %f\n", curr_min, gap-gap); 
    } 
    else 
    { 
     printf("The minimum gap is %f which is within the allowed %f\n", curr_min, gap-gap); 
    } 
    return 0; 
} 

void parsePart(char input[], float*pnom, int*pinp, float*ptol, char*pFV) 
{ 
    int i; 
    char * field[5]; 

    field[0]=strtok(input, ","); 

    for(i=1; i<5; i++); 
    { 
     field[i] = strtok(NULL, ","); 
    } 

    *pnom = atof(field[1]); 
    *pinp = atoi(field[2]); 
    *ptol = atof(field[3]); 
    *pFV = *field[4]; 
} 

void parseGap(char input[], float *pmin, float *pmax) 
{ 
    char *field[2]; 

    field[0] = strtok(input, ","); 
    field[1] = strtok(NULL, ","); 
    field[2] = strtok(NULL, ","); 

    *pmin = atof(field[1]); 
    *pmax = atof(field[2]); 
} 

float meanGap(float nom[], float imp[], int size) 
{ 
    int i; 
    float sum=0; 

    for(i=0; i<size; i++); 
    { 
     sum += nom[i]*imp[i]; 
    } 
    return sum; 
} 
float tolGap(float tol[], int size) 
{ 

    int i; 
    float sum=0; 

    for(i=0; i<size; i++); 
    { 
     sum += tol[i]; 
    } 
    return sum; 
} 

Die Ausgabe sollte wie etwas aussehen:

Actual Gap Mean: 0.025” 
Actual Gap Tolerance: 0.085” 
The Maximum Gap (0.110”) is (Greater) than specified (0.080”) 
The Minimum Gap (-0.060”) is (Less) than the specified (0.000”) 

ich eine 0 für Lücke bekommen bedeuten und Alle anderen Werte sind unglaublich große Zahlen.

Alle Hinweise, wo ich schief gehen oder verbessert werden könnte, sind großartig. Vielen Dank.

+0

Warum nicht durch Ihr Programm in einem Debugger gehen, um zu verfolgen, wo die Dinge schief gehen? – kaylum

+0

Auf Konvertierungs-/Zwangsfehler und undefiniertes Verhalten prüfen. – Olaf

+0

parseGap ist falsch codiert. Jedes Feld sollte eine Zeichenfolge sein, die groß genug ist, um den längsten möglichen Wert zu enthalten. Sie verwenden derzeit Zeiger auf Zeichenfolgen ohne zugeordneten Speicher. –

Antwort

0

In Zeile 85 sollte char *field[2];char *field[3]; sein.

-1
typedef struct{char c[6];} String; 
    String field1,field2,… …; 
    String *pf1,*pf2,… …; 

    pf1=field1; 
    pf2=field2; 
    … 
    … 
    pf1=strtok(input,… 

Ist die richtige (outline) Weg parseGap vorausgesetzt die längsten Daten in der Eingabedatei 5 Zeichen lang, codieren

+0

'strtok' gibt einen Zeiger auf das Token zurück, anstatt das Token an einen Ort im Speicher zu kopieren, also' char * pf1; pf1 = strtok (Eingabe, ","); 'ist genug. – v7d8dpo4

0

Erstens Auswirkungen Arrayset al werden bei 10 so bemessen, so

for(i=0; i<11; i++); 

falsch ist aus 2 Gründen:

1) Schleife sollte von 0 bis 9 gehen

2) a für Anweisung sollte nicht a; danach beendet das die ganze Aussage.

+0

Auch ** für ** in ** parsePart ** kein Semikolon am Ende von für Anweisung. –