Решено: Подпрограмма с Do While и For делает неизвестную ошибку G CC Дамп ядра (ошибка сегмента) - PullRequest
0 голосов
/ 03 апреля 2020

После компиляции этой программы с помощью G CC (Linux или Windows или онлайнового тестового компилятора) она каждый раз завершается сбоем по-разному. Я не понимаю, где я допустил ошибку.

В Ubuntu Linux программа вылетает без печати ответа.

В Windows 10 (MSYS), она зацикливается бесконечно без распечатка любого сообщения.

На онлайн-компиляторе, который я пробовал, происходит сбой при ошибке сегментации (и дамп ядра и код выхода 139).

Вот код:

#include <stdio.h>

int main() {

  float riga[1][3];
  int ciclo = 2;
  int calcolo;
  float totale;
  int codice = 0;
  int quanti = 1;
  int prezzo = 2;

  printf("\n Inserendo una quantita pari a 0 si conclude con il totale");

  do {
    codice++;
    printf("\n Numero: %d Inserire la quantita:", codice);

    scanf("%f", &riga[codice][quanti]);

    if ( riga[codice][quanti] < 1 ){
      printf("\n Calcolo del totale.");
      ciclo = 1;
    } else {
      printf("\n Numero: %d Inserire il prezzo:", codice);
      scanf("%f", &riga[codice][prezzo]);
    }

    //printf("\n Quantita: %f Prezzo: %f", riga[codice -1][quanti], riga[codice -1 ][prezzo]);
    //printf("\n Ciclo = %d", ciclo);

  } while( ciclo != 1 );

  printf("\n Totale in calcolo");

  for ( calcolo = 1; calcolo < (codice + 1); calcolo++){
    //printf("\n Prezzo = %f",riga[calcolo][prezzo] );
    totale = totale + (riga[calcolo][prezzo] * riga[calcolo][quanti]);  
  }
  printf("\n Totale: %f", totale);

  return 0;
}

Что с ним не так?

1 Ответ

1 голос
/ 03 апреля 2020

1.не используйте неинициализированные переменные, и вам следует инициализировать totale.

2.не передавать границы вашего массива, иначе это приведет к неопределенному поведению.

здесь, в этом объявлении float riga[1][3];, первое измерение имеет только один элемент. Ваше увеличение здесь codice++; недопустимо, у вас нет riga[1][num] у вас есть только riga[0][num]. Поэтому удалите эту строку codice++; и также проверьте ваше условие while, чтобы вы не сканировали более 3 элементов для второго измерения массива.

здесь

for ( calcolo = 1; calcolo < (codice + 1); calcolo++){
    totale = totale + (riga[calcolo][prezzo] * riga[calcolo][quanti]);
}

снова вы проходите границы массива. calcolo может быть только нулем.

, как @Джол Боллинджер сказал базовую точку относительно массивов: они индексируются с 0, а не с 1.

...