[Solved] Anjuta - segmentation fault

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
wojtos93
Sędziwy Jeż
Sędziwy Jeż
Posty: 74
Rejestracja: 21 maja 2008, 12:14
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

[Solved] Anjuta - segmentation fault

Post autor: wojtos93 »

Cześć,
na zajęciach z programowania pisaliśmy programik w C liczący ilość wierszy w pliku. Po przepisaniu go na moim komputerze do Anjuty, po pomyślnej kompilacji, przy próbie uruchomienia wywala błąd

Kod: Zaznacz cały

Program has been terminated receiving signal 11 (Segmentation fault)
. Próbowałem go skompilować

Kod: Zaznacz cały

gcc main.c -o main
i uruchomić w terminalu - tu już tego błędu nie ma i program działa poprawnie. Kod jest raczej poprawny:

Kod: Zaznacz cały

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

double *odczyt();
int main()
{
	odczyt ();
	return (0);
}

double *odczyt()
{
	char z;
	int i = 0;
	FILE *plik;
	plik = fopen("dane.txt", "r");

	while(!feof(plik))
	{
		z = fgetc(plik);
		if(z == '\n')
			i++;
	}
	printf("W pliku jest %d linii", i);
	return NULL;
}
Dlaczego Anjuta nie chce go uruchomić?
Ostatnio zmieniony 28 maja 2013, 16:05 przez wojtos93, łącznie zmieniany 1 raz.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Anjuta - segmentation fault

Post autor: ethanak »

to jest prawidłowy kod twoim zdaniem?
zacznijmy od tego że to kod, który się kompiluje. spróbuj za linijką z fopen wsadzić

Kod: Zaznacz cały

if (!plik) {printf("Ale jestem gupi\n");exit(1);}
i uruchom w anjucie...
wojtos93
Sędziwy Jeż
Sędziwy Jeż
Posty: 74
Rejestracja: 21 maja 2008, 12:14
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Re: Anjuta - segmentation fault

Post autor: wojtos93 »

Na komputerze z laboratorium taki właśnie program działał poprawnie. Tak, wyświetliło ambitny tekst "Ale jestem gupi" Twojego autorstwa i program się zakończył - czyli do tego miejsca działa poprawnie. Ale nie wiem czy starasz się pomóc czy po prostu śmiejesz się ze mnie.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: Anjuta - segmentation fault

Post autor: ethanak »

staram się pomóc. teraz pomyśl dlaczego taki tekst się wyświetlił i co zrobić, aby się nie wyświetlał.
wojtos93
Sędziwy Jeż
Sędziwy Jeż
Posty: 74
Rejestracja: 21 maja 2008, 12:14
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

[Solved] Re: Anjuta - segmentation fault

Post autor: wojtos93 »

Aj ale głupota... ethanak, kod jest prawidłowy, tylko dla pliku, który jest w odpowiednim folderze. A ja go zakopałem za głeboko. Mimo to, dziękuję, bo się pouczyłem przez Ciebie.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: ethanak »

A nie uważasz, że prawidłowy kod nie zdycha z sygnałem 11 tylko uczciwie sygnalizuje że czegoś nie ma?
wojtos93
Sędziwy Jeż
Sędziwy Jeż
Posty: 74
Rejestracja: 21 maja 2008, 12:14
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: wojtos93 »

Jeśli umieszczę plik, którego linijki liczę w odpowiednim miejscu, to program działa bez sygnału 11. Jeśli chciałbym zrobić to porządniej dodałbym linijkę, że jeśli nie ma pliku, to drukuje odpowiedni napis.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: ethanak »

Co nie zmienia faktu że program, który zdycha z 11 nie jest prawidłowy.
BTW masz inny błąd - program źle liczy linie, czyli kod który się skomplikował i się pięknie wykonuje wcale nie musi być od razu prawidłowy ;)
wojtos93
Sędziwy Jeż
Sędziwy Jeż
Posty: 74
Rejestracja: 21 maja 2008, 12:14
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Xfce
Architektura: x86_64
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: wojtos93 »

Żeby coś poprawić (ten błąd o którym ty mówisz) musiałbym chyba więcej umieć. Dzięki za zainteresowanie i pomoc :)
Awatar użytkownika
mucha090
Zakręcona Traszka
Zakręcona Traszka
Posty: 775
Rejestracja: 15 mar 2008, 11:05
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Brak
Architektura: x86_64
Lokalizacja: Kielce, Poland
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: mucha090 »

@wojtos
weź sobie zamień tego double* na void bo i tak nie wyrzucasz żadnej wartości
zmień też char z na int z bo i tak otrzymujesz tym fgetc wartość w int, jeśli nie to zastosuj konwersje z int na char (ale taką poprawną)
jak już zdecydujesz się zamienić double* na void to możesz też zmienić return null; na return; (ot tak żeby nie mieć warrnów)
no a tak to chyba git;)
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: ethanak »

Ale linie źle liczy ;)
Awatar użytkownika
mucha090
Zakręcona Traszka
Zakręcona Traszka
Posty: 775
Rejestracja: 15 mar 2008, 11:05
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Brak
Architektura: x86_64
Lokalizacja: Kielce, Poland
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: mucha090 »

@ethanak a czy teraz jest dobrze?:P

Kod: Zaznacz cały

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

void odczyt(const char * dane);
int main(int argc, char ** argv)
{
   odczyt(argv[1]);
   return 0;
}

void odczyt(const char * dane)
{

   int i = 0;
   int a = 0;
   FILE *plik;
   plik = fopen(dane, "r");
if (!plik)
{
  printf("Error! Could not open %s \nMaybe file don`t exist\n", dane);
  return ;
}
  else
  {
   while(true)
   {
      a = fgetc(plik);
      if ((a == '\n') || (a == '\0') || (a == '\r') || (a == '\004'))
         i++;
      if (feof(plik)) {i++; break;}
   }
   fclose(plik);
  }
   printf("W pliku jest %d linii\n", i);
   return ;
} 
bo kurcze ciekaw jestem:P

Edit:
wywaliłem śmieci z kodu
Ostatnio zmieniony 01 cze 2013, 16:22 przez mucha090, łącznie zmieniany 1 raz.
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: ethanak »

przede wszystkim co znaczy:

Kod: Zaznacz cały

a == '\r\n'
ostatni kompilator który to dopuszczał to był SAS/C na Amigę.
BTW po chusteczkę Ci potrzebna tablica line[]?

Poza tym nie chodzi o rozpoznawanie końca linii - przy liczeniu wierszy masz rozpoznać początek a nie koniec - niestety, nawet najlepszy kod nie poprawi błędu algorytmu.
Awatar użytkownika
mucha090
Zakręcona Traszka
Zakręcona Traszka
Posty: 775
Rejestracja: 15 mar 2008, 11:05
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Brak
Architektura: x86_64
Lokalizacja: Kielce, Poland
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: mucha090 »

masz racje

Kod: Zaznacz cały

   const int LENGTH_LINE = 100;
   char line[LENGTH_LINE];
   a == '\r\n'
w/w nie jest potrzebne tylko że ja to zapomniałem wywalić
hmmm.... co do tego liczenia to się pomyśli, może uda mi się znaleźć poprawne rozwiązanie
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: ethanak »

Taka wędka:
plik zawierający wyłącznie ciąg znaków 'mucha090' ma dokładnie jedną linię (a nie zero) :)

Ale:

Plik zawierający wyłącznie ciąg znaków 'mucha090\n' ma również dokładnie jedną linię...
Awatar użytkownika
mucha090
Zakręcona Traszka
Zakręcona Traszka
Posty: 775
Rejestracja: 15 mar 2008, 11:05
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: Brak
Architektura: x86_64
Lokalizacja: Kielce, Poland
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: mucha090 »

no tak, ma
ale to że samemu sobie dodasz \n to nie oznacza że program to zauważy jako nową linie
bo zobaczy to jako \\n więc się nie będzie liczyło, zauważ że w txtburnie dodałem to aby konwertował \n na \\n z pliku językowego bo inaczej nie chciał tego uznać za znak nowej linii
Awatar użytkownika
ethanak
Wygnańcy
Posty: 3054
Rejestracja: 04 gru 2007, 13:19
Płeć: Mężczyzna
Wersja Ubuntu: 12.04
Środowisko graficzne: GNOME
Architektura: x86
Lokalizacja: Bielsko-Biała
Kontakt:

Re: [Solved] Anjuta - segmentation fault

Post autor: ethanak »

Nie o to chodzi - nie łapiesz tematu? \n to dla mnie znak o kodzie 10 (dziesiętnie) a nie 'backslash n'.
Ogólnie chodzi o to, że ostatnia linia w pliku wcale nie musi kończyć się znakiem nowej linii.
Ogólnie zakładając że program czyta ze stdin:

Kod: Zaznacz cały

echo 'abcd' | program
oraz

Kod: Zaznacz cały

echo -n 'abcd' | program
muszą dać ten sam wynik.
Aha, i nie sugeruj się poleceniem "wc -l" (różne wyniki w powyższych poleceniach) - Wielka Xięga Proroka Manuala mówi wyraźnie:

Kod: Zaznacz cały

-l, --lines
        print the newline counts
(czyli podaje tak jak powyższy program ilość wystąpień znaku '\n', a nie ilość linii w pliku.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości