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

[C] Wskaźniki jako argumenty funkcji

Ostatnio zmodyfikowano 2016-01-03 16:28
Autor Wiadomość
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.

C/C++
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;
}
P-142660
carlosmay
» 2016-01-02 01:26:49
C/C++
int tmp[ nowy_rozmiar ];
 
 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ę.
P-142676
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:
C/C++
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 );
}
P-142687
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:
C/C++
tmp = malloc( index + 1 * sizeof( int ) ); // ??? to jest nieprawidlowe
 
 powinno być tak
C/C++
int * tmp =( int * ) malloc(( index + 1 ) * sizeof( int ) );
Nieprawidłowo obsługujesz wskaźniki do zwykłych zmiennych.
P-142689
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.
C/C++
#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;
}
P-142703
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'.
P-142712
mimotego
Temat założony przez niniejszego użytkownika
» 2016-01-02 18:30:43
Czyli, że powinienem napisać funkcję typu 'int"? Coś takiego?
C/C++
int * fun( argumenty ) {
    //instrukcje
    return tmp;
}
P-142715
Elaine
» 2016-01-03 16:28:06
C/C++
int tmp[ nowy_rozmiar ];
 
 Niepoprawna deklaracja statycznej tablicy ( nowy_rozmiar nie ma wartości const ).
C to nie C++, w C takie coś jest jak najbardziej poprawne.
P-142774
« 1 »
  Strona 1 z 1