Přístup k prvkům dynamického pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přístup k prvkům dynamického pole – C / C++ – Fórum – Programujte.comPřístup k prvkům dynamického pole – C / C++ – Fórum – Programujte.com

 

pidgin0
Návštěvník
8. 2. 2010   #1
-
0
-

Ahoj, mám takový malý ale velký problém, ale malý problém.
Progáme, ketý si píšu,nemá sloužit k ničemu jinému než abych se něco naučil. Mám dynamicky vytvořené pole. Ale nedaří se mi přistupovat k prvkům pole, Když změním jeden, tak se změní všechny.Ukázka toho jak jsem pole vytvořil a jak k prvkům pole přistupuji vypadá takto:



cout << "Zadejte velikost pole: ";
cin >> N;
sizeP = sizeof(int);
P = (TPole*) malloc(N * sizeP);
VelP = N;
for(i=0; i<=VelP; i++) {
*(P[0]+sizeP)=i;
}

a pro úplnost pole je deklarované takto:


typedef
int TPole[0];

TPole* P;

Mohla by mi nějaká dobrá duše říci co dělám špatně.
Možná pole špatně deklaruji. Možná k němu špatně přistupuji. Možná je tocelé špatně.
Má to i jiné mouchy, někdy to vyhodí přetečení a také si nejsem jist jestli příkaz free, který je v kompletním zdrojovém kódu opravdu uvolní paměť, neboť když ho použiji a přitom sleduji kolik paměti program bere, tak nevidím že by se paměťové nároky zmenšili
Přikládám i celý zdrojový soubor, kteý jde zkompilovat.
Díky moc

Nahlásit jako SPAM
IP: 83.208.170.–
crAzY^
~ Moderátor
+10
Grafoman
8. 2. 2010   #2
-
0
-

trošku sem ti to upravil, ale je to teda prasecky napsanej kód :), ale takhle to už funguje...

#include <cstdlib>

#include <iostream>
#include <string>
using namespace std;

typedef
int TPole;

string vstup;
int loop, uvod;
int i, N, VelP, sizeP;
TPole* P;

void help() {
cout << endl;
cout << "výpis polem alokovaných adres = allocated" << endl;
cout << "uvolnění paměti = free" << endl;
cout << endl;
}

void menu() {
cout << endl;
cout << "MENU" << endl;
cout << "----" << endl;
cout << "1. Vytvořit pole" << endl;
cout << "2. Vypsat velikost pole" << endl;
cout << "3. Vypsat pole" << endl;
cout << "4. Zobraz prvek" << endl;
cout << "5. VloĹľ prvek" << endl;
cout << endl;
}

void smycka(){
while (loop != 0) {

vstup = "";

if(uvod == 1) {
cout << endl;
cout << "Menu = menu, nápověda = help, " << endl;
cout << "------------------------------" << endl;
uvod = 0;
}

cout << "Volba programu: ";
cin >> vstup;

if(vstup == "konec") {
loop = 0;
}

else if(vstup == "menu") {
menu();
}

else if(vstup == "help") {
help();
}

else if(vstup == "1") {
if(VelP == 0) {
cout << "Zadejte velikost pole: ";
cin >> N;
sizeP = sizeof(int);
P = (TPole*) malloc(N * sizeP);
VelP = N;
for(i=0; i<=VelP; i++) {
*(P+i)=i;
}
cout << "Pole o velikosti " << VelP <<" bylo vytvořeno" << endl;
}
else {
cout << "Pole už je vytvořeno a má velikost " << VelP << endl;
}
}

else if(vstup == "2") {
cout << "Velikost pole je " << VelP << endl;
}

else if(vstup == "3") {
if(VelP > 0) {
for (i=0; i <= VelP; i++) {
cout << *(P+i) << " ";
}
cout << "Konec výpisu" << endl;
}
}

else if (vstup == "4") {
i = 0;
cout << "Zadej prvek: ";
cin >> i;
cout << *(P+i);
cout << endl;
}

else if(vstup == "5") {
cout << "Zadej ÄŤĂ­slo: ";
cin >> N;
cout << "Kam cislo vlozit (index pole): ";
cin >> i;
*(P+i) = N;
cout << "vloĹľeno" << endl;
}

else if(vstup == "allocated") {
if(VelP > 0) {
for(i=0; i <=VelP;i++) {
cout << " [ " << long(P[i]) << " ] "; /* 4 moĹľnosti:
1) P[i]
2) &P[i]
3) long(P[i])
4) long(&P[i])
ALE VŠECHNY POLOŽKY POLE JSOU STEJNÉ ČÍSLA ????? CO S TÍM ??
*/
if((i % 5) == 0) {
cout << endl;
}
}
}
}

else if (vstup == "free") {
free(P);
cout << "Příkaz free byl vykonán" << endl;
}

else {
cout << "Neznámý příkaz!" << endl;
}
}
}

int main() {
loop = 1;
uvod = 1;
VelP = 0;


smycka();
return 0;
}

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
pidgin0
Návštěvník
8. 2. 2010   #3
-
0
-

To crAzY^ : díky moc, sorry, musel jsem pryč a teď až jsem tady, proto reaguji tak pozdě. opravdu děkuji. a kód je hroznej, ale teprve se učím tak se to dá odpustit, v pascalu to napíšu ale to C je pro mě trochu tvrdší ořech.
ještě jednou díky moc

Nahlásit jako SPAM
IP: 83.208.170.–
pidgin0
Návštěvník
9. 2. 2010   #4
-
0
-

To crAzY^ : Ahoj můžu mít ještě jeden dotaz? Jak by jsem měl postupovat kdyby jsem chtěl touto metodou vytvořit dvourozměrné pole? Jestli to vůbec touto metodou jde?

Nahlásit jako SPAM
IP: 83.208.170.–
KIIV
~ Moderátor
+43
God of flame
9. 2. 2010   #5
-
0
-

popravde sem vubec nepochopil na co ten typedef
jednorozmerne pole intu: int * pole;
dvojrozmerne: int ** pole;
ale musi se nejprve alokovat pole ukazatelu a pak jednotlive radky..


nejjednodussi je ale pouzit jednorozmerne pole a radky budou pokazdy jen cast toho pole.. staci osetrit spravnou indexaci

Nahlásit jako SPAM
IP: 77.237.136.–
Program vždy dělá to co naprogramujete, ne to co chcete...
pidgin0
Návštěvník
9. 2. 2010   #6
-
0
-

díky, ten typedef je tam jen proto abych se ucil s nim pracovat, abych vedel jak se používá, ber to tak že se jen učím a zkouším si vymýšlet věci co naprogramovat, žádný praktický význam to nemá, i když učit se je praktické, ne?jinak díky moc za reakci, vyzkouším jestli to zvládnu a pak sem hodím co jsem vytvořil:-)

Nahlásit jako SPAM
IP: 83.208.170.–
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, 12 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ý