Struktury, odkazy – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Struktury, odkazy – C / C++ – Fórum – Programujte.comStruktury, odkazy – C / C++ – Fórum – Programujte.com

 

Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #1
-
0
-

Ahoj,

narazil jsem na problém. Mám pole struktur a každá struktura je schopna uchovávat odkazy na ostatní stuktury v poli. Teoreticky se zdá, že to funguje, ale když změním polozku1 přístupem přes polozku2, tak se změny na polozce1 neprojeví. Kde je chyba?



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

struct MOJE{
int cislo;
MOJE * seznam;
char jmeno;
};

typedef struct MOJE * zk;

int main(int arvc, char ** argv){
MOJE * seznam = (MOJE *)malloc(3*sizeof(MOJE));
MOJE polozka1, polozka2;
polozka1.cislo = 1;
polozka2.seznam = (MOJE *)malloc(3*sizeof(MOJE));
polozka2.seznam[0] = polozka1;
printf("Polozka 1, cislo = %d\n", polozka1.cislo);
polozka2.seznam[0].cislo += 1;//Proc tohle nefunguje?
printf("Polozka 1, cislo = %d\n", polozka1.cislo);
polozka1.cislo += 1;
printf("Polozka 1, cislo = %d\n", polozka1.cislo);
return 1;
}

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #2
-
0
-

protoze polozka2.seznam[0] = polozka1;
udela kopii polozky1.. pokud to vypises tak jak si zmenil tak to bude spravne.. nicmene polozku1 nezmenis

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #3
-
0
-

Takže neexistuje žádný způsob, jak to uložit do toho pole tak, abych to pak mohl měnit tím způsobem?

Něco jako:



polozka2.seznam[0] = &polozka1;

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #4
-
0
-

takhle by to slo ale za predpokladu ze budes mit ve strukture:
MOJE ** seznam;


pak pokracovat:
polozka2.seznam = (MOJE **)malloc(3*sizeof(MOJE *));
a pouzivat polozka2.seznam[0]->cislo (pripadne polozka.seznam[0][0].cislo a tak podobne.. moznosti je hodne)

mimochodem k cemu tam mas: MOJE * seznam = (MOJE *)malloc(3*sizeof(MOJE)); ??
+ neuvolnujes po sobe pamet

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #5
-
0
-

Díky, hotovo.



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

struct MOJE{
int cislo;
MOJE ** seznam;
char jmeno;
};

typedef struct MOJE * zk;

int main(int arvc, char ** argv){
MOJE ** pole = (MOJE **)malloc(3*sizeof(MOJE *));
MOJE polozka1, polozka2;
polozka1.cislo = 1;
polozka2.seznam = (MOJE **)malloc(3*sizeof(MOJE *));
polozka2.seznam[0] = &polozka1;
pole[0] = &polozka1;
pole[1] = &polozka2;
printf("Polozka 1, cislo = %d\n", pole[0][0].cislo);
pole[1][0].seznam[0]->cislo += 1;//Proc tohle nefunguje?
printf("Polozka 1, cislo = %d\n", pole[0][0].cislo);
free(pole);
return 1;
}

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #6
-
0
-

To Blujacker : jeste neuvolnujes ten drujeh malloc...

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #7
-
0
-

To KIIV :
Tak stejně je to jenom testovací program, který jenom simuluje vlastnosti, které potom chci implementovat do semestrálky, ale budiž:



free(pole[1][0].seznam);

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #8
-
0
-

To Blujacker : tak detaily sou detaily.. urcite se pak seznam s programem valgrind :)

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #9
-
0
-

Na práci s pamětí zatím používám mudflap, ale valgrind si taky seženu :-)

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #10
-
0
-

Tak jsem zase něco pomotal, protože to nefunguje.

Mám zase pole struktur, každé struktuře nastavuji barva = 1. Proč tedy na konci, když vypíši pole[i][0].barva nějaké číslo (vypadá to jako neinicializovaný int, ale jak se tam dostal?)



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


struct MOJE{
int barva;
MOJE ** sousedi;
char jmeno[65];
int id;
int pocty_sousedu;
};

typedef struct MOJE * zk;

int Pridej(MOJE *** staty, int * pocet){
MOJE novy;
(*staty) = (MOJE **)realloc( (*staty),(*(pocet)+1)*sizeof(MOJE *));
novy.pocty_sousedu = 1;
novy.barva = 1;
novy.sousedi = (MOJE **)malloc(0);
(*staty)[*pocet] = &novy;
*pocet += 1;
}

void Vloz(MOJE *** staty, int i, int soused){

(*staty)[i][0].sousedi = (MOJE **)realloc((*staty)[i][0].sousedi, sizeof(MOJE* )*((*staty)[i][0].pocty_sousedu+1));
(*staty)[i][0].pocty_sousedu += 1;
//(*staty)[i] = (*staty)[soused];
}

MOJE ** NactiMOJE(int * pocet){
MOJE ** staty = (MOJE **)malloc(0);
int x;
Pridej(&staty, pocet);
for (x = 0; x != 1; x++){
Pridej(&staty, pocet);
Vloz(&staty, x, x-1);
}
return staty;
}


int main(int arvc, char ** argv){
MOJE ** pole;
int i, pocet = 0;
pole = NactiMOJE(&pocet);
printf("%d != 1\n\n", pole[0][0].barva);
//dealokace :-)
return 1;
}


Děkuji za jakoukoliv pomoc

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #11
-
0
-

To Blujacker :

 valgrind ./a.out

==15047== Memcheck, a memory error detector
==15047== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==15047== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==15047== Command: ./a.out
==15047==

==15047== Conditional jump or move depends on uninitialised value(s)
==15047== at 0x4C24559: realloc (vg_replace_malloc.c:525)
==15047== by 0x400683: Vloz (test.c:29)
==15047== by 0x400725: NactiMOJE (test.c:40)
==15047== by 0x400757: main (test.c:49)
==15047==
==15047== Invalid read of size 4
==15047== at 0x400763: main (test.c:50)
==15047== Address 0x7feffffc0 is just below the stack ptr. To suppress, use: --workaround-gcc296-bugs=yes
==15047==
0 != 1

==15047==
==15047== HEAP SUMMARY:
==15047== in use at exit: 24 bytes in 3 blocks
==15047== total heap usage: 6 allocs, 3 frees, 32 bytes allocated
==15047==
==15047== LEAK SUMMARY:
==15047== definitely lost: 24 bytes in 3 blocks
==15047== indirectly lost: 0 bytes in 0 blocks
==15047== possibly lost: 0 bytes in 0 blocks
==15047== still reachable: 0 bytes in 0 blocks
==15047== suppressed: 0 bytes in 0 blocks
==15047== Rerun with --leak-check=full to see details of leaked memory
==15047==
==15047== For counts of detected and suppressed errors, rerun with: -v
==15047== Use --track-origins=yes to see where uninitialised values come from
==15047== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 4 from 4)



asi bych byt tebou nedelal ty prapodivne malloc(0)

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #12
-
0
-

To KIIV : Takže problém je v tom reallocu? To jsem si myslel. Ale nechápu, co tam je špatně. Funkci Vloz předávám adresu na pole státy. To je pole ukazatelů na MOJE a proto by se k prvkům mělo přistupovat stylem (*staty)[i][0]. A ten prvek je taky struktura MOJE a proto realokuji blok (*staty)[i][0].sousedi. Co je tedy špatně?

Děkuji

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #13
-
0
-

zkusil sem neco takoveho - akorat sem mel ponekud problem zkompilovat ten tvuj kod v GCC tak je trochu upravenej:

#include<limits.h>

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

typedef struct MOJE MOJE;

struct MOJE {
int barva;
MOJE ** sousedi;
char jmeno[65];
int id;
int pocty_sousedu;
} ;

MOJE * zk;

int Pridej(MOJE *** staty, int * pocet){
MOJE * novy = (MOJE *)malloc( sizeof(MOJE) );
if ( *staty == NULL ) {
*staty = (MOJE **) malloc( sizeof(MOJE *) );
} else {
(*staty) = (MOJE **)realloc( (*staty),(*(pocet)+1)*sizeof(MOJE *));
}

novy->pocty_sousedu = 1;
novy->barva = 1;
novy->sousedi = NULL;
(*staty)[*pocet] = novy;
*pocet += 1;
}

void Vloz(MOJE *** staty, int i, int soused){
(*staty)[i][0].sousedi = (MOJE **)realloc((*staty)[i][0].sousedi, sizeof(MOJE* )*((*staty)[i][0].pocty_sousedu+1));
(*staty)[i][0].pocty_sousedu += 1;
//(*staty)[i] = (*staty)[soused];
}

MOJE ** NactiMOJE(int * pocet){
MOJE ** staty = NULL; // (MOJE **)malloc(sizeof(MOJE *));
int x;
//printf("%X\n",staty);

Pridej(&staty, pocet);
for (x = 0; x != 1; x++){
Pridej(&staty, pocet);
Vloz(&staty, x, x-1);
}
return staty;
}

int main(int arvc, char ** argv){
MOJE ** pole;
int i, pocet = 0;

pole = NactiMOJE(&pocet);
printf("%d != 1\n\n", pole[0][0].barva);

//dealokace :-)
return 1;
}

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #14
-
0
-

Tak po celodenním programování se zdá, že semestrálka je hotová, děkuji mnohokrát za Vaši trpělivost.

Já jsem to kompiloval s g++, protože gcc mi to taky nebralo právě kvuli deklaraci té struktury, takto to je lepší, děkuji :)

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
KIIV
~ Moderátor
+43
God of flame
27. 11. 2010   #15
-
0
-

akorat tam bude spoooousta free() :) ale to uz podchytis tim valgrindem

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Blujacker
~ Moderátor
0
Grafoman
27. 11. 2010   #16
-
0
-

To KIIV : Byly potřeba jenom 4 free :-)

Odevzdal jsem to a automat to ohodnotil na 110% (tzn. že jsem prošel i bonusovým testem) :D Ještě jednou děkuji

Nahlásit jako SPAM
IP: 84.42.166.–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 15 hostů

Podobná vlákna

Odkazy — založil Jakub Sosnovec

Odkazy — založil Zelenáč

Odkazy — založil Šťouchal

Odkazy — založil to_jsem_ja

Odkazy — založil BigBear

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý