• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C przekazanie tablicy dynamicznej do funkcji

Object Storage Arubacloud
0 głosów
2,388 wizyt
pytanie zadane 27 maja 2016 w C i C++ przez qvo Obywatel (1,670 p.)
int *tab1, *tab2, *tab3;

int IloscElementow1=0, IloscElementow2=0, IloscElementow3=0;


void push(int item, int *IloscElementow, int *tab)
{
    *IloscElementow+=1;
    tab=realloc(tab,*IloscElementow*(sizeof(int)));
    tab[*IloscElementow-1]=item-48;
}

int main(int argc, char *argv[])

{

push(5,IloscElementow1, tab1);

}

Nie wiem w jaki sposób przekazywać poszczególne tablice do funkcji, żeby to zadziałało. Chciałbym funkcję push wykorzystywać dla kilku tablic, wydawało mi się że tak będzie poprawnie, ale za każdym razem się krzaczy.

1 odpowiedź

+1 głos
odpowiedź 27 maja 2016 przez niezalogowany
wybrane 27 maja 2016 przez qvo
 
Najlepsza
Ten kod się nie kompiluje(pomijając brak include'ów). Skoro zmienne są globalne to poco je przekazywać jako argumenty funkcji? Poza tym drugim argumentem funkcji ma być pointer. Po naprawieniu tych błędów program się kompiluje i się nie krzaczy.
komentarz 27 maja 2016 przez qvo Obywatel (1,670 p.)
Program się nie kompiluje, ponieważ to jest tylko fragment, chciałem tylko nakreślić problem.

Zmienne chcę przekazywać jako argumenty funkcji, ponieważ funkcja ma być uniwersalna dla trzech tablic, w zależności którą z nich przekażę. Jeśli zrobię tak jak mówisz, czyli wykorzystam któreś ze zmiennych globalnych, to wszystko działa jak należy, jednak nie o to mi chodzi. Nie bardzo potrafię działać na wskaźnikach i referencjach
komentarz 27 maja 2016 przez niezalogowany
To pokaż cały kod.
komentarz 27 maja 2016 przez qvo Obywatel (1,670 p.)
///// Tutaj krzaczy się przy printf
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int *tab1, *tab2, *tab3;
int IloscElementow1=0, IloscElementow2=0, IloscElementow3=0;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void push(int item, int *IloscElementow, int *tab)
{
	*IloscElementow+=1;
	tab=realloc(tab,*IloscElementow*(sizeof(int)));
	tab[*IloscElementow-1]=item-48;
}

int main(int argc, char *argv[]) {
	printf("Podaj liczbe: ");
	char digit;
	scanf("%c", &digit);
    push(digit, &IloscElementow1, tab1);
	printf("%d ",tab1[0]);
	return 0;
}

////Ta wersja działa, ale jak już mówiłem, chciałbym żeby funkcja była uniwersalna
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int *tab1, *tab2, *tab3;
int IloscElementow1=0, IloscElementow2=0, IloscElementow3=0;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void push(int item)
{
	IloscElementow1+=1;
	tab1=realloc(tab1,IloscElementow1*(sizeof(int)));
	tab1[IloscElementow1-1]=item-48;
}

int main(int argc, char *argv[]) {
	printf("Podaj liczbe: ");
	char digit;
	scanf("%c", &digit);
    push(digit);
	printf("%d ",tab1[0]);
	return 0;
}

 

komentarz 27 maja 2016 przez niezalogowany

Działająca 1 wersja:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int *tab1, *tab2, *tab3;
int IloscElementow1=0, IloscElementow2=0, IloscElementow3=0;
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void push(int item, int *IloscElementow, int **tab)
{
    *IloscElementow+=1;
    *tab=realloc(*tab,*IloscElementow*(sizeof(int)));
    *tab[*IloscElementow-1]=item-48;
}
 
int main(int argc, char *argv[]) {
    printf("Podaj liczbe: ");
    char digit;
    scanf("%c", &digit);
    push(digit, &IloscElementow1, &tab1);
    printf("%d ",tab1[0]);
    return 0;
}
 

Przekazywałeś do funkcji wskaźnik, funkcja robiła kopię wskaźnika i na nim operowała. A oryginalny wskaźnik dalej miał wartość NULL. Czyli w chwili wywoływania printf był access violation

komentarz 27 maja 2016 przez qvo Obywatel (1,670 p.)
I niby wszystko działa, alee tym razem krzaczy się gdy użyję funkcji push drugi raz dla tej samej tablicy. Wywala się na ostatniej instrukcji w funkcji.
komentarz 28 maja 2016 przez niezalogowany
Rozwiązanie to zamienić to: *tab[*IloscElementow-1]=item-48; na: (*tab)[*IloscElementow-1]=item-48;

Podobne pytania

0 głosów
1 odpowiedź 1,114 wizyt
0 głosów
3 odpowiedzi 1,919 wizyt
pytanie zadane 9 marca 2016 w C i C++ przez sakro95 Nowicjusz (170 p.)
0 głosów
2 odpowiedzi 1,534 wizyt

92,657 zapytań

141,549 odpowiedzi

319,988 komentarzy

62,026 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...