Возврат C ++ отличается, если Printf находится в функции - PullRequest
0 голосов
/ 03 мая 2018

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

Код, который выводит правильный ответ

double Shapefactor (char line [50][50]){

double sfactor;
double perimeter1= (Perimeter(line));
printf("peri = %f", perimeter1);
double area1=((double)Area(line));
sfactor = ((perimeter1 * perimeter1) /area1);                           
printf("----------------------------------------------------*Therefore the shape factor for the given shape is* %f \n", sfactor);  

   return (sfactor);                                              
 }

Это дает мне правильный вывод. Однако, если бы я убрал эту строку из кода

printf("peri = %f", perimeter1);

Тогда это дает мне неправильный номер. Ты хоть представляешь, почему это так?

Код города

int Area (char line [50][50]){
int x;                                                       
int y;
int sum;                                                       

  for (x = 0; x <= 50; x++) {                                
    for (y = 0; y <= 50; y++) {                              


      if (line[x][y] == '1')                                 
        sum++;                                           

    }
  }



 return (sum);                                                  

 }

Периметр

int Perimeter (char line [50][50]){
int x;                                                      
int y;
int sumup;                                                       
FILE * f_ptr;
char filename[20];


  for (x = 0; x < 50; x++) {
    for (y = 0; y < 50; y++) {

      if (line[x][y + 1] == '0' & line[x][y] == '1')         
        sumup++;                                                    
      else if (line[x][y] == '1' & line[x][y - 1] == '0')  
        sumup++;                                                   
      else if (line[x + 1][y] == '0' & line[x][y] == '1')    
        sumup++;                                                  
      else if (line[x][y] == '1' & line[x - 1][y] == '0')   
        sumup++;                                                   

    }
  }

 return (sumup);                                                    

  }

Спасибо

1 Ответ

0 голосов
/ 03 мая 2018

Переменная sum в Area() (РЕДАКТИРОВАТЬ: а также sumup в Perimeter(), как отмечено @agbinfo) неинициализирована:

int Area (char line [50][50]){
//...
int sum;                                                       

  for (x = 0; x <= 50; x++) {
    for (y = 0; y <= 50; y++) {
      if (line[x][y] == '1')
        sum++;
//...

Это неопределенное поведение; Это автоматическая переменная, и, скорее всего, вы читаете, что в стеке остался мусор при предыдущем вызове функции, то есть, вызываете ли вы printf() или нет, разница, которую вы видите.

Я рекомендую включить предупреждения компилятора и линтеры, которые обычно отлавливают подобные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...