Vkládání do pole, problém s ukazateli – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Vkládání do pole, problém s ukazateli – C / C++ – Fórum – Programujte.comVkládání do pole, problém s ukazateli – C / C++ – Fórum – Programujte.com

 

Jackob
~ Anonymní uživatel
2 příspěvky
19. 4. 2015   #1
-
0
-

Ahoj, mohl by mi prosím někdo poradit, když napíšu tento kod:

#include <stdio.h>
#include <stdlib.h>
typedef struct {int *prvky; int pocet;} pole;

pole vytvoreni() {
        pole P;
        P.prvky = (int*)malloc (sizeof(int));
        P.pocet = 0;
        return P;}

int vloz_prvek(pole *P,int i){
    P->prvky=(int *) realloc(P->prvky, sizeof(int)*(P->pocet+1));
    P->prvky[P->pocet] = i;
    P->pocet +=1;
    }


void vypis(pole P) {
    int i;
        for (i = 0; i < P.pocet; i++)
        {
                printf("%d, ", P.prvky[i]);
        }
        printf("\n");
}

int odeber_prvek(pole *P,int i){
        int j;

                for ( j = 0; j < P->pocet; j++){
                       if(P->prvky[j]==i){

                        P->prvky[j]=0;			//jeste musim doresit
                        P->pocet = P->pocet -1;

                        }}}
int main()
{
  pole A, B, C;
    A=vytvoreni();
    vloz_prvek(&A,5);
    vloz_prvek(&A,12);
    vloz_prvek(&A,8);
    vloz_prvek(&A,7);
    vloz_prvek(&A,14);
    vloz_prvek(&A,20);
    printf("Pole A: \n");
    vypis(A);
    odeber_prvek(&A,20);
    vypis(A);
}

tak všechno funguje, ale potřeboval bych, aby funkce main zůstala stejná (stejné volání funkcí) , ale funkce vkládání a odebráni by jako parametr neměly ukazatel, tedy int odeber_prvek(pole P,int i) a int vloz_prvek(pole P,int i).

Zkousel jsem fuknce ve tvaru vloz_prvek(pole P,int i) volat jako vloz_prvek(A,5) a vsechny -> prepsat na . ale stejně se mi to nakonec nepodařilo, navic jsem zmenil fuknci main. Děkuji za rady.

Nahlásit jako SPAM
IP: 93.93.33.–
KIIV
~ Moderátor
+43
God of flame
19. 4. 2015   #2
-
0
-

Problem je v tom, ze kdyz udelas  pole P, tak se ta struktura zkopiruje a pak upravujes jen lokalni kopii. Nic se pak nedostane ven! Takze pokud nemuzes pouzit c++ a jeho reference, tak to nemas sanci obejit. Ne bez klicek a obezlicek.. (treba mit ve strukture pointer samo na sebe a upravovat pak puvodni strukturu)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ondrej39+1
Věrný člen
19. 4. 2015   #3
-
0
-

Bohužel to, co ty chceš, není možné udělat.

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
ingiraxo+15
Grafoman
19. 4. 2015   #4
-
0
-

#3 ondrej39
je to možný udělat.. je to v jak psal KIIV.. prostě struktůra bude mít alokaci sama na sebe 

struct Pole
{
    int* prvky;
    int pocet;
    Pole* ptr;
};


Vytvoření pole bude potom  

Pole vytvorPole()
{
    Pole p;
    p.ptr = (Pole *) malloc(sizeof(Pole));
    p.ptr->prvky = (int *) calloc(1, sizeof(int));
    p.ptr->pocet = 0;
    return p;
}


A vložení prvku 

void vlozPrvek(Pole p, int prvek)
{
    p.ptr->prvky = (int *) realloc(p.ptr->prvky, (p.ptr->pocet + 1) * sizeof(int));
    p.ptr->prvky[p.ptr->pocet++] = prvek;
}


main jsem trochu zkrátil...

int main()
{
    Pole A;
    A = vytvorPole();
    vlozPrvek(A, 5);
    vlozPrvek(A, 12);
    printf("Pole A: \n");
    vypis(A);
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ondrej39+1
Věrný člen
19. 4. 2015   #5
-
0
-

#4 ingiraxo
Tak to by mě fakt nenapadlo. Sice dost krkolomný, ale zajímavý řešení :).

Nahlásit jako SPAM
IP: 46.39.172.–
Inject all the dependencies!
PiranhaGreg0
Stálý člen
19. 4. 2015   #6
-
0
-

   

      

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

#define pridej(pole, prvek) pridejX(&pole, prvek)

typedef struct {
	int * prvky;
	int pocet;
} Pole;

void pridejX(Pole * pole, int cislo) {
	pole->prvky = realloc(pole->prvky, (pole->pocet + 1) * sizeof(int));
	pole->prvky[pole->pocet++] = cislo;
}

void vypis(Pole pole) {
	while(pole.pocet--)
		printf("%d ", *pole.prvky++);

	printf("\n");
}

int main(void) {
	Pole A = {0};

	pridej(A, 5);
	pridej(A, 7);
	pridej(A, -3);

	vypis(A);

	free(A.prvky);
	return 0;
}
Nahlásit jako SPAM
IP: 109.81.210.–
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, 35 hostů

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ý