sajgon_zelazko Temat założony przez niniejszego użytkownika |
Funkcja free zwalnia losowe bloki pamięci w funkcji_U? Program albo zmienia dwie wartości na losowe albo zawiesza się. » 2016-11-25 00:57:02 Napisałem program, przeszedł 60% testów. Nie byłem zadowolony, więc napisałem go od nowa i od 6 godzin nie mogę go uruchomić. Pomóżcie #include<cstdio> #include<cstdlib> #include<cstring>
inline long get( long & wiersz, long & pozycja, long ** & tab ) { return *( *( tab + wiersz ) + pozycja ); }
inline long get( long & wiersz, long * & x ) { return *( x + wiersz ); }
void print( long ** & tab, long * & x, long & IloscWierszy ) { for( long i = 0; i <= IloscWierszy - 1; i++ ) { for( long j = 0; j <= get( i, x ) - 1; j++ ) { printf( "%ld ", get( i, j, tab ) ); } printf( "\n" ); } }
void free( long ** & tab, long * & x, long & IloscWierszy ) { for( long i = 0; i <= IloscWierszy - 1; i++ ) { free( *( tab + i ) ); } free( tab ); free( x ); }
void funkcja_U( long ** & tab, long * & x, long & IloscWierszy, long & n ) { for( long i = n; i <= IloscWierszy - 2; i++ ) *( tab + i ) = *( tab + i + 1 ); for( long i = n; i <= IloscWierszy - 2; i++ ) *( x + i ) = *( x + i + 1 ); IloscWierszy--; free( *( tab + IloscWierszy ) ) tab =( long ** ) realloc( tab, sizeof( long * ) * IloscWierszy ); }
void funkcja_Z( long ** & tab, long * & x, long & IloscWierszy, long & n, long & m ) { long * tmp = *( tab + n ); *( tab + n ) = *( tab + m ); *( tab + m ) = tmp; long tmp2 = *( x + n ); *( x + n ) = *( x + m ); *( x + m ) = tmp2; }
void funkcja_P( long ** & tab, long * & x, long & IloscWierszy, long & n ) { *( tab + n ) =( long * ) realloc( tab, sizeof( long ) * get( n, x ) * 2 ); long tmp = get( n, x ); for( long i = 0; i <= tmp; i++ ) { *( *( tab + n ) + i + tmp ) = get( n, i, tab ); } }
void funkcja_C( long ** & tab, long * & x, long & IloscWierszy, long & n ) { }
int main() { long IloscWierszy = 5, n, m; long ** tab =( long ** ) malloc( sizeof( long * ) * IloscWierszy ); long * x =( long * ) malloc( sizeof( long ) * IloscWierszy ); for( long i = 0; i <= IloscWierszy - 1; i++ ) { *( x + i ) = 5; *( tab + i ) =( long * ) malloc( sizeof( long ) *( *( x + i ) ) ); for( long j = 0; j <= *( x + i ) - 1; j++ ) { *( *( tab + i ) + j ) = i + j; scanf( "%ld",( *( tab + i ) + j ) ); } } char wybor; do { wybor = getchar(); switch( wybor ) { case 'W': { print( tab, x, IloscWierszy ); break; } case 'U': { scanf( "%ld", & n ); funkcja_U( tab, x, IloscWierszy, n ); } case 'Z': { scanf( "%ld", & n ); scanf( "%ld", & m ); funkcja_Z( tab, x, IloscWierszy, n, m ); } case 'P': { scanf( "%ld", & n ); funkcja_P( tab, x, IloscWierszy, n ); } case 'C': { scanf( "%ld", & n ); funkcja_C( tab, x, IloscWierszy, n ); } } } while( wybor != 'K' ); free( tab, x, IloscWierszy ); return 0; }
|
|
mateczek |
» 2016-11-25 09:00:46 A co to za zadanie ?? (jakiś link by się przydał) co to w ogóle ma robić ?? pokłóciłeś się z notacją tablicową?? *( *( tab + i ) + j ) = i + j; tab[ i ][ j ] = i + j;
|
|
darko202 |
» 2016-11-25 10:12:31 1. jak to sobie wyobrażasz, jeśli nie napisałeś czego ma ten program dotyczyć a zawarty kod nie ma ani jednej linijki komentarza.
jakiś program z jakimś zbiorem funkcji :(
2. nie powiem, że jestem pewny, ale zastanawiają mnie takie dziwne konstrukcje jak funkcja inline long get( long & wiersz, long * & x ) { return *( x + wiersz ); //sprawdź co faktycznie jest zwracane --- ale co to jest *( x + wiersz ); wyłuskanie z adresu ( x + wiersz ) co da w efekcie jakąś przypadkowa wartość i pewnie funkcja zwraca wartość rzutowaną na oczekiwany typu long
nie wiem, ale przypuszczam, że chyba nie oto Ci w tej funkcji chodziło. --- podobnie long * & x
sprawdź, co tu jest a co chciałeś osiągnąć ?
3. Czy znasz debugowanie programu ? ustaw breakpoint 'y i spróbuj zobaczyć co on faktycznie robi
|
|
sajgon_zelazko Temat założony przez niniejszego użytkownika |
» 2016-11-25 10:50:01 Używanie nawiasów kwadratowych jest zabronione, jest to jedna z wytycznych. Tworzę tablice wskaźników o długości ilośćwierszy. Następnie do każdego z tych wskaźników alokuje pamięć na podana ilość liczb long, tworząc tablice. Wiem, że można prościej, ale założenia zadania wymagają takiej formy tablicy. Funkcja print wyświetla tablice, funkcja u usuwa wiersz. Funkcja p podwaja długość wiersza. Problemem jest jakieś złożenie wskaźników i typu long, takie jest moje podejrzenie. Dodatkowo na pewno xle używam funkcji free, bo poprzednio też miałem z nią problemy. Wyłuskanie adresu (x + wiersz) zwraca wartość long z tablicy x o indeksid wiersz na mocy arytmetyki wskaźników. Tablica x przechowuje ilość elementów w poszczególnych wierszach tabeli tab. Ta funkcja działa prawidłowo. |
|
« 1 » |