c++ udat velkosti dvojrozmerneho pola az po deklaracii

Programovacie jazyky, rady, poradňa...
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

Zdravim,
potrebujem vytvorit maticu s nahodnym poctom stlpcov a riadkov, lenze

Kód: Vybrať všetko

int* matica = new int[a][b];
akosi nefunguje, moze tam byt len jedna premenna v [] - chcel som potom pomocou

Kód: Vybrať všetko

b=rand()%20+2;
a=(b-1)+rand()%10;
nahodne urcit velkost toho pola
ako mam udanie velkosti dvojrozmerneho pola nechat na neskor v programe?
jorg22
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1087
Registrovaný: 12 aug 2006, 20:39
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa jorg22 »

Treba trochu vediet pracovat so smernikmi.

Kód: Vybrať všetko

int** pole;

pole = new int*[num_of_rows];
for(int i = 0; i <= num_of_rows; i++)
	pole[i] = new int[num_of_column];
Tento kod robi to ze ti vytvori premennu pole ktora je typu "smernik na smernik", potom sa alokuje pamet pre smerniky ktore ukazuju na riadky matice , a v cykle kazdemu riadku alokujes pamet pre pocet stlpcov (num_of_cells).
Potom s tym mozes pracovat klasiky pole[0][0]....
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

diky moc, ale vyriesil som to inak

lenze zatial co na macu (xcode) mi to ide, tak na wine (ms visual studio) to nejde
zadanie: vytvorit nahodne velku maticu s nahodnymi cislami, zratat kolko cisel je po jej obvode a vypisat ju

Kód: Vybrať všetko

#include "stdafx.h"
#include "iostream"
#include "ctime"
#include "cstdlib"
using namespace std;
int main () 
{
	int a,b,x,y,sucet;
	int* matica = new int[a];
	srand ((unsigned)time(NULL));
	a=rand()%26+2;
	b=(a-1)+rand()%10;
	sucet=2*a+2*(b-2);
	cout << "Matica ma po obvode " << sucet << " prvkov\n";
	for (x=0; x<b; x++) 
	{
		for (y=0; y<a; y++) 
		{
			matica[a]=rand()%100;
			cout.width(a);
			cout << matica[a];
		}
		cout << endl;
	}
	delete[]matica;
    return 0;
}
prosim vas, v com je chyba? na wine mi to hadze vselijake errory, program neprebehne
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

pozri sa na Include ... ci ti tam nechyba .h neviem ako striktne to bere VisualStudio no ja to tam pisem ...
tu ti chyba medzera ? delete[]matica; ...
kvoli citatelnosti by som ti odporucal okolo znamienok =/+/- ... davat medzery je to kvoli citatelnosti

a toto skus vyhodit ked to nepotrebujes ... #include "stdafx.h" ... a ked toto nepomoze okopiruj sem errory
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

vo visual studio to h tam byt nemusi (a ked ho tam napisem, hned mi vyhodi chybu, ze taky subor nevie njast)
delete[]matica - myslim, ze medzera tam byt nema
ok, este len zacinam programovat, takze citatelnost sa naucim casom, to predsa na program vplyv nema
vymazanie toho riadku s stdafx.h nepomohlo

popravde neviem, ktore errory chces aby som ti vypisal (naozaj s tym pracujem asi po druhy krat)
mam tam nejaky build log (?), tak skusim ti nakopirovat ten

Kód: Vybrať všetko

1>------ Build started: Project: matica, Configuration: Debug Win32 ------
1>Build started 13. 11. 2011 20:52:32.
1>InitializeBuildStatus:
1>  Touching "Debug\matica.unsuccessfulbuild".
1>ClCompile:
1>  All outputs are up-to-date.
1>  matica.cpp
1>c:\documents and settings\spravca\dokumenty\visual studio 2010\projects\matica\matica\matica.cpp(12): warning C4700: uninitialized local variable 'a' used
1>ManifestResourceCompile:
1>  All outputs are up-to-date.
1>Manifest:
1>  All outputs are up-to-date.
1>LinkEmbedManifest:
1>  All outputs are up-to-date.
1>  matica.vcxproj -> C:\Documents and Settings\Spravca\dokumenty\visual studio 2010\Projects\matica\Debug\matica.exe
1>FinalizeBuildStatus:
1>  Deleting file "Debug\matica.unsuccessfulbuild".
1>  Touching "Debug\matica.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.64
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
a hned mi vyhodi tuto tabulku
Prílohy
Bez názvu.jpg
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

Kód: Vybrať všetko

   int a,b,x,y,sucet;
   int* matica = new int[a];
ak by si vedel po anglicky tak by sisi precital ze pouzivas premennu "a" bez toho ze by si ju inicializoval teda nepriradil jej ziadnu hodnotu ...
dobrym zvykom je si vsetky premmene inicializovat na zaciatku na nejaku defaultnu hodnotu ...

riesenie ... int a=0; ... ale stale chyba lebo tam mas aj logicku chybu ...
presun celu definiciu pola az za "a=rand()%26+2;" kde priradis konecne nejaku hodnotu do Acka
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

posunul som sa delej, ked som presunul tu maticu - program sa spustil ale dalsi error

momentale program vyzera takto: (edit)

Kód: Vybrať všetko

#include "stdafx.h"
#include "iostream"
#include "ctime"
#include "cstdlib"
using namespace std;
int main () 
{
	int a,b,x,y,sucet;
	srand ((unsigned)time(NULL));
	a=rand()%9+2;
	b=(a-1)+rand()%10;
	sucet=(2*a)+(2*(b-2));
	int* matica = new int[a];
	cout << "Matica ma po obvode " << sucet << " prvkov\n";
	for (x=0; x<b; x++) 
	{
		for (y=0; y<a; y++) 
		{
			matica[a]=rand()%100;
			cout.width(a);
			cout << matica[a];
		}
		cout << endl;
	}
	delete []matica;
    return 0;
}
vypis logu - ked spustim program: (edit)

Kód: Vybrať všetko

1>------ Build started: Project: matica, Configuration: Debug Win32 ------
1>Build started 13. 11. 2011 21:17:56.
1>InitializeBuildStatus:
1>  Creating "Debug\matica.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1>  All outputs are up-to-date.
1>  matica.cpp
1>ManifestResourceCompile:
1>  All outputs are up-to-date.
1>Manifest:
1>  All outputs are up-to-date.
1>LinkEmbedManifest:
1>  All outputs are up-to-date.
1>  matica.vcxproj -> C:\Documents and Settings\Spravca\dokumenty\visual studio 2010\Projects\matica\Debug\matica.exe
1>FinalizeBuildStatus:
1>  Deleting file "Debug\matica.unsuccessfulbuild".
1>  Touching "Debug\matica.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.79
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
vypis logu - ked spustim debug:

Kód: Vybrať všetko

'matica.exe': Loaded 'C:\Documents and Settings\Spravca\Dokumenty\Visual Studio 2010\Projects\matica\Debug\matica.exe', Symbols loaded.
'matica.exe': Loaded 'C:\WINDOWS\system32\ntdll.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\kernel32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\msvcp100d.dll', Symbols loaded.
'matica.exe': Loaded 'C:\WINDOWS\system32\msvcr100d.dll', Symbols loaded.
'matica.exe': Loaded 'C:\WINDOWS\system32\user32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\gdi32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\imm32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\advapi32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\rpcrt4.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\secur32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\lpk.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\usp10.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\uxtheme.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\msvcrt.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\Documents and Settings\All Users\Data aplikací\Real\RealPlayer\BrowserRecordPlugin\Chrome\Hook\rpchromebrowserrecordhelper.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f\msvcr90.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\shell32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\shlwapi.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729.4974_x-ww_d889290f\msvcp90.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\comctl32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\msctf.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\version.dll', Cannot find or open the PDB file
'matica.exe': Unloaded 'C:\WINDOWS\system32\version.dll'
'matica.exe': Loaded 'C:\WINDOWS\system32\msctfime.ime', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\ole32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\clbcatq.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\comres.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\oleaut32.dll', Cannot find or open the PDB file
'matica.exe': Loaded 'C:\WINDOWS\system32\version.dll', Cannot find or open the PDB file
The program '[3756] matica.exe: Native' has exited with code 3 (0x3).
Prílohy
Bez názvu.jpg
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

hmm mal by si prehodnotit cely algoritmus aky pouzivas v cykloch mas tiez logicku chybu ...
a aj ked tu premennu nazyvas maticou matica to nieje
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

to je mi jasne, ale bol to najjednoduchsi sposob - a zaroven jediny, ktoremu chapem ako sa dopracovat k uplne nahodnej matici
aku chybu mam v tom cykle?

uz viem

Kód: Vybrať všetko

			matica[y]=rand()%100;
			cout.width(a);
			cout << matica[y];
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

Kód: Vybrať všetko

for (y=0; y<a; y++)
      {
         matica[a]=rand()%100;
         cout.width(a);
         cout << matica[a];
      }
      cout << endl;
vypisujes stale to iste ... [y] by si mal dat ... a netusim naco pouzivas Width .... ak to chces co najjednoduchsie tak to skus zatial skaredo len medzeru pred a za cislom nejake to synchronizovanie aby to bolo pekne pod sebou mozes potom riesit ... :)
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

akurat som to nasiel - diky,
tomu width chapem a videl som to uz niekde pozite, preto sa to nebojim pouzit, ale skusim to dat prec - ci to nepomoze

edit: nepomohlo
zaujimave je ze na os x to funguje
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

Kód: Vybrať všetko

int main ()
{
   int a, b, sucet;
   srand ((unsigned)time(NULL));
   a = rand() % 9 + 2;
   b = (a - 1) + rand() % 10;
   sucet = (2 * a) + (2 * (b - 2));
   int velkostMatice = a*b;//sucet po obvode ? divne cislo
   int** matica = new int* [a];
   cout << "Matica ma po obvode " << sucet << " prvkov\n";
   for (int x = 0; x < a; x++)//pozor b vymenil za a
   {
      matica[x] = new int[b];
      for (int y = 0; y < b; y++)
      {
         matica[x][y] = rand() % 100;
         //cout.width(a);
         cout << " " << matica[x][y] << " ";
      }
      cout << endl;
   }
   system("pause");
   delete[] matica;
    return 0;
}
skus nieco taketo tymto by si mal docielit ze to bude matica ...
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

preco si a zamenil za b?
a nerozumiem tomuto riadku:
int** matica = new int* [a];
co robi ten prikaz?
dve "hviezdicky" znamenaju dve neskor inicializovane premenne?
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

lebo sami to zda byt logicka abecedna postupnost :D ale hlavne pre toto int** matica = new int* [a]; ... a nebudem tu predsa rozmyslat ako si umyt zuby cez zadok ...
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

no ano ale si neprehodil
a=rand()%9+2;
b=(a-1)+rand()%10;

takze matica by mohla mat viacej neznamych ako riadkov, co znamena, ze nema riesenie (ani zmysel)

ale dobre, aspon viem, ze v tom neni nic viac


a este raz:
int** matica = new int* [a];
co robi ten prikaz?
dve "hviezdicky" znamenaju dve neskor inicializovane premenne?
a budu riadky ci stlpce?

edit:
funguje to

lenze musim o tom napisat cely referat, nebude ti vadit, ked sa ta budem pytat na dalsie veci?

edit 2:
takze otazka:
preco mi vypisuje tu maticu vzdy s inymi rozostupmi cisel?
raz su pri sebe a inokedy sa nezmestia do riadku
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

definujes v podstate dvoj rozmerne pole ... int**... lebo int* = int[] ... takze int** = int[][] ...
* znamena ze to je pointer ... to znamena ze pointer na pointer ? int[] je vlastne len pointer na pole intov ... takze tam to je tiez pointer pointrov ? proste tam inicializujes pole new int*[] ... v ktorom budu pointre na inty cize tiez na polia ..

lebo nahodny pocet riadkov a stlpcov ... lebo nahodne cisla ... a lebo kazde cislo nema rovnaku sirku ... 100 ... zabera tri znaky a 10 zabera dva znaky ... a ked v dalsom riadku mas cisla iba ... 1 2 5 ... ktore zaberaju po jedno znaku uz to zrazu nemas pekne pod sebou ... preto tam je asi dobre pouzit ten width co ak predpokladam spravne zaruci ze to bude mat vsetko rovnaku sirku (a preto by si do toho nemal pchat nahodne cislo ale staticke jedno rovnake cislo pre vsetky ... )
mudrnudl
Expert
Expert
Používateľov profilový obrázok
Príspevky: 193
Registrovaný: 22 nov 2008, 22:09

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa mudrnudl »

ok zacinam tomu rozumiet
width pouzivam ale pri kazdom spusteni su rozostupy ine, nechapem preco
ale teraz k dolezitejsiemu
tento prikaz:

Kód: Vybrať všetko

int** matica = new int* [b];
mozem rozdelit takto?

Kód: Vybrať všetko

int** matica;   //vytvorenie premennej matica typu pointer na pointer, v ktorom budu cele cisla
matica = new int* [b]  //co robim v tomto riadku? prosim v celej vete, nie heslovito
konkretne ma matie ta hviezdicka tam, lebo v tomto riadku uz pouzita nie je, preco?

Kód: Vybrať všetko

matica[x] = new int[a];
co robi ten prikaz?

vopred diky za trpezlivost
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa c-ice »

int** matica; //definicia dvojrozmerneho pola v podstate aj tak sa to da chapat// alej aj tak ak si to ty napisal v podstate
matica = new int* ; //dynamicky alokujes novy kus pamäte z haldy kde budes mať b pointrov na typ int* ... alebo aj inak new ti vracia pointer na zaciatok bloku pamäte kde budu ulozene adresy na int* ... ta hviezdicka preto lebo keby ju nedas tak ti to vrati iba pointer na zaciatok bloku kde su ulozene jednotlive cisla cize jednorozmerne pole int* a ty to ukladas do int** co by bola chyba ...

matica[x] = new int[a]; // tu uz pristupis ku jednotlivej polozke toho pola a ta polozka je typu int* cize jednorozmerne pole takze tu to pole dynamicky alokujes pomocou operatora new a pointer na toto pole ulozis do polozky matica[x] ... :)

ze ako pridam aj nejaky obrazok ci to nejak pomoze tak to uz neviem ...
Prílohy
zeAkozePole.png
johny3212
Star
Star
Používateľov profilový obrázok
Príspevky: 532
Registrovaný: 17 feb 2008, 19:56
Bydlisko: Terchova
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa johny3212 »

mudrnudl:
Co keby si sa skusil riadne nieco naucit sam podla dakej knihy? Ty sa tu pytas totalne somariny, ktore by sa mal programator naucit sam z dakej literatury a mal by ich vediet, ty sa pytas na totalne zaklady, nastuduj si to odnekial, ak chces kodit.
Po druhe, ak to nemas na domacu ulohu, ze musis mat dvojrozmernu maticu podla zadania, tak to vobec nepouzivaj. Pouzi klasicke jednorozmerne pole, tak sa rataju vektory a matice v realnych programoch, dvojrozmerne polia sa nepouzivaju, nevidim ani dovod, preco by sa mali.
harrison314
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 8223
Registrovaný: 27 máj 2009, 20:42
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: c++ udat velkosti dvojrozmerneho pola az po deklaracii

Príspevok od používateľa harrison314 »

johny3212:
Teraz je toho tu plno, kazdi druhi prispevok je typu "Ako spocitam dve cisla v Jave?", " Ako zaokruhlim cislo 2.5 na 2.50 v C# ?" alebo 15-rocne deti mudruju, o tom aky jazyk je najlepsi na vyucbu programovania. Ja uz pomali zacinam stracat nervy, mam pocit ze dnesna mlada generacia jecim dalej blbsia a blbsia.
Napísať odpoveď