Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Funkcja free zwalnia losowe bloki pamięci w funkcji_U? Program albo zmienia dwie wartości na losowe albo zawiesza się.

Ostatnio zmodyfikowano 2016-11-25 10:50
Autor Wiadomość
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


C/C++
//Leszek Milasz
#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;
    //scanf("%ld", &IloscWierszy);
    long ** tab =( long ** ) malloc( sizeof( long * ) * IloscWierszy );
    long * x =( long * ) malloc( sizeof( long ) * IloscWierszy );
    for( long i = 0; i <= IloscWierszy - 1; i++ ) {
        //scanf("%ld", (x+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;
}
P-154107
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ą??
C/C++
*( *( tab + i ) + j ) = i + j;
tab[ i ][ j ] = i + j; // nie lepiej ??
P-154110
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
P-154115
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.
P-154117
« 1 »
  Strona 1 z 1