2015-02-15 7 views
-2

Я написал c-скрипт, который создает текстовый файл для другого приложения. Число с плавающей запятой «b» получает очень высокое значение, и я не уверен, почему. У меня почти идентичный файл, в котором этого не происходит. Я новичок в C, поэтому любая помощь была бы оценена - я ценю, что это может быть очень простая ошибка. Код ниже.Число с плавающей запятой, принимающее неожиданно высокое значение

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


#define LARGESTR 1000 
#define INITIALTIME 40 

void clear_string(char *s,int l) 
{ 
    int i; 

    for(i=0; i<l; i++) 
     s[i]='\0'; 
} 

int main(void) 
{ 
    char buffer[LARGESTR]; 
    int ramp_flow = 5, car_count_seg1 = 45, car_count_seg2 = 45, car_count_seg3 = 45, fw_upstream_queue = 20, onramp_queue = 60, a; 
    float outflow_count, percentout = 0.7, b; 

    //Total Input to system 
    for(a=(INITIALTIME + 10); a<(INITIALTIME + 250); a+=10) { 
     if((a>=10) && (a<600)) { 
      b=b+1.39+0.556; 
     } 
     if((a>=600) && (a<1200)) { 
      b=b+(((a*9.167)-5000)/360)+(((a*1.67)-800)/360); 
     } 
     if((a>=1200) && (a<2700)) { 
      b=b+16.67+3.33; 
     } 
     if((a>=2700) && (a<3300)) { 
      b=b+(((a*(-10))+33000)/360)+(((a*(-2))+6600)/360); 
     } 
     if((a>=3300) && (a<4800)) { 
     } 
    } 
    printf("%f\n", b); 
    b = b + car_count_seg1 + car_count_seg2 + car_count_seg3 + fw_upstream_queue + onramp_queue; 
    printf("%f\n", b); 
    outflow_count = b*percentout; 
    printf("%f\n", outflow_count); 

    FILE *fp; 

    fp=fopen("1rampproblem.pddl","w+"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"\n(define (problem trafficjuncprob)\n(:domain traffic-junction)\n(:objects)\n(:init"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (outflow-count) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (critical-density) 45)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (maximum-density) 270)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (maximum-flow) 20)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (time) %d)",INITIALTIME); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (zero) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (toggle) 1)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (count) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (ramp-flow) %d)",ramp_flow); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (ramp-flow-realised) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (car-count-seg1) %d)",car_count_seg1); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (car-count-seg2) %d)",car_count_seg2); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (car-count-seg3) %d)",car_count_seg3); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (maxflow-0-1) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (maxflow-1-2) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (maxflow-2-3) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (maxflow-3-4) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (flow-0-1) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (flow-1-2) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (flow-2-3) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (flow-3-4) 0)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (fw-upstream-queue) %d)",fw_upstream_queue); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(= (onramp-queue) %d)",onramp_queue); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n)\n\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(:goal (> (outflow-count) %f)\n)\n", outflow_count); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    clear_string(buffer,LARGESTR); 
    sprintf(buffer,"(:metric minimize (total-time))\n)"); 
    fprintf(fp,"%s",buffer); 
    fprintf(fp,"\n"); 

    fclose(fp); 

    return 0; 
} 
+0

Я печатаю значение 'b' после первого цикла for и очень большое здесь – james

+0

Я имею в виду программу c. Я также знаю, что c я кодировал его несколько раз раньше - я просто застрял в этой проблеме. Не все являются экспертами. Вы должны начать где-то – james

+0

Игнорируя разницу между скомпилированным языком и интерпретируемым языком, вы должны прекратить писать программы и начать изучать и понимать эти понятия. –

ответ

4

Там нет initalizer для b в своем заявлении:

float outflow_count, percentout = 0.7, b; 

, поэтому его значение перед первым использованием является то, что случилось, осталось в стеке некоторого предыдущего использования этого слова. Каждое последующее значение зависит от его начального значения, поэтому нет оснований ожидать какого-либо определенного значения.

Предлагаю инициализировать его.

В остальном это советы о том, как спросить. Первое, что вам нужно было сделать, - это вычеркнуть все в вашей программе, которые не нужны для воспроизведения ошибки. Поскольку проблема присутствует при печати b после первого цикла, я удалил все после этого, а затем удаляются заявления, которые стали без ссылок в результате:

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

#define LARGESTR 1000 
#define INITIALTIME 40 

int main(void) 
{ 
    int a; 
    float b; 

    //Total Input to system 
    for(a=(INITIALTIME + 10); a<(INITIALTIME + 250); a+=10) { 
     if((a>=10) && (a<600)) { 
      b=b+1.39+0.556; 
     } 
     if((a>=600) && (a<1200)) { 
      b=b+(((a*9.167)-5000)/360)+(((a*1.67)-800)/360); 
     } 
     if((a>=1200) && (a<2700)) { 
      b=b+16.67+3.33; 
     } 
     if((a>=2700) && (a<3300)) { 
      b=b+(((a*(-10))+33000)/360)+(((a*(-2))+6600)/360); 
     } 
     if((a>=3300) && (a<4800)) { 
     } 
    } 
    printf("%f\n", b); 
    return 0; 
} 

В этом раздели программе проблема становится еще более очевидной ,

В отчете о проблемах должна содержаться урезанная программа с только соответствующим кодом, ожидаемое значение b, почему вы ожидали этого и что вы на самом деле получили.

+0

подскажите? если значение не инициализировано, программа будет вести себя неожиданно, поэтому доступ к неинициализированным значениям является серьезной проблемой, предполагая, что он очень слаб, я бы сказал, что вы должны его инициализировать ». Но все же +1 для ответа на сообщение, в котором утверждается, что 'c-script' не работает, этот OP не должен возиться с реальным языком программирования, например c. –

+0

Кроме того, вы можете ** предлагать ** использовать предупреждения компилятора, потому что такая проблема может случиться с кем угодно, если только они не используют предупреждения компилятора и не уведомляются перед компиляцией. –

+1

@iharob Существуют альтернативы, например, отбрасывание 'b' с правой стороны каждого присваивания и обеспечение того, что есть назначение в каждом пути. Однако самым простым и безопасным изменением в этом случае является его инициализация, поэтому я рекомендую это. –

Смежные вопросы