C - Problem oko pokazivaca

LowLevel32

Početnik
Poruka
8
Poštovani,

Molim Vas da mi pomognete jer stvarno ne znam sta da radim, ostao sam bez ideje. U pitanju su pokazivaci, za koje sam mislio da su laki dok nisam poceo zapravo da radim s njima :D

Zadatak:

Formirati niz A[] od n sličajno odabranih elemenata iz intervala od 0-100.
Napisati funkciju koja takav niz deli na dva niza: niz B[] sadrži negativne a niz C[] pozitivne elemente.
Kreirati nizove B I C korišćenjem dinamičkog alociranja memorije, a kao argumente funkcije vratiti ova dva niza kao I njihove dimenzije.
Testirati rad funkcije u glavnom programu.

Kod zadatka.
http://pastebin.com/uh57ySgc

Pa ako mozete pogledajte pa mi javite.

S poštovanjem,
LowLevel32
 
Sredjeno je :D

Pogresio sam gore opseg u postavci zadatka. Treba da pise od -100 do 100.

Ocigledno moje teorijsko shvatanje funkcije malloc i realloc nije bilo najbolje. Zapravo i malloc mi uopste nije bio potreban.
Malo sam izmenio funkciju dAllocate, ubacio sam dodatne pokazivace Bp i Cp na kojima sam vrsio operaciju realloc pa na kraj preko pokazivaca B i C vratio ta dva niza u main funkciji.

Ispravljen kod:
http://pastebin.com/LWNLPuci

Zahvaljujem u svakom slucaju.

Pozdrav.
 
Poštovani,

Molim Vas da mi pomognete jer stvarno ne znam sta da radim, ostao sam bez ideje. U pitanju su pokazivaci, za koje sam mislio da su laki dok nisam poceo zapravo da radim s njima :D

Zadatak:

Formirati niz A[] od n sličajno odabranih elemenata iz intervala od 0-100.
Napisati funkciju koja takav niz deli na dva niza: niz B[] sadrži negativne a niz C[] pozitivne elemente.
Kreirati nizove B I C korišćenjem dinamičkog alociranja memorije, a kao argumente funkcije vratiti ova dva niza kao I njihove dimenzije.
Testirati rad funkcije u glavnom programu.

Kod zadatka.
http://pastebin.com/uh57ySgc

Pa ako mozete pogledajte pa mi javite.

S poštovanjem,
LowLevel32
#include <stdio.h>
#include <time.h>
#include<stdlib.h>

#define MAX 10

void dAllocate(int *A, int n, int *B, int *C, int *sizeB, int *sizeC) {
// Malloc niza B i niza C
B = (int *) malloc(1* sizeof(int));
C = (int *) malloc(1* sizeof(int));

int i;
int countB = 0;
int countC = 0;
int arraySizeB = 0;
int arraySizeC = 0;
//Ispis svih elemenata niza A ( 10 random brojeva )
for (i = 0; i < MAX; i++) {
printf("A[%d] = %d\n", i, A);
}

for (i = 0; i < MAX; i++) {
// Ako su brojevi manji od 0
if (A < 0) {
arraySizeB++;
int *reallocState = (int *)realloc(B, arraySizeB * sizeof(int));
if (!reallocState) {
printf("Error ocured.");
}
else {
B = reallocState;
B[countB] = A;

countB++;
}
// Ako su brojevi veci od 0 ili jednaki 0
}else if(A >= 0){
arraySizeC++;
int *reallocState = (int *)realloc(C, arraySizeC * sizeof(int));
if (!reallocState) {
printf("Error ocured.");
}
else {
C = reallocState;
C[countC] = A;
countC++;
}
}
}
*sizeB = arraySizeB;
*sizeC = arraySizeC;

}

int main() {

//Bira 10 random brojeva i smesta ih niz A
int A[100];
srand(time(NULL));
int i;
for (i = 0; i < MAX; i++) {
A = (rand() % 201) - 100;
}

int *B=(int *) malloc(1* sizeof(int));
int *C=(int *) malloc(1* sizeof(int));

int sizeB;
int sizeC;

//Poziv Funcije
dAllocate(A, MAX, B, C, &sizeB, &sizeC);

//Ispis velicine niza B i niza C
printf("Velicina niza B ( Pozitivni ) je : %d\n", sizeB);
printf("Velicina niza C ( Negativni ) je : %d\n", sizeC);

//Ispis elemenata niza B
printf("---- Negativni ----\n");
for (i = 0; i < sizeB; i++) {
printf("B[%d] = %d\n", i, *(B+i));
}

//Error???
/*
//Ispis elemenata niza C
printf("---- Negativni ----\n");
for (i = 0; i < sizeB; i++) {
printf("B[%d] = %d\n", i, B);
}
*/

system("pause");
return 0;
}


problem je pre svega kad kazes da je int *B jer onda je B read only . kad kreiras u funkciji prostor za B , to nije isto B nego pokazivac koji pokazuje na istu lokaciju kao i main B .
 
Hvala na odgovoru. Posto sam nov na forumu odgovor koji sam jutros ostavio nije jos odobren od strane moderatora.

problem je pre svega kad kazes da je int *B jer onda je B read only . kad kreiras u funkciji prostor za B , to nije isto B nego pokazivac koji pokazuje na istu lokaciju kao i main B .

Okej, to shvatam, ali zar to nije i svrha samih pokazivaca, da preko adrese neke promenljive mozemo vrsiti neke operacije. Mozda nisam dobro shvatio.

Hvala jos jednom.
 
Hvala na odgovoru. Posto sam nov na forumu odgovor koji sam jutros ostavio nije jos odobren od strane moderatora.



Okej, to shvatam, ali zar to nije i svrha samih pokazivaca, da preko adrese neke promenljive mozemo vrsiti neke operacije. Mozda nisam dobro shvatio.

Hvala jos jednom.
. Fora je sto kad pozoves funkciju ti kreiras kopiju pokazivaca , a posto taj pokazivac pokazuje na isto mesto kao i main pokazivac , onda mozes da promenis vrednost u tom mestu pristupajuci sa kopijom.
#include<stdio.h>
void pomeri(char *s )
{
s=s+5;
printf("%s\n",s);


}

int main()
{
char a[]="dobar los zao";
char *s;
s=a;

pomeri(s);
printf("%s\n ",s);



}
kao sto vidis s iz funkcije i s iz mejna nisu isto. Kopija i ona pokazuje na isto mesto kao i to glavno s .

- - - - - - - - - -

#include<stdio.h>
void pomeri(char *s )
{
*s='j'; // ovde gde pokazuje funkcijsko s se menja , a time se menja i main s jer pokazuju na isto ;
s=s+5;
printf("%s\n",s);



}

int main()
{
char a[]="dobar los zao";
char *s;
s=a;

pomeri(s);
printf("%s\n ",s);



}
procitaj komentar i vidi sta ce da ispise u ovom novom slucaju
 
Znaci da vidim samo da li sam shvatio.

Imamo niz a i pokazivac s. E sada, da li pokazivac s posle s=a cuva adresu prvog ( tj nultog ) elementa niza a ili? Posle toga prosledjujemo vrednost pokazivaca s koja je zapravo adresa nultog elementa niza ( U koliko je prethodno pitanje tacno ),
te onda dereferenciramo pokazivac s i time promenimo vrednost nultog elementa niza a
 
Znaci da vidim samo da li sam shvatio.

Imamo niz a i pokazivac s. E sada, da li pokazivac s posle s=a cuva adresu prvog ( tj nultog ) elementa niza a ili? Posle toga prosledjujemo vrednost pokazivaca s koja je zapravo adresa nultog elementa niza ( U koliko je prethodno pitanje tacno ),
te onda dereferenciramo pokazivac s i time promenimo vrednost nultog elementa niza a

s pokazuje na prvi element niza, tj cuva adresu nultog elementa . . Sad kad pozoves funkciju onda funkcijski s pokazivac pokazuje na to isto mesto. Imas 2 s pokazivaca i oba pokazuju na pocetak niza a. Ali oni su razliciti .Kao sto sam naveo u prvom primeru
 

Back
Top