Chtěl bych se zeptat jak se dá odstranit prvek pole v C.A také bych chtěl poprosit jestli by se někdo nepodíval na můj zdroják s C začínám a dělám program pro práci s množinami a u sjednoceni ,pruniku a rozdilu mi to vypisuje uplne nesmyslne hodnoty.
Fórum › C / C++
Odebrání prvku pole v C,problem s vypisem pole
Prvek z pole se odstraní tak, že všechny prvky za ním se přesunou o jedno místo k začátku a zmenší se nějaké počítadlo počtu volných prvků.
Alternativně je možné někde zvlášť udržovat nějaká data popisující, které prvky jsou platné a které ne. Nebo do neplatného prvku přiřadit speciální hodnotu.
Jinak v tomto programu vidím několik problémů:
1. Nejde přeložit. Vypadá to (minimálně podle koncovky souboru a podle void ve funkcích bez parametrů) jako C, ale např. na řádku 27 je delete, což je C++
2. Ve funkci main se volá opět funkce main. To je chyba. Jednak se to vůbec nemá dělat a za druhé je tam zbytečná rekurze.
Celý switch by měl jít do nějakého cyklu, klidně nekonečného (např. for(;;) ) a na nějakou volbu z menu vyskočit ven (buď break nebo rovnou return 0).
3. Řádky 13, 43, 60, 100: parametr funkce je pole s proměnnou délkou. To sice projde v gcc, ale není to standardní a není to přenositelné. Pokud je potřeba předat pole proměnlivé délky, předává se obvykle ukazatel na první prvek a v nějakém dalším parametru délka.
4. Zbytečně se tam používají globální proměnné i, j, k. Cykly ve funkcích nepoužívají lokální proměnné.
Pro začátek bych zkusil udělat ta pole s fixní velikostí, zrušit globální proměnné a rozchodit to v této verzi.
Až to bude fungovat, tak udělat ta pole dynamická. To znamená, že se na začátku zjistí, jak to pole má být dlouhé a pak se dynamicky naalokuje potřebná paměť funkcí malloc.
n prvkové pole, na které ukazuje ukazatel ptr, mažeme k-tý prvek, každý prvek je široký b bajtů
memmove(ptr + (k - 1) * b, ptr + k * b, (n - k) * b);
int i,j,k;
pocet=0;
for(k=0;k<n1;k++){
c[k]=a[i];
i++;}
for (j=0;j<n2;j++){
if (b[j]==a[i]){
i++;
pocet++;}
else {
k=n1+1;
c[k]=b[j];
k++;
i++;
}
}
printf("Vysledkem sjednoceni mnozin A a B je mnozina C: ");
for(k=0;k<(n1+n2-pocet);k++){
printf("%d ",c[k]);
printf("\n\n");
testuju ted neco na tom principu ... zda se je nejakej limit pro rekurzi... dostanu maximalne neco kolem 43tisic zanoreni ...(43396 ci 7)
zabere to jen neco kolem 4MB v ram
#include <stdio.h>
#include <stdlib.h>
int zanoreni = 0;
int main(int a, char ** b)
{
printf("%d\n", zanoreni);
if ( ++zanoreni < 30000 ) {
main(a, b);
} else {
system("pause");
}
return EXIT_SUCCESS;
}
ale kdyz tam dam neco kolem 43300 tak uz to nefunguje spravne
ale mozna to bude zavisly na systemu :D
To KIIV : tak to pochybuju, že by někdo tolikrát opakoval main, v které by uživatel něco zadával :smile1: .......takže to nevadí ničemu jinýmu než "ubírání" paměti ??.......pokud jo, tak nevím, jestli stojí zato respektovat nějaký předpisy (pokud to je jen tak nějaká malá soukromá aplikace): "že se main nemá rekurzivně volat" ??
To MaS : no kazdopadne bych to nenasadil na nejake zpracovani treba souboru...
krom toho se da do progamu soubor i presmerovat... takze to ze by se nekdo nevypisoval s tolika hodnotama muze i hrozit...
treba bude chtit zpracovat 30milionu kodu a kazdej na jednom radku... tady by s rekurzi tezce shorel :D
obzvlaste kdyz by se najednou objevila verze se 100000000 kodama :D
u rekurze taky prave hrozi ze si pak zacne clovek prepisovat vlastni kod... promenny a tak...
asi si umis predstavit neco jako "seq 100000 | ./program_s_rekurzi"
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Odebrání lambda funkce z pole — založil ingiraxo
Vytvoří asociativní pole, obsahující v prvním prvku jméno, v druhém… — založil lokomotiva
Spojový seznam - odebrání prvku/prvků s maximální hodnotou — založil arden89
Pole ovládacích prvků??? — založil Pepa Štych
Ukládání prvků do pole — založil Sprinter
Moderátoři diskuze