Simonsoft Temat założony przez niniejszego użytkownika |
SIGSEGV problem » 2019-08-23 11:27:37 Witam, mam problem bo wyskakuje mi SIGSEGV w testach, uzywalem QT Creator i nie mam pojecia co zrobic zeby w debugowaniu znajdowal mi te bledy. Problem pojawia sie w tutaj. Mógłaby jakas dobra dusza pomoc? int reverse_vector( int * tab, int size ) { if( tab == NULL || size <= 0 ) return 1; int temp; for( int i = 0; i < size / 2; i++ ) { temp = *( tab + size - i - 1 ); *( tab + size - i - 1 ) = *( tab + i ); *( tab + i ) = temp; } return 0; }
void display_vector( const int * tab, int size ) { for( int i = 0; i < size; i++ ) { printf( "%d ", *( tab + i ) ); <----------------tutaj pokazuje blad } }
main : int tab1[ 100 ], tab2[ 100 ]; int * vec = tab1, * vec2 = tab2;
printf( "Podaj liczby: " ); int size = read_vector( vec, 100, 0 );
int wynik = reverse_vector( vec, size );
display_vector( vec2, size ); printf( "\n" ); display_vector( vec, size );
Kolejny SIGSEGV w programie o Histogramie mam, tylko tutaj mi nie pokazuje w ktorej lini jest zle : #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "vector_utils.h"
int read_vector_float( float * vec, int size, float stop_value ) { if( vec == NULL || size <= 0 ) return - 1; int sizeD = 0; float temp; for( int i = 0; i < size; i++ ) { if( scanf( "%f", & temp ) != 1 ) { return - 1; } if( temp == 0 ) { return 0; } sizeD++; if( temp == stop_value ) { sizeD--; break; } *( vec + i ) = temp; } return sizeD; }
int create_histogram( const float * vec, int size, int * out, int out_size ) { if( vec == NULL || size <= 0 || out == NULL || out_size <= 0 ) return 1; for( int i = 0; i < 100; i++ ) { *( out + i ) = 0; } for( int j = 0; j < size; j++ ) { float a = 0, c = 0, b = 1; a = *( vec + j ); for( int i = 0; i < out_size; i++ ) { if( a >= c && a < b ) { *( out +( int ) c ) += 1; } c++; b++; } } return 0; }
void display_vector( const int * tab, int size ) { int i; for( i = 0; i < size; i++ ) { printf( "%d ", *( tab + i ) ); } }
main : #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include "vector_utils.h"
int main() { float tab1[ 100 ]; float * vec = tab1; int tab2[ 100 ]; int * out = tab2; int size = 0; printf( "Podaj liczby:\n" ); size = read_vector_float( vec, 100, - 1 ); int hist = create_histogram( vec, size, out, 11 ); display_vector( out, 11 ); }
|
|
DejaVu |
» 2019-08-23 11:30:53 Zapewne wychodzisz gdzieś poza zakres tablicy. Pod linuxem masz GDB, a pod Windowsem masz Visual Studio z debuggerem. |
|
Simonsoft Temat założony przez niniejszego użytkownika |
» 2019-08-23 11:37:01 No wlasnie wiem, ze pointer wskazuje na nic, albo wychodze poza zakres, ale denerwuje mnie to ze nie w QT Creatorze nie moge wykrywa mi tego, jest jakis Memcheck valgrinda ale nie wiem jak z tego korzystac bo po kliknieciu nic sie nie robi, screen z QT, czy jest opcja zeby w tym programie tez wygrywac SIGSEGVy? https://ibb.co/L9tDc7K |
|
DejaVu |
» 2019-08-23 11:39:53 Musisz w debuggerze doprowadzić najpierw do crasha, a potem otworzyć okienko z callstackiem i zobaczyć jaka funkcja została wywołana jako ostatnia i w której linijce naruszono ochronę pamięci. /edit: http://cpp0x.pl/kursy/Kurs-C++/Poziom-X/Debugowanie-na-przykladzie-Visual-Studio-2017/586Tutaj masz pierwszy screen dla Visual Studio - odpalasz debuggerem program i otrzymujesz miejsce błędu w kodzie. Na pierwszym screenie widzisz callstacka, czyli kolejność wywoływania metod. Jeżeli używasz QT Creatora to on zapewne używa debuggera GDB. |
|
Simonsoft Temat założony przez niniejszego użytkownika |
» 2019-08-23 11:41:16 Tylko ze u mnie program dziala i jest efekt koncowy taki jaki powinien byc, tylko w testach, gdzie uploaduje programy wyskakuje SIGSEGV |
|
DejaVu |
» 2019-08-23 11:45:19 No to prawdopodobnie masz za małą tablicę, bo Twoja tablica ma 100 elementów, a testy na serwerze zapewne mają dużo większy zestaw danych wejściowych.
Przeczytaj treść zadania jakie są górne ograniczenia danych. |
|
Simonsoft Temat założony przez niniejszego użytkownika |
» 2019-08-23 11:50:44 (maksymalnie 100, w przypadku mniejszej liczby danych wartość -1 będzie oznaczała koniec wprowadzania danych) |
|
DejaVu |
» 2019-08-23 12:36:15 A sprawdziłeś jak Twój algorytm zachowuje się dla skrajnych danych? np. zero elementów, max elementów, jeden element w histogramie, max elementów w histogramie. |
|
« 1 » 2 |