C przekazanie malloc z funkcji, alokacja pamięci?

Mam takie zadanko:

Kosz.

Witaj, popraw proszę tytuł tematu tak aby wstępnie informował o problemie, użyj przycisku EDYTUJ , który znajdziesz w prawym dolnym rogu Swojego posta-> następnie skorzystaj z opcji Użyj pełnego edytora. Dziękuję za uwagę.

Tip: Unikaj słów: “problem”, “help”, “pomocy” i.t.p. Tego typu słowa nie spowodują szybszej reakcji a mogą odnieść odwrotny skutek od oczekiwanego, tytuł tematu ma być skróconym opisem Twojego posta- powodzenia.

 

Po  wyjaśnieniach na PW, temat przywrócony z kosza.

Przekazujesz tab przez referencję albo zwracasz wskaźnik (masz mieć 2 rozwiązania)

Co do b masz użyć tej funkcji jako parametru wywołania, dalej masz dobrze opisane.

że a) będzie tak

#include <stdio.h>
#include <stdlib.h>

int F(int *tab,int n){
    int i;
    for(i=0;i<n;++i){
        tab[i]=tab[i]*tab[i]*tab[i];
    }
}
int G(int a,int b, int k,int *n,int *tab){
    int i;
    *n=((b-a)/k)+1;
    tab = (float*) malloc(*n * sizeof *tab);
    for(i=0;i<*n;++i){
        tab[i]=a;
        a=a+k;
    }
    F(tab,*n);
    return &tab[0];
}
int main()
{
    int a,b,k,i,n=0;
    printf("Podaj wartosc poczatkowa\n");
    scanf("%d",&a);
    printf("Podaj wartosc koncowa\n");
    scanf("%d",&b);
    printf("Podaj wartosc kroku\n");
    scanf("%d",&k);
    int *tab;
    tab=G(a,b,k,&n,tab);
    for(i=0;i<n;++i){
        printf("%d\n",tab[i]);
    }
    return 0;
}

mógłbyś jakoś jaśniej (a i  w C z tego co się doczytałem nie ma referencji dopiero w  C++)

a b dalej nie wiem jak;/

Tak. Ten człowiek często gada od rzeczy, więc możesz go przestać słuchać. Masz zwrócić tablicę przez wskaźnik, co już masz oraz przez wartość. W tym drugim przypadku nagłówek powinien wyglądać następująco

int* fun(...)

PS

Wskaźnik wymieniłem, ty lepiej powiedz jak inaczej chcesz zwrócić tablicę przez parametr (pierwszy myślnik)

Co do kodu, nie przejdzie ci w c, nawet jak dodasz returna w pierwszej funkcji ze względu na przymus deklaracji zmiennych na początku.

A kto mówił, że przez wskaźnik napisałeś źle? Mówimy o referencji z twojego postu, co jest głupotą. To jest C, tu nie ma referencji, zwracać możesz coś przez wskaźnik, bądź wartość.

bo jak dam float w deklaracji to mi nie działa ;/  wynik na końcu 0 mi wyświetla cały czas

poczytaj o wzorcach w printf/scanf

tak zmieniam wyświetlanie na %f

dalej z float  nie działa już kompletnie nie wiem jak, idę na wódkę… jak byś mógł to prosił bym o działający przykład:) a z b) hm chyba pójdę na konsultacje jak dorwę prowadzącego przed kolosem :slight_smile:

Z postu #4 to nie wynika (wszędzie %d), poza tym coś takiego jest bez sensu malloc-ujesz obszar pamięci rzutowany na float, pod wskaźnik int-owy.

#include <stdio.h>
#include <stdlib.h>

int F(int a){
        a=a*a*a;
}
int G(int a,int b, int k,int *n){
    int i;
    *n=((b-a)/k)+1;
    int *tab;
    tab = (float*) malloc(*n * sizeof *tab);
    for(i=0;i<*n;++i){
        tab[i]=F(a);
        a=a+k;
    }
    return &tab[0];
}
int main()
{
    int a,b,k,i,n=0;
    printf("Podaj wartosc poczatkowa\n");
    scanf("%d",&a);
    printf("Podaj wartosc koncowa\n");
    scanf("%d",&b);
    printf("Podaj wartosc kroku\n");
    scanf("%d",&k);
    int *tab;
    tab=G(a,b,k,&n);
    for(i=0;i<n;++i){
        printf("%d\n",tab[i]);
    }
    return 0;
}

Teraz F chyba powinna być dobrze co do  (//myślnik pierwszy b jest całkowicie zbędne) jak chcesz wtedy określić zakres tablicy ?

Moja diagnoza? Najpierw poćwicz czytanie ze zrozumieniem, dopiero potem bierz się za programowanie. W przypadku pierwszego myślnika

 

#include <stdio.h>
#include <stdlib.h>

int F(int a){
        a=a*a*a;
        return a;
}
int FF(int a){
    a=sqrt(abs(a));
    return a;
}
void G(int a,int b, int k,int n,float *tab){
    int i;
    //*n=((b-a)/k)+1;
    //float *tab;
    //tab = (float*) malloc(*n * sizeof *tab);
    for(i=0;i<n;++i){
        tab[i]=F(a);
        a=a+k;
    }
}
int *GG(int a,int b, int k,int n,int FUN(int)){
    int i;
    //*n=((b-a)/k)+1;
    float *tab;
    tab = (float*) malloc(n * sizeof *tab);
    for(i=0;i<n;++i){
        tab[i]=FUN(a);
        a=a+k;
    }
    return tab;
}
int main()
{
    int a,b,k,i,n=0;
    printf("Podaj wartosc poczatkowa\n");
    scanf("%d",&a);
    printf("Podaj wartosc koncowa\n");
    scanf("%d",&b);
    printf("Podaj wartosc kroku\n");
    scanf("%d",&k);
    n=((b-a)/k)+1;
    float *tab;
    //tab = (float*) malloc(n * sizeof *tab);
    tab=GG(a,b,k,n,FF);
    for(i=0;i<n;++i){
        printf("%0.1f\n",tab[i]);
    }
    return 0;
}