Błąd podczas kompilacji w programie w C

0

Ktoś wie dlaczego w tym programie dostaje

#include <stdio.h>
#include <io.h>
int  czytaj_wektor(double  *A,  int 
maksymalny_rozmiar)
{ 
int i;
FILE *plik_dane;
plik_dane = fopen("e:\\czytaj.mat", "rt");
i = 0;
while(!feof(plik_dane) && 
i<maksymalny_rozmiar)
{
i++;
fscanf(plik_dane, "%lf", &A[i]);
}
fclose(plik_dane);
return i; }
/* teraz program */
#define max_rozmiar 100
int main( )
{ 
double A[max_rozmiar];
int i, rozmiar;
rozmiar = czytaj_wektor(A, max_rozmiar);
  for(i = 0; i<rozmiar; i++) 
  printf("%12.6f\n",A[i]);
  return 0;
}

pojawia mi się taki o to błąd
screen.png

3

No kompilator mówi w czym problem dość jednoznacznie.
Skąd ci się wziął ten #include <io.h> Jakaś literówka? Nie kojarzę niczego podobnego.

1

Nie umie ci znaleźć pliku io.h :P Masz tą bibliotekę zainstalowaną?

UPDATE Spóźniłem się bo googlowałem :P

@MarekR22 Też się zdziwiłem ale gdzieśtam w internecie pojawia się coś takiego https://digitalmars.com/rtl/io.html czy https://stackoverflow.com/questions/2211030/failing-to-compile-a-project-missing-io-h-file

UPDATE 2 @piotrek1998 skąd wziąłeś to io.h? Na moje Javowo-Scalowe oko samo stdio.h powinno wystarczyć

0

To są wszystko pliki nauczyciela z informatyki. Każe nam przepisaywać a potem analizować.

4

Po prostu skasuj tą linijkę, bo nie widzę niczego, co używałoby symboli z tego co podlinkował @KamilAdam

Co do nauczycieli informatyki w szkołach, to już wiele razy wyjaśniałem, w czym problem.

0

Na unixach jest coś takego jak sys/io.h, ale to bardziej do użytku przez kernel niż użytkownika. Anyway, w kodzie nie używasz nic spoza stdio.h więc równie dobrze możesz ten io.h usunąć.

0

Kiedy to usunę dostaje taki błąd
sc.png

0

skopałeś kodowanie pliku.
Kompilator oczekuje utf-8 a ty zapisek plik w UTF-16.
Dlatego właśnie masz dodatkowe odstępy między literami.
Zapisz plik w UTF-8.

Ok za szybko napisałem, bo od pewno miejsca nie ma dodatkowych odstępów (przy złym kodowaniu wszystko by miło ten problem).
Coś ty zrobił z tym plikiem, że masz dodatkowe odstępy między literami?

3

Zastanawia mnie jeszcze jedno. Screenshoty są ewidentnie z Ubuntu, a ścieżka w podanym kodzie jest Windows-owa: "e:\\czytaj.mat"!

0
MarekR22 napisał(a):

Ok za szybko napisałem, bo od pewno miejsca nie ma dodatkowych odstępów (przy złym kodowaniu wszystko by miło ten problem).
Coś ty zrobił z tym plikiem, że masz dodatkowe odstępy między literami?

Co ciekawe w kodzie wklejonym na forum tego problemu nie ma :|

0

No nic pobawie się jeszcze tym kodem. Dzięki wszystkim za pomoc

1
piotrek1998 skomentował(a):

sam je zrobiłem. tak jest w oryginalnym pliku. usunąłem te odstępy to dostałem komunikat naruszenie ochronoy pamięci(zrzut pamięci)

Jakim cudem przyszło ci do głowy coś takiego? Jakieś uzasadnienie?

naruszanie ochrony pamięci jest z dwóch powodów:

  • złą obsługa błędów (feof zamiast sprawdzanie czy odczyt był poprawny)
  • zła kolejność odczytu zwiększenia i przez co ostatnia próba odczyt następuje poza tablicą.

Link wyżej jest w wersji poprawionej!

0

Takie przerwy między znakami pojawiają się jak zapiszesz plik w formacie Unicode. Pliki źródłowe zapisuje się zawsze w ASCII - sprawdź.

0

Taki mi się wyświetla komunikat do tego pliku kiedy usune te odstępy
screen.png

0

No to brawo. Teraz już nie masz błędu kompilacji tylko błąd uruchomienia. Pora nauczyć się debugować. Czy to prawilnie debugerem czy partyzalcko za pomocą printf("dupa %s", "dupa");

Update Jakbym miał strzelać to gdzies masz pewnie wyjście poza tablicę

0

To jest kod tego pliku

#include <stdio.h>
int czytaj_wektor(double *A, int maksymalny_rozmiar)
{
	int i;
	FILE *plik_dane;
	plik_dane=fopen("czytaj_mat", "rt");
	i=0;
	while(!feof(plik_dane) && i<maksymalny_rozmiar)
	{
		i++;
		fscanf(plik_dane, "%lf", &A[i]);
	}
	fclose(plik_dane);
	return i;
}
/*teraz program*/
#define max_rozmiar 100
int main()
{
	double A[max_rozmiar];
	int i, rozmiar;
	rozmiar=czytaj_wektor(A, max_rozmiar);
	for(i=0; i<rozmiar; i++)
	{
		printf("%12.6f\n", A[i]);
	}
	return 0;
}
0

Teraz jak dodałeś formatowanie to widać. Zamień:

        i++;
        fscanf(plik_dane, "%lf", &A[i]);

na:

        fscanf(plik_dane, "%lf", &A[i]);
        i++;
1

Przecież już ci dałem poprawiony kod, który nie ma tego błędu. https://4programmers.net/Forum/C_i_C++/357150-blad_podczas_kompilacji_w_programie_w_c?p=1811826#id1811826
Mało tego wyjaśniłem na czym polega błąd (to co opisał KamilAdam wyżej). https://4programmers.net/Forum/C_i_C++/357150-blad_podczas_kompilacji_w_programie_w_c?p=1811830#id1811830

0

Zmieniłem co trzeba

#include <stdio.h>
int czytaj_wektor(double *A, int maksymalny_rozmiar)
{
	int i;
	FILE *plik_dane;
	plik_dane=fopen("czytaj_mat", "rt");
	i=0;
	while(!feof(plik_dane) && i<maksymalny_rozmiar)
	{
		fscanf(plik_dane, "%lf", &A[i]);
		i++;
	}
	fclose(plik_dane);
	return i;
}
/*teraz program*/
#define max_rozmiar 100
int main()
{
	double A[max_rozmiar];
	int i, rozmiar;
	rozmiar=czytaj_wektor(A, max_rozmiar);
	for(i=0; i<rozmiar; i++)
	{
		printf("%12.6f\n", A[i]);
	}
	return 0;
}

i błąd nadal występuje
screen.png

1

twój ostatni program najprawdopodobniej wywala bo nie może znaleźć pliku czytaj_mat z liczbami zmiennoprzecinkowymi. Jak stworzyłem plik z kilkoma linijkami liczb zmiennoprzecinkowych to program ruszył i wyświetlił liczby z pliku plus 1 ekstra śmieć, który wynika z niepoprawnego użycia i++, więc musisz to naprawić.

Do debugowania kompiluj program z opcją -g. W dystrybucji Debian możesz zatrzymać demon apport.service, który uniemożliwia zrzucaniu coredump w katalogu z programem, tylko zrzuca je do plików *.crash w /var/crash/:

$ sudo systemctl stop apport.service
$ ulimit -c unlimited

następnie uruchamiasz program, on zrzuca pamięć do pliku core a ty wtedy uruchamiasz:

gdb ./plik2 core

a w nim polecenie bt albo bt -ful. Oto wynik przy braku pliku z danymi:

(gdb) bt -ful
#0  _IO_feof (fp=0x0) at feof.c:35
        result = <optimized out>
        __self = <optimized out>
...
#1  0x000056432e38a258 in czytaj_wektor (A=0x7ffc9dec1a30, maksymalny_rozmiar=100) at plik2.c:8
        i = 0
        plik_dane = 0x0
#2  0x000056432e38a2a7 in main () at plik2.c:22
        A = {0, 0, 6.9526379120288772e-310, 0, 0, 0, 6.94639310699066e-310, 6.9463931164644676e-310,
          6.9526379120288772e-310, 6.9463931068902659e-310, 6.9463931070177348e-310, 6.9463931069503443e-310,
...          6.9463931022330055e-310, 4.6860416181857899e-310, 0, 4.6860416181597033e-310}
        i = 805272240
        rozmiar = 32735

zauważ, że funkcji feof został podany NULL, bo nie sprawdziłeś czy fopen się powiódł i do zmiennej plik_dane został przypisany NULL

1

Sprawdzaj czy plik się otworzył, to raz. Dwa, tutaj to może nie będzie mieć specjalnego znaczenia, ale stosowanie !feof(f) jako warunku while’a to ogólnie rzecz biorąc zła praktyka, więcej informacji tu: https://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong

3

Opis problemu dostał wczoraj i przedwczoraj, ba dostał nawet działającego gotowca.
Jest nawet przypomnienie, że przegapił te odpowiedzi.
Nic tylko czekać na kolejną iterację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1