Dlaczego kod nie działa?

Dlaczego kod nie działa?
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Cześć, napisałem kawałek kodu, który oblicza ile razy przecięto 0(zmieniono znak)
Program kompiluje się poprawnie.
Uruchamiam go wraz z danymi wejściowymi w dokumencie txt komendą " cat dane.txt|./a.out "
Program działa popranie na macOS, jednak kiedy przekopiowałem kod na serwer z systemem solaris po skompilowaniu wyświetla błąd danych.
To samo dzieje się na serwerze z debianem.

Załączam kod, dane wejściowe i screenshoty.

Kopiuj
#include <stdio.h>
#define UP 10
#define LOW -10
#define END 99

int main() {

    float parametr1, parametr2, i=0;
    int cross0=0, number=1;  /*cross0=liczba przecięć 0*/

do {
    scanf("%f", &parametr1); /*wczytanie danych*/
    i++;
    
    if (parametr1>=LOW && parametr1<=UP) /*Sprawdzenie czy wartość zawiera się w <-10,10>*/
        if (parametr1*parametr2<0) { /*Sprawdzenie czy występuje przecięcie 0*/
            parametr2=parametr1;
            cross0++; }
    
    if (i==98) {
        
        if(cross0>=8 && cross0<=14) /*Sprawdzenie czy częstotliwość nalezy do przedziału od 8 do 14*/
            printf("Pomiar %d. Częstotliowość wynosi %d \n", number, cross0); /*Wyświetlenie częstotliowść dla 99 pomiarów*/
        else
            printf("Pomiar %d. Błąd danych! Częstotliwość wynosi %d \n", number, cross0);
        i=0;       /*Zerowanie wskaźników*/
        cross0=0;
        number++;
    }

} while (parametr1!=END); /*Koniec programu dla 99*/
    return 0;
}
atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

Obstawiam na Undefined Behaviour - masz niezainicjalizowaną zmienną parametr2 a mnożysz ją z parametr1

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0
atmal napisał(a):

Obstawiam na Undefined Behaviour - masz niezainicjalizowaną zmienną parametr2 a mnożysz ją z parametr1

Zainicjalizowanie parametr2=0 nie pomogło.

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

Ale jeżeli zainicjalizujesz tą zmienną wartością 0 to nigdy nie wykona Ci się:

Kopiuj
if(parametr1 * parametr2 < 0)

Bo cokolwiek * 0 = 0

Zainicjalizuj jako 1 i powinno być ok.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

A co to ma niby robić? Bo niby to co opisałeś w tekście, ale jednak nie do końca.

atmal
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 913
0

Też nie mogłem z początku zrozumieć ale doszedłem to tego że program liczy ile razy zmienił się znak. Choć nie rozumiem dlaczego ilość mniejsza niż 8 lub większa niż 14 oznacza błąd, ale to już nie ma dużego znaczenia.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Stawiam na to, że w jednym przypadku wprowadzasz złe dane i od tego momentu program nic nie wczytuje.
Pętla powinna wyglądać tak:

Kopiuj
while (1 == scanf("%f", &parametr1))
{
    …
    ++i;
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.