Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

2.domaća zadaća
WWW:
Idite na Prethodno  1, 2, 3, 4, 5, 6, 7, 8  Sljedeće
Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
white_butterfly
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 14. 10. 2011. (17:44:57)
Postovi: (40)16
Spol: žensko
Sarma = la pohva - posuda
-1 = 1 - 2

PostPostano: 22:40 pon, 27. 1. 2014    Naslov: nejasnoća u zadatku Citirajte i odgovorite

Pozdrav!
Moj zadatak kaže da trebam kao provjeru ispisati znakove čvorova uređenog stabla u postorder redoslijedu, međutim na kraju teksta kao izlazni podatak moram ispisati oznake čvorova u preorder redoslijedu. Kao primjer piše da moj program mora ispisati ovo: JFBAGZHEDQPCA (to je postorder zadanog stabla).
Dakle, meni nije jasno da li moj program mora ispisati postorder ili preorder oznake čvorova, i zašto je u danom primjeru dva puta ispisan A? A je korijen stabla u primjeru, ali zar ne bi bio postorder ovakav: JFBGZHEDQPCA, tj. bez ovog prvog A??
Pozdrav!
Moj zadatak kaže da trebam kao provjeru ispisati znakove čvorova uređenog stabla u postorder redoslijedu, međutim na kraju teksta kao izlazni podatak moram ispisati oznake čvorova u preorder redoslijedu. Kao primjer piše da moj program mora ispisati ovo: JFBAGZHEDQPCA (to je postorder zadanog stabla).
Dakle, meni nije jasno da li moj program mora ispisati postorder ili preorder oznake čvorova, i zašto je u danom primjeru dva puta ispisan A? A je korijen stabla u primjeru, ali zar ne bi bio postorder ovakav: JFBGZHEDQPCA, tj. bez ovog prvog A??


[Vrh]
Korisnički profil Pošaljite privatnu poruku
frutabella
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 10. 2010. (16:35:36)
Postovi: (24E)16
Sarma = la pohva - posuda
-5 = 42 - 47

PostPostano: 18:15 uto, 28. 1. 2014    Naslov: Citirajte i odgovorite

Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S
Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S


[Vrh]
Korisnički profil Pošaljite privatnu poruku
beuler
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 02. 11. 2012. (14:08:41)
Postovi: (16)16
Sarma = la pohva - posuda
= 5 - 1

PostPostano: 19:56 uto, 28. 1. 2014    Naslov: Citirajte i odgovorite

[quote="frutabella"]Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S[/quote]


npr vezanu listu pointera na liste pa ubacujes u next pointer iducu na listu
ili jos bolje polje pointera na liste duljine m, pa samo for petljom ispunis liste
frutabella (napisa):
Moram sazeti m uzlazno sortiranih listi pomocu hrpe. Hrpa je prikazana pomocu pointera, a lista je vezana lista prikazana pomocu pointera. Kako da ucitam m sortiranih listi? :S



npr vezanu listu pointera na liste pa ubacujes u next pointer iducu na listu
ili jos bolje polje pointera na liste duljine m, pa samo for petljom ispunis liste



_________________
Sumnjam, dakle možda jesam.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
frutabella
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 10. 2010. (16:35:36)
Postovi: (24E)16
Sarma = la pohva - posuda
-5 = 42 - 47

PostPostano: 20:23 uto, 28. 1. 2014    Naslov: Citirajte i odgovorite

:oops: mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.
[code:1]
#include <stdio.h>
#include<stdlib.h>
#include<ctype.h>


typedef struct celltag{

char c;
struct celltag *next;

}celltype;


typedef celltype *List;
typedef celltype *position;


position LiMakeNull(List *Lp){

*Lp=(celltype*)malloc(sizeof(celltype));
(*Lp)->next=NULL;
return (*Lp);
}


void LiInsert (char x, position p, List *Lp)
{
position temp;
temp=p->next;
p->next=(celltype*)malloc(sizeof(celltype));
p->next=x;
p->next->next=temp;
}

position LiNext(position p, List Lp)
{
if (p->next == NULL)
{
printf("NEXT: Kriva pozicija.");
exit(1);
}

return p->next;
}




int main (void){

int m, i, j;
char c;

List L[10];
position p[10];

printf("Koliko listi zelimo sazeti?\n");
scanf("%d", m);

for(i=1; i<=m; ++i)
p[i]=LiMakeNull(&L[i]);



for(i=1; i<=m; ++i)
{
printf("U listu %d ubaci sljedece charove:\n", i);
for(j=0; j<20; ++j)
{
scanf("%c", c);
if (isalpha('c')==0)
{ i++;
break;
}
else

LiInsert(c, p[i], &L[i]);
p[i]=LiNext(p[i], L[i]);
}
}

return 0;
}

[/code:1]

Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. :oops:
Ali nesto ne stima...
Embarassed mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.
Kod:

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


typedef struct celltag{

      char c;
      struct celltag *next;

}celltype;


     typedef celltype *List;
     typedef celltype *position;


     position LiMakeNull(List *Lp){

        *Lp=(celltype*)malloc(sizeof(celltype));
        (*Lp)->next=NULL;
        return (*Lp);
   }


     void LiInsert (char x, position p, List *Lp)
   {
       position temp;
       temp=p->next;
       p->next=(celltype*)malloc(sizeof(celltype));
       p->next=x;
       p->next->next=temp;
   }

     position LiNext(position p, List Lp)
     {
       if (p->next == NULL)
       {
       printf("NEXT: Kriva pozicija.");
       exit(1);
       }

       return p->next;
    }




        int main (void){

             int m, i, j;
             char c;

             List L[10];
             position p[10];

             printf("Koliko listi zelimo sazeti?\n");
             scanf("%d", m);

             for(i=1; i<=m; ++i)
             p[i]=LiMakeNull(&L[i]);

           

            for(i=1; i<=m; ++i)
            {
             printf("U listu %d  ubaci sljedece charove:\n", i);
             for(j=0; j<20; ++j)
             {
                 scanf("%c", c);
                 if (isalpha('c')==0)
                 {   i++;
                     break;
                 }
                 else

                 LiInsert(c, p[i], &L[i]);
                 p[i]=LiNext(p[i], L[i]);
             }
            }

             return 0;
    }



Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. Embarassed
Ali nesto ne stima...


[Vrh]
Korisnički profil Pošaljite privatnu poruku
beuler
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 02. 11. 2012. (14:08:41)
Postovi: (16)16
Sarma = la pohva - posuda
= 5 - 1

PostPostano: 5:40 čet, 30. 1. 2014    Naslov: Citirajte i odgovorite

[quote="frutabella"]:oops: mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.

Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. :oops:
Ali nesto ne stima...[/quote]

i ja sam se pomucio :D ali ovo radi

http://pastebin.com/VWmB2MdR
frutabella (napisa):
Embarassed mislim da imam problema s prog2, nesto ovako se meni cini ok, ali ne radi, ne znam u cemu je problem.
Lista sadrzi elemente tipa char. Prepostavka je da ima najvise 10 lisi, a svaka ima najvise 20 elemenata.

Ovdje kao zelim stvoriti liste L[1], L[2], ... , L[m], a svaka od njih ima svoje pozicije p[1], ... p[m].
I for petljom popunjavam. Embarassed
Ali nesto ne stima...


i ja sam se pomucio Very Happy ali ovo radi

http://pastebin.com/VWmB2MdR



_________________
Sumnjam, dakle možda jesam.
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Countess
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 22. 07. 2013. (13:34:10)
Postovi: (13)16
Spol: žensko
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 9:45 čet, 30. 1. 2014    Naslov: Citirajte i odgovorite

[code:1]
scanf("%d", m);
.
.
.

scanf("%c", c);
[/code:1]

Zaboravila si "&" u oba učitavanja u glavnom programu. Ako ima još grešaka, ja ih ne vidim jer nisam kompetentna :oops:
Kod:

             scanf("%d", m);
.
.
.
             
             scanf("%c", c);


Zaboravila si "&" u oba učitavanja u glavnom programu. Ako ima još grešaka, ja ih ne vidim jer nisam kompetentna Embarassed


[Vrh]
Korisnički profil Pošaljite privatnu poruku
frutabella
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 09. 10. 2010. (16:35:36)
Postovi: (24E)16
Sarma = la pohva - posuda
-5 = 42 - 47

PostPostano: 14:43 čet, 30. 1. 2014    Naslov: Citirajte i odgovorite

Hvala vam! Rijesila sam malo drukcije, prvo ucitala string, pa onda iz stringa znak po znak dodavala u listu.
Hvala vam! Rijesila sam malo drukcije, prvo ucitala string, pa onda iz stringa znak po znak dodavala u listu.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
gljividus
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 10. 11. 2012. (22:18:49)
Postovi: (D)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 22:41 uto, 27. 1. 2015    Naslov: Citirajte i odgovorite

molila bih nekoga za pomoć...imam dictionary pomoću BST, gdje je binarno stablo prikazano pomoću pointera..kao implementaciju koristila sam funkcije iz udžbenika: delete, delete-min,insert, member, makenull. program se sruši kad pozovem neke od tih glavnih funkcija.. zna li netko mora li se još neka implementacija ubaciti u program? tipa za binarno stablo pomoću pointera? stvarno sam više izgubljena :(
molila bih nekoga za pomoć...imam dictionary pomoću BST, gdje je binarno stablo prikazano pomoću pointera..kao implementaciju koristila sam funkcije iz udžbenika: delete, delete-min,insert, member, makenull. program se sruši kad pozovem neke od tih glavnih funkcija.. zna li netko mora li se još neka implementacija ubaciti u program? tipa za binarno stablo pomoću pointera? stvarno sam više izgubljena Sad


[Vrh]
Korisnički profil Pošaljite privatnu poruku
01
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 01. 02. 2015. (13:36:05)
Postovi: (1)16
Sarma = la pohva - posuda
= 0 - 0

PostPostano: 13:48 ned, 1. 2. 2015    Naslov: Citirajte i odgovorite

Program se rusi pa ako netko vidi zasto bila bih zahvalna na pomoci :) .

Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika:X(r)=(x1(r),...,xn(r)), r=1,..,m. Kažemo da je vektor X(j) < X(k) ako postoji i, 1 ≤ i ≤n takav da vrijedi: xr(j) = xr(k) za sve 1 ≤ r < i i xi(j) <xi(k)(to jest, sortira se leksikografski). Nemojte uvoditi ograničenja na veličinu brojeva m i n.

#include <stdio.h>
#include <malloc.h>

struct cv
{
int *vektor;
struct cv *lijevi;
struct cv *desni;
};
int m, n;
int *noviVektor;
struct cv *korijen;

int usporedi(int *prvi, int *drugi, int index)
{
if (index == n)
return -1;
if (prvi[index] < drugi[index])
return -1;
if (prvi[index] > drugi[index])
return 1;
index++;
return usporedi(prvi, drugi, index);
}

void dodaj(struct cv *cvor, int *element)
{
int i;
if (cvor == NULL)
{
cvor = (struct cv *)malloc(sizeof(struct cv));
cvor->vektor = (int *)malloc(n);
for (i = 0; i < n; i++)
(cvor->vektor)[i] = element[i];
cvor->lijevi = NULL;
cvor->desni = NULL;
}
else if (usporedi(element, cvor->vektor, 0) == -1)
dodaj(cvor->lijevi, element);
else
dodaj(cvor->desni, element);
}

void ispisi(struct cv *cvor)
{
int i;
if (cvor->lijevi != NULL)
{
ispisi(cvor->lijevi);
free(cvor->lijevi);
}
for (i = 0; i < n; i++)
{
printf("%d", (cvor->vektor)[i]);
if (i != (n - 1))
printf(" ");
}
printf("\n");
free(cvor->vektor);
if (cvor->desni != NULL)
{
ispisi(cvor->desni);
free(cvor->desni);
}
}

int main(void)
{
int i, j;
korijen = NULL;
scanf("%d", &m);
scanf("%d", &n);
for (i = 0; i < m; i++)
{
noviVektor = (int *)malloc(n);
for (j = 0; j < n; j++)
scanf("%d", &noviVektor[j]);
dodaj(korijen, noviVektor);
free(noviVektor);
}
ispisi(korijen);
return 0;
}
Program se rusi pa ako netko vidi zasto bila bih zahvalna na pomoci Smile .

Osmislite algoritam i napišite odgovarajući program za sortiranje m vektora oblika:X(r)=(x1(r),...,xn(r)), r=1,..,m. Kažemo da je vektor X(j) < X(k) ako postoji i, 1 ≤ i ≤n takav da vrijedi: xr(j) = xr(k) za sve 1 ≤ r < i i xi(j) <xi(k)(to jest, sortira se leksikografski). Nemojte uvoditi ograničenja na veličinu brojeva m i n.

#include <stdio.h>
#include <malloc.h>

struct cv
{
int *vektor;
struct cv *lijevi;
struct cv *desni;
};
int m, n;
int *noviVektor;
struct cv *korijen;

int usporedi(int *prvi, int *drugi, int index)
{
if (index == n)
return -1;
if (prvi[index] < drugi[index])
return -1;
if (prvi[index] > drugi[index])
return 1;
index++;
return usporedi(prvi, drugi, index);
}

void dodaj(struct cv *cvor, int *element)
{
int i;
if (cvor == NULL)
{
cvor = (struct cv *)malloc(sizeof(struct cv));
cvor→vektor = (int *)malloc(n);
for (i = 0; i < n; i++)
(cvor→vektor)[i] = element[i];
cvor→lijevi = NULL;
cvor→desni = NULL;
}
else if (usporedi(element, cvor→vektor, 0) == -1)
dodaj(cvor→lijevi, element);
else
dodaj(cvor→desni, element);
}

void ispisi(struct cv *cvor)
{
int i;
if (cvor→lijevi != NULL)
{
ispisi(cvor→lijevi);
free(cvor→lijevi);
}
for (i = 0; i < n; i++)
{
printf("%d", (cvor→vektor)[i]);
if (i != (n - 1))
printf(" ");
}
printf("\n");
free(cvor→vektor);
if (cvor→desni != NULL)
{
ispisi(cvor→desni);
free(cvor→desni);
}
}

int main(void)
{
int i, j;
korijen = NULL;
scanf("%d", &m);
scanf("%d", &n);
for (i = 0; i < m; i++)
{
noviVektor = (int *)malloc(n);
for (j = 0; j < n; j++)
scanf("%d", &noviVektor[j]);
dodaj(korijen, noviVektor);
free(noviVektor);
}
ispisi(korijen);
return 0;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
beeing
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 09. 2014. (20:22:02)
Postovi: (E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 21:12 pet, 29. 1. 2016    Naslov: Citirajte i odgovorite

Pozdrav. Imam problem u vezi zadaće. Zadatak glasi ovako:

Detaljno razradite implementaciju binarne relacije pomocu multiliste (vidi pododjeljak 4.4.5 u knjizi). Dakle napisite u C-u sve potrebne de nicije tipova i sve potrebne funkcije. Napisite program koji koristi vasu implementaciju za evidentiranje veze izmedu studenata i izbornih kolegija. Program treba omoguciti:
 unosenje ili izbacivanje studenata ili kolegija
 biljezenje cinjenice da je zadani student upisao zadani kolegij ili ponistio takav upis.
Takoder, program treba davati odgovore na sljedeca pitanja:
 Koje sve kolegije je upisao zadani student?
 Koji sve studenti su upisali zadani kolegij?

Dvije domene su mi pokazivaci na char.
Funkcija main izgleda ovako (barem do dijela gdje mi program pada):

[code:1]
int main () {
int br, len;
char p[100];
Relation R;
ReMakeNull (&R);
domain1 student;
domain2 kolegij;


printf("Za unos studenta birajte 1. \n");
// ovdje idu ostali printfovi za ostale unose

while (1) {
printf ("Unesite broj: ");
scanf ("%d", &br);
switch (br) {
case 1: {
printf("Ime studenta: \n");
alociraj1 (&student);
unesi_studenta (student, &R);
break;
}
/* (...) */
[/code:1]

Funkcije koje se pozivaju u case 1 su definirane ovako:


[code:1]
void alociraj1 (domain1 *student) {
char str[100];
scanf(" %[^\n]", str);
(*student) = (domain1)malloc((strlen(str)+1)*sizeof(char));
strcpy(*student, str);
}

void unesi_studenta (domain1 student, Relation *Rp) {
domain2 kolegij;
int flag=1; // pretpostavljamo da ako se unosi student da je on upisao barem jedan kolegij
while (flag) {
printf ("Unesi kolegij koji je %s upisao/la: \n", student);
alociraj2 (&kolegij);
ReRelate ( Rp, student, kolegij);
printf ("Ima li jos kolegija koje je upisao/la? (1/0)");
scanf ("%d", &flag);
}
}

void alociraj2 (domain2 *kolegij) {
char str[100];
scanf(" %[^\n]", str);
(*kolegij) = (domain2)malloc((strlen(str)+1)*sizeof(char));
strcpy(*kolegij, str);
}

void ReRelate (Relation *R, domain1 d1, domain2 d2) {
rcelltype *poc1, *poc2, *p, *t;
int ima1 = MaCompute1(R->M1, d1, &poc1);
int ima2 = MaCompute2(R->M2, d2, &poc2);
if (ima1)
for (p = poc1; p; p = p->next1)
if ( !strcmp (p->d1, d1) && !strcmp(p->d2, d2))
return;
t = (rcelltype*)malloc(sizeof(rcelltype));

strcpy (t->d1, d1);
strcpy (t->d2, d2);

t->next1 = ima1 ? poc1 : NULL;
t->next2 = ima2 ? poc2 : NULL;
printf("rerelate\n");
MaAssign1(&R->M1, d1, t);
MaAssign2(&R->M2, d2, t);
}

void MaAssign1 (Mapping1 *Mp, domain1 d, range r) {
if ((*Mp) == NULL) {
printf("maassign1\n");
(*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1)); // <- tu prestaje raditi
printf("maassign1\n");
strncpy ((*Mp)->d, d, strlen(d));
(*Mp)->r = r;
(*Mp)->left = (*Mp)->right = NULL;
return;
}
// itd.
}
[/code:1]

Program prestaje raditi kod alokacije memorije za *Mp u funkciji MaAssign1. Pojavi se onaj pravokutnik sa "Program (...).exe prestao je raditi; Windows traži rješenje problema na internetu...". Vidi li netko odmah u čemu je stvar? Stavit ću čitav kod u attachment ako netko ne vidi odmah, a voljan je podrobnije pogledati o čemu je riječ. :)
Pozdrav. Imam problem u vezi zadaće. Zadatak glasi ovako:

Detaljno razradite implementaciju binarne relacije pomocu multiliste (vidi pododjeljak 4.4.5 u knjizi). Dakle napisite u C-u sve potrebne de nicije tipova i sve potrebne funkcije. Napisite program koji koristi vasu implementaciju za evidentiranje veze izmedu studenata i izbornih kolegija. Program treba omoguciti:
 unosenje ili izbacivanje studenata ili kolegija
 biljezenje cinjenice da je zadani student upisao zadani kolegij ili ponistio takav upis.
Takoder, program treba davati odgovore na sljedeca pitanja:
 Koje sve kolegije je upisao zadani student?
 Koji sve studenti su upisali zadani kolegij?

Dvije domene su mi pokazivaci na char.
Funkcija main izgleda ovako (barem do dijela gdje mi program pada):

Kod:

int main () {
    int br, len;
    char p[100];
    Relation R;
    ReMakeNull (&R);
    domain1 student;
    domain2 kolegij;
   
   
    printf("Za unos studenta birajte 1. \n");
    // ovdje idu ostali printfovi za ostale unose
   
    while (1) {
        printf ("Unesite broj: ");
        scanf ("%d", &br);
        switch (br) {
        case 1: {
            printf("Ime studenta: \n");
            alociraj1 (&student);
            unesi_studenta (student, &R);
            break;
        }
     /* (...) */


Funkcije koje se pozivaju u case 1 su definirane ovako:


Kod:

void alociraj1 (domain1 *student) {
    char str[100];
    scanf(" %[^\n]", str);
    (*student) = (domain1)malloc((strlen(str)+1)*sizeof(char));
    strcpy(*student, str);
}

void unesi_studenta (domain1 student, Relation *Rp) {
    domain2 kolegij;
    int flag=1; // pretpostavljamo da ako se unosi student da je on upisao barem jedan kolegij
    while (flag) {
        printf ("Unesi kolegij koji je %s upisao/la: \n", student);
        alociraj2 (&kolegij);
        ReRelate ( Rp, student, kolegij);
        printf ("Ima li jos kolegija koje je upisao/la? (1/0)");
        scanf ("%d", &flag);
    }
}

void alociraj2 (domain2 *kolegij) {
    char str[100];
    scanf(" %[^\n]", str);
    (*kolegij) = (domain2)malloc((strlen(str)+1)*sizeof(char));
    strcpy(*kolegij, str);
}

void ReRelate (Relation *R, domain1 d1, domain2 d2) {
    rcelltype *poc1, *poc2, *p, *t;
    int ima1 = MaCompute1(R->M1, d1, &poc1);
    int ima2 = MaCompute2(R->M2, d2, &poc2);
    if (ima1)
        for (p = poc1; p; p = p->next1)
            if ( !strcmp (p->d1, d1) && !strcmp(p->d2, d2))
                return;
    t = (rcelltype*)malloc(sizeof(rcelltype));

    strcpy (t->d1, d1);
    strcpy (t->d2, d2);

    t->next1 = ima1 ? poc1 : NULL;
    t->next2 = ima2 ? poc2 : NULL;
    printf("rerelate\n");
    MaAssign1(&R->M1, d1, t);
    MaAssign2(&R->M2, d2, t);
}

void MaAssign1 (Mapping1 *Mp, domain1 d, range r) {
    if ((*Mp) == NULL) {
        printf("maassign1\n");
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));   // <- tu prestaje raditi
        printf("maassign1\n");
        strncpy ((*Mp)->d, d, strlen(d));
        (*Mp)->r = r;
        (*Mp)->left = (*Mp)->right = NULL;
        return;
    }
    // itd.
}


Program prestaje raditi kod alokacije memorije za *Mp u funkciji MaAssign1. Pojavi se onaj pravokutnik sa "Program (...).exe prestao je raditi; Windows traži rješenje problema na internetu...". Vidi li netko odmah u čemu je stvar? Stavit ću čitav kod u attachment ako netko ne vidi odmah, a voljan je podrobnije pogledati o čemu je riječ. Smile





Zadaća - string.c
 Description:

Download
 Filename:  Zadaća - string.c
 Filesize:  23.68 KB
 Downloaded:  132 Time(s)

[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 3:06 sub, 30. 1. 2016    Naslov: Citirajte i odgovorite

Ovdje je problem:

[code:1] t = (rcelltype*)malloc(sizeof(rcelltype));

strcpy (t->d1, d1);
strcpy (t->d2, d2);[/code:1]

Varijable [tt]d1[/tt] i [tt]d2[/tt] su nealocirani pointeri koje [tt]strcpy[/tt] treba dereferencirati i nesto zapisati tamo gdje oni pokazuju (sto je, ovisno o OSu, ili [tt]NULL[/tt] ili neka bezvezna lokacija koja ne postoji ili barem ne pripada programu).
Ovdje je problem:

Kod:
    t = (rcelltype*)malloc(sizeof(rcelltype));

    strcpy (t->d1, d1);
    strcpy (t->d2, d2);


Varijable d1 i d2 su nealocirani pointeri koje strcpy treba dereferencirati i nesto zapisati tamo gdje oni pokazuju (sto je, ovisno o OSu, ili NULL ili neka bezvezna lokacija koja ne postoji ili barem ne pripada programu).



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
beeing
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 09. 2014. (20:22:02)
Postovi: (E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 8:02 sub, 30. 1. 2016    Naslov: Citirajte i odgovorite

Hvala na odgovoru. No, ne razumijem zašto strcpy treba zapisati nešto tamo gdje pokazuju d1 i d2, nije li da želi nešto zapisati tamo gdje pokazuju t->d1 i t->d2? Ako je ipak tako, onda alociram memorije za t->d1 i t->d2, ali ništa se ne mijenja po pitanju rada programa.
Hvala na odgovoru. No, ne razumijem zašto strcpy treba zapisati nešto tamo gdje pokazuju d1 i d2, nije li da želi nešto zapisati tamo gdje pokazuju t->d1 i t->d2? Ako je ipak tako, onda alociram memorije za t->d1 i t->d2, ali ništa se ne mijenja po pitanju rada programa.


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 12:34 sub, 30. 1. 2016    Naslov: Citirajte i odgovorite

Da, mislio sam na [tt]t->d1[/tt] i [tt]t->d2[/tt]. Kad dodam alokaciju:
[code:1] t->d1 = (domain1)malloc(strlen(d1)+1);
t->d2 = (domain1)malloc(strlen(d2)+1);[/code:1]
ovaj dio programa prodje kako treba i ispise mi:
[code:1]rerelate
maassign1
maassign1[/code:1]
prije nego padne. To se desi ovdje:
[code:1] (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
printf("maassign1\n");
strncpy ((*Mp)->d, d, strlen(d));[/code:1]
Ocito, problem je isti: [tt](*Mp)->d[/tt] je nealocirani pointer kojeg [tt]strncpy[/tt] mora dereferencirati da pi pisao tamo gdje taj pointer pokazuje (sto je, kao i prije, ili [tt]NULL[/tt] ili nesto besmisleno).
Da, mislio sam na t→d1 i t→d2. Kad dodam alokaciju:
Kod:
    t->d1 = (domain1)malloc(strlen(d1)+1);
    t->d2 = (domain1)malloc(strlen(d2)+1);

ovaj dio programa prodje kako treba i ispise mi:
Kod:
rerelate
maassign1
maassign1

prije nego padne. To se desi ovdje:
Kod:
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
        printf("maassign1\n");
        strncpy ((*Mp)->d, d, strlen(d));

Ocito, problem je isti: (*Mp)→d je nealocirani pointer kojeg strncpy mora dereferencirati da pi pisao tamo gdje taj pointer pokazuje (sto je, kao i prije, ili NULL ili nesto besmisleno).



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
beeing
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 09. 2014. (20:22:02)
Postovi: (E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 16:55 sub, 30. 1. 2016    Naslov: Citirajte i odgovorite

Ups, hvala. :) Nastavila bih gnjaviti ako smijem. U jednom trenutku program mi ulazi u
[code:1]void ReCompute2 (Relation R, domain1 d1, Set2 *S2p) {
SeMakeNull2(S2p);
rcelltype *p;
if (R.M1) //R.M1 je pokazivac na strukturu
printf("R.M1 nije null\n");
int ima = MaCompute1(R.M1, d1, &p);
if(!ima)
return;
(...)
}
[/code:1]
a MaCompute1 je definirana sa
[code:1]int MaCompute1 (Mapping1 M, domain1 d, range *rp) {
if(M == NULL){
printf("M je null\n");
return 0;
}
(...)
}
[/code:1]
Program ispiše
[code:1]R.M1 nije null
M je null
[/code:1]
i varijabla ima je nakon poziva MaCompute1 vrijednosti nula. Kako do toga dođe, da pokazivač R.M1 ipak ne pokazuje ni na što?
Ups, hvala. Smile Nastavila bih gnjaviti ako smijem. U jednom trenutku program mi ulazi u
Kod:
void ReCompute2 (Relation R, domain1 d1, Set2 *S2p) {
    SeMakeNull2(S2p);
    rcelltype *p;
    if (R.M1) //R.M1 je pokazivac na strukturu
        printf("R.M1 nije null\n");
    int ima = MaCompute1(R.M1, d1, &p);
    if(!ima)
        return;
    (...)
}

a MaCompute1 je definirana sa
Kod:
int MaCompute1 (Mapping1 M, domain1 d, range *rp) {
    if(M == NULL){
        printf("M je null\n");
        return 0;
    }
    (...)
}

Program ispiše
Kod:
R.M1 nije null
M je null

i varijabla ima je nakon poziva MaCompute1 vrijednosti nula. Kako do toga dođe, da pokazivač R.M1 ipak ne pokazuje ni na što?


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 17:42 sub, 30. 1. 2016    Naslov: Citirajte i odgovorite

To sto pointer [i]negdje[/i] pokazuje, ne znaci da pokazuje gdje treba. Ako nije alociran i ako mu nisi direktno zadala da pokazuje na neku smislenu adresu, onda ce on ili biti [tt]NULL[/tt] ili ce pokazivati negdje bezveze. Recimo, ovaj program:
[code:1]#include <stdio.h>

int main(void) {
int *p;
printf("%p\n", p);
return 0;
}[/code:1]
na Linuxu ispise [tt](nil)[/tt], a na WinXP neku random adresu (konkretno, meni je ispisao [tt]7FFDF000[/tt] i jednom izvrsavanju, a [tt]7FFDE000[/tt] u drugom).

Stvar je ista kao s "obicnim" varijablama. Ako napravis:
[code:1]int x;
printf("%d\n", x);[/code:1]
racunaj da vrijednost [tt]x[/tt]-a nije definirana jer nigdje nisi rekla [tt]x = [i]nesto[/i];[/tt], ili [tt]scanf("...", &x);[/tt], ili nesto slicno. Moze ti se [i]desiti[/i] da je nula (npr. na Linuxu), a moze ispasti i neka skroz slucajna vrijednost koja se u trenutku stvaranja varijable zatekla na dijelu memorije koji je varijabli dodijeljen (npr. na Win).

Varijable tipa [tt]int[/tt] u sebi drze cijele brojeve, a pointeri drze adrese, no i jedno i drugo su samo nekakvi podaci i nema razloga da se razlicito ponasaju kad ih kreiras bez inicijalizacije.
To sto pointer negdje pokazuje, ne znaci da pokazuje gdje treba. Ako nije alociran i ako mu nisi direktno zadala da pokazuje na neku smislenu adresu, onda ce on ili biti NULL ili ce pokazivati negdje bezveze. Recimo, ovaj program:
Kod:
#include <stdio.h>

int main(void) {
    int *p;
    printf("%p\n", p);
    return 0;
}

na Linuxu ispise (nil), a na WinXP neku random adresu (konkretno, meni je ispisao 7FFDF000 i jednom izvrsavanju, a 7FFDE000 u drugom).

Stvar je ista kao s "obicnim" varijablama. Ako napravis:
Kod:
int x;
printf("%d\n", x);

racunaj da vrijednost x-a nije definirana jer nigdje nisi rekla x = nesto;, ili scanf("...", &x);, ili nesto slicno. Moze ti se desiti da je nula (npr. na Linuxu), a moze ispasti i neka skroz slucajna vrijednost koja se u trenutku stvaranja varijable zatekla na dijelu memorije koji je varijabli dodijeljen (npr. na Win).

Varijable tipa int u sebi drze cijele brojeve, a pointeri drze adrese, no i jedno i drugo su samo nekakvi podaci i nema razloga da se razlicito ponasaju kad ih kreiras bez inicijalizacije.



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
beeing
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 09. 2014. (20:22:02)
Postovi: (E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 0:35 ned, 31. 1. 2016    Naslov: Citirajte i odgovorite

No, komponente varijable R koju prima ReCompute2, R.M1 i R.M2, prije ovog dijela koda bile su proslijeđene redom funkcijama MaAssign1 i MaAssign2, gdje su memorije za njih bile uredno alocirane. Ali, kad provjeravam adrese pointera u ReCompute2, vidim zaista da jednom pokazuju na jednu stvar, a drugi put na drugu. :?
No, komponente varijable R koju prima ReCompute2, R.M1 i R.M2, prije ovog dijela koda bile su proslijeđene redom funkcijama MaAssign1 i MaAssign2, gdje su memorije za njih bile uredno alocirane. Ali, kad provjeravam adrese pointera u ReCompute2, vidim zaista da jednom pokazuju na jednu stvar, a drugi put na drugu. Confused


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 2:00 ned, 31. 1. 2016    Naslov: Citirajte i odgovorite

U [tt]MaAssign[/tt] funkcijama to izgleda ovako:
[code:1] (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
strncpy ((*Mp)->d, d, strlen(d));[/code:1]
[tt](*Mp)->d[/tt] je, u osnovi, [tt]char*[/tt]. Gdje se to alocira?

Preporucio bih setnju do demosa ili, ako oni ne postoje, do asistenta, pa debuggirajte zajedno. Ovakvo loptanje gdje svatko od nas napise nesto svakih nekoliko sati bi moglo potrajati.
U MaAssign funkcijama to izgleda ovako:
Kod:
        (*Mp) = (mcelltype1*)malloc(sizeof(mcelltype1));
        strncpy ((*Mp)->d, d, strlen(d));

(*Mp)→d je, u osnovi, char*. Gdje se to alocira?

Preporucio bih setnju do demosa ili, ako oni ne postoje, do asistenta, pa debuggirajte zajedno. Ovakvo loptanje gdje svatko od nas napise nesto svakih nekoliko sati bi moglo potrajati.



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
beeing
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 09. 2014. (20:22:02)
Postovi: (E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 2:16 ned, 31. 1. 2016    Naslov: Citirajte i odgovorite

Isto u funkcijama MaAssign1 i MaAssign2 između tih dviju linija koje ste naveli sa[code:1] (*Mp)->d = (domain1)malloc(strlen(d)+1);[/code:1] i [code:1] (*Mp)->d = (domain2)malloc(strlen(d)+1);[/code:1]
Isto u funkcijama MaAssign1 i MaAssign2 između tih dviju linija koje ste naveli sa
Kod:
        (*Mp)->d = (domain1)malloc(strlen(d)+1);
i
Kod:
        (*Mp)->d = (domain2)malloc(strlen(d)+1);


[Vrh]
Korisnički profil Pošaljite privatnu poruku
vsego
Site Admin
Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09)
Postovi: (355F)16
Spol: zombi
Sarma = la pohva - posuda
854 = 1068 - 214
Lokacija: /sbin/init

PostPostano: 11:13 ned, 31. 1. 2016    Naslov: Citirajte i odgovorite

Verzija koju ja imam (iz attachmenta od par postova gore) to nema, tako da mogu samo pricati napamet. :( Kao sto rekoh, debugging je bolje raditi uzivo.
Verzija koju ja imam (iz attachmenta od par postova gore) to nema, tako da mogu samo pricati napamet. Sad Kao sto rekoh, debugging je bolje raditi uzivo.



_________________
U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
Drzim prodike
[Vrh]
Korisnički profil Pošaljite privatnu poruku
beeing
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 18. 09. 2014. (20:22:02)
Postovi: (E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 11:31 ned, 31. 1. 2016    Naslov: Citirajte i odgovorite

Ovo je zadnja verzija. Pokušat ću se svakako još naći sa asistentom. Hvala na pomoći :)
Ovo je zadnja verzija. Pokušat ću se svakako još naći sa asistentom. Hvala na pomoći Smile





Zadaća - string.c
 Description:

Download
 Filename:  Zadaća - string.c
 Filesize:  23.85 KB
 Downloaded:  115 Time(s)

[Vrh]
Korisnički profil Pošaljite privatnu poruku
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji 2. godine -> Strukture podataka i algoritmi Vremenska zona: GMT + 01:00.
Idite na Prethodno  1, 2, 3, 4, 5, 6, 7, 8  Sljedeće
Stranica 7 / 8.

 
Forum(o)Bir:  
Ne možete otvarati nove teme.
Ne možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan