Tablica dynamicznie alokowana w funkcji

0

Cześć stworzyłem dynamiczną tablice w funkcji "Wczytaj" chciałbym ,aby tablica
z wartościami podanymi w funkcji mogła być wykorzystana w programie głównym
jednak nie mam pojęcia jak to właściwie zrobić. Pewnie powinienem stworzyć
jakiś wskaznik w "mainie" i przkezać do funkcji, nie wiem jednak jak.
Będe wdzięczny za pomoc bo z wujkiem google nie mogę sie w tej kwestii dogadać

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


void wczytaj(int *tab){
int r,i;
//int *tab;
printf("Wpisz ilosc kolczykow\n");
scanf("%d",&r);
tab=(int*)malloc(r * sizeof(*tab));
for (i=0;i<r;++i){
    printf("\nWpisz cene %d kolczyka : ",i);
    scanf("%d",&tab[i]);
    puts;
}}

int main()
{int *tab;
int r,i;
wczytaj(tab);

for (i=0;i<3;++i){
    printf("Nr kolczyka %d cena= %d\n",i,tab[i]);

}
    return 0;
}
2

Najłatwiej będzie Ci zwrócić tę tablicę jako wynik funkcji.

0

aha czyli coś takiego

#include <stdio.h>
#include <stdlib.h>
 
 
int *wczytaj(){
int r,i;
//int *tab;
printf("Wpisz ilosc kolczykow\n");
scanf("%d",&r);
tab=(int*)malloc(r * sizeof(*tab));
for (i=0;i<r;++i){
    printf("\nWpisz cene %d kolczyka : ",i);
    scanf("%d",&tab[i]);}
return tab;
    
}
 
int main()
{int *tab;
int r,i;
wczytaj();
 
for (i=0;i<3;++i){
    printf("Nr kolczyka %d cena= %d\n",i,tab[i]);
 
}
    return 0;
} 
0

Nie wiem jednak za bardzo jak wykorzystać wskaźnik do tablicy w funkcji

0

Najlepiej jednak jeśli funkcja nie zwracałaby tego adresu a zamiast tego użyć dobrze wskaźników i uzyskać ten sam efekt

1

1 błąd jest taki (chociaż w tym przykładzie tego nie zauważysz)

tab=(int*)malloc(r * sizeof(*tab));

Chcesz zaalokować pamięć na r zmiennych typu int, a alokujesz tyle pamięci, co "r pomnozyc przez rozmiar wskaznika". Powinieneś mnożyć przez typ jaki alokujesz. W tym przypadku wskaźnik zajmuje 4 bity i int zajmuje 4 bity dlatego nic się nie sypie farciarzu.

PUNKT 1 jest błędny, dobrze napisałeś

2 błąd to samo przekazanie wskaźnika do funkcji. Zobacz:

  • Tworzysz wskaźnik który wskazuje na losowe miejsce w pamięci.
int main()
{
    int *tab; 
  • przekazujesz adres pamięci do nowego wskaźnika umieszczonego wewnątrz funkcji
wczytaj(tab);
  • Alokujesz pamięć.
tab=(int*)malloc(r * sizeof(int)); 

Gdy pamięć zostanie zaalokowana wskaźnik dopiero otrzymuje adres początku zaalokowanego obszaru. Czyli w tym momencie wskaźniki z main() i z wczytaj() wskazują na zupełnie co innego.

  1. jak to poprawnie zrobić?
    stwórz funkcje bardzo podobną zamiast tamtej tyle, że będziesz zwracał wskaźnik na zaalokowany obszar.
 
int *wczytaj()
{
    int r,i, *tab;
    printf("Wpisz ilosc kolczykow\n");
    scanf("%d",&r);
    tab=(int*)malloc(r * sizeof(int));
    for (i=0;i<r;++i){
        printf("\nWpisz cene %d kolczyka : ",i);
        scanf("%d",&tab[i]);
        puts;
    }
    return tab;
}

teraz jak to zjeść? Ano:

int main()
{
    int *tab = wczytaj();

Funkcja wczytaj() zwróciła Ci adres pamięci Twoich int-ów. Rób sobie z nimi co chcesz.

  1. Kolejny błąd: Alokujesz pamięć a jej nie zwalniasz.
3

Problem z pierwszym kodem jest taki, że przekazujesz do funkcji wczytaj() ** kopie ** wskaźnika i do tej kopii przypisujesz coś tam.
tab=(int*)malloc(r * sizeof(*tab));
Dlatego w wczytaj() wszystko działa. W mainie nic nie jest ruszone, a poza tym gubisz pamięć zadeklarowaną w wczytaj(). Masz zatem dwa rozwiązania:

  1. robisz całość inaczej - najlepiej tak jak wspomniał @spartanPAGE
  2. przekazujesz wskaźnik na wskaźnik do wczytaj
0

Wielkie dzięki za pomoc. Teraz rozumiem jak to trzeba zrobić dobrze wytłumaczyłeś.
Co punktu pierwszego że przydzielam pamięć dla wskaźnika użyłem sposobu z wikipedi https://pl.wikibooks.org/wiki/C/Wska%C5%BAniki#Dynamiczna_alokacja_pami.C4.99ci
I nie jestem pewien ale chyba jest to sposób poprawny,bo tworzyłem tak pamiec dla struktur i było ok
Na laborkach na studiach robilismy to takim sposobem. Choc może w tym wypadku się myle.

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


int* wczytaj(int r){
int i;
int *tab;
//int *tab;


tab=(int*)malloc(r * sizeof(*tab));
for (i=0;i<r;++i){
    printf("\nWpisz cene %d kolczyka : ",1+i);
    scanf("%d",&tab[i]);}
return tab;
}


int** oblicz(int *tab,int r){
int i,j;

 int **suma=(int**)malloc(r*sizeof(*suma));
 for (i=0;i<r;i++)
    suma[i]=(int*)malloc(r*sizeof(**suma));
 for(i=0;i<r;++i){
   for(j=0;j<r;++j){
        suma[j][i]=tab[i]+tab[j];}}
   return suma;}
void cena (int **suma){
int i,j;
printf("Ktore kolczyki chcesz kupic??\n");
scanf("%d  %d",&i,&j);
printf("Cena tej pary::%d",suma[i-1][j-1]);
}




int main()
{int *tab,*tab2;
int **suma;
int r,i,j;
printf("Wpisz ilosc kolczykow\n");
scanf("%d",&r);
tab=wczytaj(r);
suma=oblicz(tab,r);
printf("_______________\n");
for (i=0;i<r;++i){
    printf("Nr kolczyka %d cena= %d\n",i+1,tab[i]);

}
printf("---------------------------\n");
 for(i=0;i<r;++i){
   for(j=0;j<r;++j){
        printf("Cena kolczykow %d i %d wynosi %d\n",i+1,j+1,suma[i][j]);}}
        cena(suma);
    return 0;
}


 
0
#include <stdio.h>
#include <stdlib.h>
//#define MAX 20
 typedef struct ciag{
 int dlug;
 int tab[6];
 struct ciag *next;
  }ciag;
   ciag* add(ciag *head){
       int i;
   ciag *wsk,*nowy;
   wsk=head;
   nowy=(ciag*)malloc(sizeof(ciag));
  scanf("%d",(&nowy->dlug));
  for (i=0;i<nowy->dlug;++i)
        scanf("%d",(&nowy->tab[i]));
 if (wsk==NULL){
        //printf("rdtfyguhijok");
    nowy->next=NULL;
 }
 else{
    
  nowy->next=wsk;
  }
  return nowy;
   }
   void srednia(ciag *head,int *max,int *min){
   ciag *wsk;
   int n,i,m,sred,suma;

   wsk=head;

   while(wsk!=NULL){
 suma=0;
    for(i=0;i<(wsk->dlug);++i){

     suma=suma+(wsk->tab[i]);
        }
        sred=suma/(wsk->dlug);
 printf("suma%d: dlug=%d::::%d\n",suma,wsk->dlug,sred);
        if (wsk==head){

            *min=sred;
            *max=sred;}
            if (sred<*min){
           // printf("bajzelllll%d",sred);
                *min=sred;}
            if(sred>*max){
                *max=sred;}

                        wsk=wsk->next;

        }
        printf("------------ min===%d  -max=%d      %d\n  ",*min,*max,sred);
        }
void wyswietl(ciag *head){
ciag *wsk;
wsk=head;
while(wsk!=NULL){

    printf(" lista %d\n",wsk->dlug);
    wsk=wsk->next;
}
}


int main()
{ ciag* head;
int i,j,n,max,min;
head=NULL;
scanf("%d",&n);
for(i=0;i<n;++i){


head=add(head);}


srednia(head,&max,&min);
printf("max=%d    min=%d",max,min);

wyswietl(head);
    return 0;
}
 
0
#include <stdio.h>
#include <stdlib.h>
//#define MAX 20
typedef struct ciag {
    int dlug;
    int tab[6];
    struct ciag* next;
} ciag;

ciag* add(ciag* head)
{
    int i;
    ciag *wsk, *nowy;
    wsk = head;
    nowy = (ciag*)malloc(sizeof(ciag));
    scanf("%d", (&nowy->dlug));
    for (i = 0; i < nowy->dlug; ++i)
        scanf("%d", (&nowy->tab[i]));
    if (wsk == NULL) {
        //printf("rdtfyguhijok");
        nowy->next = NULL;
    }
    else {
        //printf("eeeeeeeeeeeeeeeeeeeeeeee");
        nowy->next = wsk;
    }
    return nowy;
}

void srednia(ciag* head, int* max, int* min)
{
    ciag* wsk;
    int n, i, m, sred, suma;

    wsk = head;
    //printf("aaaaaaaaaaaaaaaaa");
    while (wsk != NULL) {
        suma = 0;
        for (i = 0; i < (wsk->dlug); ++i)
            suma = suma + (wsk->tab[i]);
        sred = suma / (wsk->dlug);
        printf("suma%d: slug=%d::::%d\n", suma, wsk->dlug, sred);
        if (wsk == head) {
            *min = sred;
            *max = sred;
        }
        if (sred < *min) {
            // printf("bajzelllll%d",sred);
            *min = sred;
        }
        if (sred > *max) {
            *max = sred;
        }
        wsk = wsk->next;
    }
    printf("------------ min===%d  -max=%d      %d\n  ", *min, *max, sred);
}

void wyswietl(ciag* head)
{
    ciag* wsk;
    wsk = head;
    while (wsk != NULL) {
        printf(" lista %d\n", wsk->dlug);
        wsk = wsk->next;
    }
}

int main()
{
    ciag* head;
    int i, j, n, max, min;
    head = NULL;
    scanf("%d", &n);
    for (i = 0; i < n; ++i)
        head = add(head);
    printf("fcgvjhb");
    //for(i=0;i<3;++i){
    printf(" dedededed%d\n", head->dlug);
    srednia(head, &max, &min);
    printf("min=%d    odwrotniemax=%d", max, min);

    wyswietl(head);
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1