mimotego Temat założony przez niniejszego użytkownika |
[C] Wskaźniki jako argumenty funkcji » 2016-01-01 16:29:27 Witam, mam za zadanie napisać funkcję, która otrzyma w argumentach wskaźnik na początek tablicy typu int, wskaźnik n na wartość określającą jej długość oraz liczbę całkowitą a. Funkcja powinna manualnie zaalokować i zwrócić tablicę zawierającą wszystkie elementy tablicy wejściowej mniejsze od a, oraz zastąpić wartość n długością nowo utworzonej tablicy. Napisałem tę funkcję, jednak mój program nie chce się uruchomić, dlatego liczę na małą pomoc. int funkcja( int * tab, int * n, int a ) { int i, index = 0; for( i = 0; i < n; i++ ) { if( tab[ i ] == a ) index = i; } int nowy_rozmiar = index + 1; int tmp[ nowy_rozmiar ]; for( i = 0; i < nowy_rozmiar; i++ ) { tmp[ i ] = tab[ i ]; } * tab = & tmp[ 0 ]; * n = & nowy_rozmiar; return * tab; }
|
|
carlosmay |
» 2016-01-02 01:26:49 Niepoprawna deklaracja statycznej tablicy ( nowy_rozmiar nie ma wartości const ). W tej sytuacji należałoby skorzystać z dynamicznie przydzielanej pamięci na tablicę. |
|
mimotego Temat założony przez niniejszego użytkownika |
» 2016-01-02 12:13:22 Początkowo też myślałem and dynamicznym zaalokowaniu pamięci na tablicę, jednak postanowiłem trzymać się treści polecenia: "Funkcja powinna manualnie zaalokować...". Jednakże po Twojej sugestii postanowiłem nieco zmodyfikować moją funkcję, ale w dalszym ciągu program nie chce się uruchomić. Oto co zrobiłem: void fun( int * tab, int * n, int a ) { int index, i; for( i = 0; i < n; i++ ) { if( tab[ i ] == a ) index = i; } int * tmp; tmp = malloc( index + 1 * sizeof( int ) ); int nowy_rozmiar = index + 1; for( i = 0; i <= index; i++ ) { tmp[ i ] = tab[ i ]; } * tab = & tmp[ 0 ]; * n = & nowy_rozmiar; free( tmp ); }
|
|
carlosmay |
» 2016-01-02 12:23:40 ale w dalszym ciągu program nie chce się uruchomić.
|
Daj więcej kodu: jak wywołujesz i z jakimi argumentami? jaki jest log kompilacji (błędy)? To wszystko jest przydatne. A tak: tmp = malloc( index + 1 * sizeof( int ) );
|
powinno być tak int * tmp =( int * ) malloc(( index + 1 ) * sizeof( int ) );
Nieprawidłowo obsługujesz wskaźniki do zwykłych zmiennych. |
|
mimotego Temat założony przez niniejszego użytkownika |
» 2016-01-02 16:03:52 Zmodyfikowałem program ponownie, w tym momencie uruchamia się już bez problemu, tylko nie działa tak jak należy. Coś jest nie tak z przypisaniem tablicy tmp do tablicy tab. Dla sprawdzenia zmieniłem wartość jednego z elementów tmp przed przepisaniem do tab, jednak w dalszym ciągu wyświetlane są wartości pierwotne od 1-7. #include <stdio.h> #include <stdlib.h>
void funkcja( int * tab, int * n, int a ) { int i, index; for( i = 0; i <* n; i++ ) { if( tab[ i ] == a ) index = i; } int * tmp =( int * ) malloc(( index + 1 ) * sizeof( int ) ); int nowy_rozmiar = index + 1; for( i = 0; i < index + 1; i++ ) { tmp[ i ] = tab[ i ]; } tmp[ 3 ] = 22; * tab = * tmp; * n = nowy_rozmiar; free( tmp ); }
int main() { int rozmiar = 10; int tablica[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; funkcja( tablica, & rozmiar, 7 ); printf( "Nowy rozmiar= %d\n", rozmiar ); int i; for( i = 0; i < rozmiar; i++ ) { printf( "%d\n", tablica[ i ] ); } return 0; }
|
|
carlosmay |
» 2016-01-02 17:46:49 Brakuje ładu w kodzie. Niepotrzebnie przepisujesz tablice w obie strony. W 'temp' zapisz mniejsze od 'a'. Zwolnij pamięć na tablicę źródłową. Zwróć w miejsce źródłowej do 'main' 'temp'. |
|
mimotego Temat założony przez niniejszego użytkownika |
» 2016-01-02 18:30:43 Czyli, że powinienem napisać funkcję typu 'int"? Coś takiego? int * fun( argumenty ) { return tmp; }
|
|
Elaine |
» 2016-01-03 16:28:06 Niepoprawna deklaracja statycznej tablicy ( nowy_rozmiar nie ma wartości const ). |
C to nie C++, w C takie coś jest jak najbardziej poprawne. |
|
« 1 » |