program

C,C++,C#

Moderátori: psichac, Moderátori

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

program

Príspevok od používateľa JuroOO » 13 Jan 2014, 22:57

Zdravím, mohli by ste my pomoct s programom... funguje na 99%, jedíne čo nejdeje že do vystup.txt sa nazapíše všetko to čo do konzoly ale len to čo je v main()..keby ste mys tým mohli pomoct....
Dalej nejaké nápady na zlepšenie programu(neviem čo s tým parA,nepA...., to my funguje len ak to dám ako globálne premené čo moc nechcem používať....kam inam by som to mohol dať?)

Kód: Vybrať všetko

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>                       
using namespace std;
int klaA,zapA=0,parA=0,nepA=0,klaB=0,zapB=0,parB=0,nepB=0,klaC=0,zapC=0,parC=0,nepC=0;


bool otvorenieInsuboru(){
ifstream insubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");    
bool inopen=false;      
if (insubor. is_open()){           
	inopen=true;
	}
return inopen;
}


void nacitajmaticeAB (int **maticaA,int **maticaB,int m,int n){     
ifstream insubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");            
 ofstream outsubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vystup.txt");  
 insubor.open("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");
insubor >> m >> n;                                                   
cout<<"nacitana matica A"<<endl;                         
outsubor <<"nacitana matica A"<<endl;                 
maticaA = new int*[m];
for(int i = 0; i < m; i++) {            
   maticaA[i] = new int[n];
	  for(int j = 0; j < n; j++){            
		 insubor >> maticaA[i][j];                 
			 if (maticaA[i][j] >0) {klaA=klaA+1;}     
				else {zapA=zapA+1;}
			 if (abs(maticaA[i][j])%2==0) {parA=parA+1;}         
				else {nepA=nepA+1;}
cout.width(2);                                         
cout<<maticaA[i][j]<<"\t";                                  
outsubor .width(2);                                   
outsubor <<maticaA[i][j]<<"\t";                           
	};  
	  outsubor <<endl;                                    
	  cout<<endl;                                           
}
cout<<endl;
cout<<"nacitana matica B"<<endl;                        
outsubor <<"nacitana matica B"<<endl;                 
maticaB = new int*[m];
for(int i = 0; i < m; i++) {            
   maticaB[i] = new int[n];
	  for(int j = 0; j < n; j++){            
		 insubor >> maticaB[i][j];                
			 if (maticaB[i][j] >0) {klaB=klaB+1;}      
				else {zapB=zapB+1;}
			 if (abs(maticaB[i][j])%2==0) {parB=parB+1;}         
				else {nepB=nepB+1;}
cout.width(2);                                         
cout<<maticaB[i][j]<<"\t";                                  
outsubor .width(2);                                   
outsubor <<maticaB[i][j]<<"\t";                           
	};  
	  outsubor <<endl;                                     
	  cout<<endl;                                           
		}
cout<<endl;
insubor.close();
}
void rozdielmaticAB(int **maticaA,int **maticaB,int **maticaC,int m,int n){   
ifstream insubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");           
 ofstream outsubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vystup.txt");          
insubor >> m >> n;                                                 
maticaA = new int*[m];
for(int i = 0; i < m; i++) {            
   maticaA[i] = new int[n];
	  for(int j = 0; j < n; j++){             
		 insubor >> maticaA[i][j];    
	  }
}
 maticaB = new int*[m];
for(int i = 0; i < m; i++) {           
   maticaB[i] = new int[n];
	  for(int j = 0; j < n; j++){             
		 insubor >> maticaB[i][j];      
	  }
}
cout<<"Rozdiel matic A a B"<<endl;                      
outsubor <<"Rozdiel matic A a B"<<endl;
maticaC = new int*[m];
for(int i = 0; i < m; i++) {                         
	maticaC[i] = new int[n];						
		for(int j = 0; j < n; j++){                     
			maticaC[i][j]=maticaA[i][j]-maticaB[i][j];
				 if (maticaC[i][j] >0) {klaC=klaC+1;}               
					else {zapC=zapC+1;}
				 if (abs(maticaC[i][j])%2==0) {parC=parC+1;}             
					else {nepC=nepC+1;}
cout.width(2);                                              
cout<<maticaC[i][j]<<"\t";                       
outsubor .width(2);                                   
outsubor <<maticaC[i][j]<<"\t";                    
	};
	   cout<<endl;                                    
	   outsubor <<endl;                               
	}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{   
	ifstream insubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");            
    ofstream outsubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vystup.txt");         
	int **maticaA=NULL;
	int **maticaB=NULL;
	int **maticaC=NULL;
	int m;
	int n;
	otvorenieInsuboru();
	if (otvorenieInsuboru()==true){;} else {cout<<"nepodarilo sa otvorit vstupny subor"<<endl;system ("pause");}
	insubor >> m >> n;        
	nacitajmaticeAB(maticaA,maticaB,m,n);
	rozdielmaticAB(maticaA,maticaB,maticaC,m,n);
	outsubor<<endl;                              
	outsubor<<"Matica A: kladnych="<<klaA<<", zapornych="<<zapA<<", parnych="<<parA<<", neparnych="<<nepA<<endl;                                 
	outsubor<<"Matica B: kladnych="<<klaB<<", zapornych="<<zapB<<", parnych="<<parB<<", neparnych="<<nepB<<endl;                                
	outsubor<<"Matica A-B: kladnych="<<klaC<<", zapornych="<<zapC<<", parnych="<<parC<<", neparnych="<<nepC<<endl;                               
	cout<<"Matica A: kladnych="<<klaA<<", zapornych="<<zapA<<", parnych="<<parA<<", neparnych="<<nepA<<endl;                                    
	cout<<"Matica B: kladnych="<<klaB<<", zapornych="<<zapB<<", parnych="<<parB<<", neparnych="<<nepB<<endl;                                     
	cout<<"Matica A-B: kladnych="<<klaC<<", zapornych="<<zapC<<", parnych="<<parC<<", neparnych="<<nepC<<endl;                                
	return 0;
}

0

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: program

Príspevok od používateľa boban » 13 Jan 2014, 23:25

myslim ze to bude koli tomu ze viac krat otvaras subor na zapis. Mal by si mat jeden stream do ktoreho to budes vkladat. urob to napr. ako globalnu premennu.
0

Používateľov profilový obrázok
BFX
Ultimate člen
Ultimate člen
Príspevky: 2506
Dátum registrácie: 04 Sep 2013, 19:41
Bydlisko: Košice
Vek: 50

Re: program

Príspevok od používateľa BFX » 13 Jan 2014, 23:34

resp mal by si tam mat jednu prmennu, kde to ukladas a az na konci to poslat na obrazovku aj do streamu, ktory ukadas na disk.
V takom pripade mas istotu ze to co mas na obrazovke mas aj v subore.
0
“Nice looking” circuit construction doesn't always equate to good circuit performance.
http://www.arrl.org/files/file/Product% ... pter_1.pdf
Na predaj: p-bfx-predava-kto-zavaha-prerobi-t41148.html

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: program

Príspevok od používateľa JuroOO » 13 Jan 2014, 23:59

tak dal som to ako globalnu premenu, z funkcii a z mainu zom to vymazal. Do konzoly vypíše,, nacitana matica A,, nabehne chyba debug error invalid alocation size 425646444995 bytes


Ak ich nechám ako golab.premenne a aj v maine tak to ide ale opat do suboru zapiše len to čo je v maine(do konzoly všetko) a nefunguje rozdiel matic, maticu a-b vypýše ako samé nuly

co s tým??
0

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: program

Príspevok od používateľa JuroOO » 14 Jan 2014, 14:42

:(
0

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: program

Príspevok od používateľa boban » 14 Jan 2014, 17:16

postni upraveny program

malo by to vyzerat zhruba takto:

Kód: Vybrať všetko

#include <iostream>
#include <fstream>

using namespace std;

ofstream file;

int main ()
{
	//otvorenie suboru na zapis
	file.open( "test.txt", ofstream::out );

	//kontrola ci sa podarilo otvorit subor
	if ( !file.is_open() )
	 {
	    cout << "Nepodarilo sa otvorit subor!" << endl;
	    return 1;
	 }

	//zapis do suboru
	file << "test" << endl;
	//...

	//zavretie suboru
	file.close();

	return 0;
}
0

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: program

Príspevok od používateľa JuroOO » 14 Jan 2014, 20:32

Ked použijem funkciu rozdielmaticAB, tak program pri tej funkcii skolabuje, aj ju nezavolám tak to ide a aj to vystupu sa zapíše všetko

Kód: Vybrať všetko

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <cmath>                       //knižnica pre použitie funkcie abs
using namespace std;
int klaA,zapA=0,parA=0,nepA=0,klaB=0,zapB=0,parB=0,nepB=0,klaC=0,zapC=0,parC=0,nepC=0;
ifstream insubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");           
ofstream outsubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vystup.txt");  

void nacitajmaticeAB (int **maticaA,int **maticaB,int m,int n){     
insubor >> m >> n;                                                   //načítanie zo vstupného súboru hodnoty m a n (rozmery matice)
cout<<"nacitana matica A"<<endl;                         
outsubor <<"nacitana matica A"<<endl;                 
maticaA = new int*[m];
for(int i = 0; i < m; i++) {            //cyklus od 0 po m, pridelenie indexov 0-m
   maticaA[i] = new int[n];
	  for(int j = 0; j < n; j++){             //cyklus od 0 po n, pridelenie indexov 0-n
		 insubor >> maticaA[i][j];                 
			 if (maticaA[i][j] >0) {klaA=klaA+1;}      //podmienka na počet kladných a záporných hodnot
				else {zapA=zapA+1;}
			 if (abs(maticaA[i][j])%2==0) {parA=parA+1;}         //podmienka na počet párnych a nepárnych hodnot
				else {nepA=nepA+1;}
cout.width(2);                                         
cout<<maticaA[i][j]<<"\t";                                  
outsubor .width(2);                                   
outsubor <<maticaA[i][j]<<"\t";                          
	};  
	  outsubor <<endl;                                     
	  cout<<endl;                                           
}
cout<<endl;
cout<<"nacitana matica B"<<endl;                        
outsubor <<"nacitana matica B"<<endl;                 
maticaB = new int*[m];
for(int i = 0; i < m; i++) {            //cyklus od 0 po m, pridelenie indexov 0-m
   maticaB[i] = new int[n];
	  for(int j = 0; j < n; j++){             //cyklus od 0 po n, pridelenie indexov 0-n
		 insubor >> maticaB[i][j];                
			 if (maticaB[i][j] >0) {klaB=klaB+1;}      //podmienka na počet kladných a záporných hodnot
				else {zapB=zapB+1;}
			 if (abs(maticaB[i][j])%2==0) {parB=parB+1;}         //podmienka na počet párnych a nepárnych hodnot
				else {nepB=nepB+1;}
cout.width(2);                                        
cout<<maticaB[i][j]<<"\t";                                  
outsubor .width(2);                                   
outsubor <<maticaB[i][j]<<"\t";                           
	};  
	  outsubor <<endl;                                    
	  cout<<endl;                                           
		}
cout<<endl;
}



void rozdielmaticAB(int **maticaA,int **maticaB,int **maticaC,int m,int n){   
insubor >> m >> n;                                                   //načítanie zo vstupného súboru hodnoty m a n (rozmery matice)
maticaA = new int*[m];
for(int i = 0; i < m; i++) {            //cyklus od 0 po m, pridelenie indexov 0-m
   maticaA[i] = new int[n];
	  for(int j = 0; j < n; j++){             //cyklus od 0 po n, pridelenie indexov 0-n
		 insubor >> maticaA[i][j];    
	  }
}
 maticaB = new int*[m];
for(int i = 0; i < m; i++) {            //cyklus od 0 po m, pridelenie indexov 0-m
   maticaB[i] = new int[n];
	  for(int j = 0; j < n; j++){             //cyklus od 0 po n, pridelenie indexov 0-n
		 insubor >> maticaB[i][j];      
	  }
}
cout<<"Rozdiel matic A a B"<<endl;                      
outsubor <<"Rozdiel matic A a B"<<endl;
maticaC = new int*[m];
for(int i = 0; i < m; i++) {                         //cyklus od 0 po m, pridelenie indexov 0-m
	maticaC[i] = new int[n];						
		for(int j = 0; j < n; j++){                     //cyklus od 0 po n, pridelenie indexov 0-n
			maticaC[i][j]=maticaA[i][j]-maticaB[i][j];
				 if (maticaC[i][j] >0) {klaC=klaC+1;}                //podmienka na počet kladných a záporných hodnot
					else {zapC=zapC+1;}
				 if (abs(maticaC[i][j])%2==0) {parC=parC+1;}             //podmienka na počet párnych a nepárnych hodnot
					else {nepC=nepC+1;}
cout.width(2);                                               
cout<<maticaC[i][j]<<"\t";                         
outsubor .width(2);                                  
outsubor <<maticaC[i][j]<<"\t";                     
	};
	   cout<<endl;                                     
	   outsubor <<endl;                                 
	}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{  

	int **maticaA=NULL;
	int **maticaB=NULL;
	int **maticaC=NULL;
	int m;
	int n;
	ifstream insubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vstup.txt");           
    ofstream outsubor("C:\\Users\\JURO\\Desktop\\Zadanie\\vystup.txt");  
	insubor.open( "vstup.txt" );
	outsubor.open( "vystup.txt" );
	if ( !insubor.is_open() ) {
	cout << "Nepodarilo sa otvorit vstupny subor!" << endl;
	system ("pause");
	}
	insubor >> m >> n;        
	nacitajmaticeAB(maticaA,maticaB,m,n);
	rozdielmaticAB(maticaA,maticaB,maticaC,m,n);
	outsubor<<endl;                              
	outsubor<<"Matica A: kladnych="<<klaA<<", zapornych="<<zapA<<", parnych="<<parA<<", neparnych="<<nepA<<endl;                                 
	outsubor<<"Matica B: kladnych="<<klaB<<", zapornych="<<zapB<<", parnych="<<parB<<", neparnych="<<nepB<<endl;                                
	outsubor<<"Matica A-B: kladnych="<<klaC<<", zapornych="<<zapC<<", parnych="<<parC<<", neparnych="<<nepC<<endl;                                
	cout<<"Matica A: kladnych="<<klaA<<", zapornych="<<zapA<<", parnych="<<parA<<", neparnych="<<nepA<<endl;                                     
	cout<<"Matica B: kladnych="<<klaB<<", zapornych="<<zapB<<", parnych="<<parB<<", neparnych="<<nepB<<endl;                                     
	cout<<"Matica A-B: kladnych="<<klaC<<", zapornych="<<zapC<<", parnych="<<parC<<", neparnych="<<nepC<<endl;    
	insubor.close();
	outsubor.close();
	return 0;
}
0

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: program

Príspevok od používateľa JuroOO » 14 Jan 2014, 21:57

Kde može byt chyba?
0

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: program

Príspevok od používateľa boban » 15 Jan 2014, 17:09

No pravdupovediac neviem presne ale nepaci sa mi viac veci:
1. Preco toto nie su lokalne premenne (int **maticaA,int **maticaB,int **maticaC,int m,int n), ked nimi dostavas nezmyselne hodnoty (NULL), to je absolutne nezmyselne si to predavat parametrom
2. ifstream by nemal byt globalny, mala by mat kazda funkcia svoj lokalny. Totizto predpokladam ze zo suboru nacitavas vzdy tu istu maticu, ked si to otvoris v jednom streame a nacitas pointer bude ukazovat na koniec suboru a v druhej funkcii uz nenacitas nic. (asi koli tomu to pada)
3. je nezmyselne nacitavat tie matice v kazdej funkcii odznova, pretoze sa ti tie matice nemenia a zbytocne to zabera pamat, osobne by som v maine otvoril ifstream nacital matice a potom predaval parametrom dalsim funkciam pr.:

Kód: Vybrať všetko

void rozdielAB( maticaA, maticaB, m, n )
{
  //uz mas v maticiA a maticiB hodnoty 
  //prevadzas vypocet
}
main()
{
  ifstream insubor("..../vstup.txt");
  insubor >> m >> n;                                                   //načítanie zo vstupného súboru hodnoty m a n (rozmery matice)
  maticaA = new int*[m];
  for(int i = 0; i < m; i++) {            //cyklus od 0 po m, pridelenie indexov 0-m
   maticaA[i] = new int[n];
     for(int j = 0; j < n; j++){             //cyklus od 0 po n, pridelenie indexov 0-n
       insubor >> maticaA[i][j];   
     }
   }
  //volas funkciu 
  rozdielAB( maticaA, maticaB, m, n );
  
  //treba uvolnit pamat 
  for( int i = 0; i < m; i++  )
     delete [] maticaA[ i ];

  delete [] maticaA;
}
4. Neuvolnujes pamat. Pr. vyssie delete [] poiter. vsetko co si naalokoval s new musis uvolnit s delete. Skus to upravit, ked to nepojde tak opat posli kod.
0

JuroOO
Stály člen
Stály člen
Príspevky: 225
Dátum registrácie: 02 Dec 2011, 12:59
Bydlisko: Trnava

Re: program

Príspevok od používateľa JuroOO » 15 Jan 2014, 20:47

nakoniec som to spravil bez funkcii, všetko som dal do mainu a funguje to

ale mohol by si my vysvetlit čo robí toto:

int **maticaA,
insubor >> m >> n;
maticaA = new int*[m];
for(int i = 0; i < m; i++) {
maticaA = new int[n];
for(int j = 0; j < n; j++){
insubor >> maticaA[j];

Teda viem že to postupne načítava tu maticu ale tie smerníky my nie sú jasné.. Keby si mohol riadok po riadku povedať čo to robí
0

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: program

Príspevok od používateľa boban » 15 Jan 2014, 21:36

//zadeklarujes pointer dvojrozmernej matice - je to ukazatel do pamate
int **maticaA,
//zo suboru sa vyberu 2inty a vlozia do premennych
insubor >> m >> n;
//dvojrozmerna matica sa sklada z pola (co je vpostate stlpec), v ktorom su ukazatele na dalsie polia (tie tvoria riadky a su v nich hodnoty)
//preto alokujes do ** pole pointrov (ukazatelov na dalsie polia), bude ich tolko polko mas riadkov
maticaA = new int*[m];
//potom postupne pre kazdy riadok naalokujes pamat velku podla poctu stpcov, do nej uz vkladas hodnoty
for(int i = 0; i < m; i++) {
maticaA = new int[n];
for(int j = 0; j < n; j++){
insubor >> maticaA[j];

vsetko co naalokujes musis aj uvolnit, pretoze takato pamat sa ti neuvolni skoncenim funkcie, uvolni ju az OS ked ti skonci program, zbytocne to zabera pamat.
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: program

Príspevok od používateľa peterple » 15 Jan 2014, 22:08

hmm nejako tomuto neviem prísť na chuť.
Podľa mňa zbytočne plýtvaš pamäťou, dajme tomu že m=1000000 a n=2. Na miesto pre ukladanie int potrebuješ 1000000*2*sizeof(int) a na tie ukazatele 1000000*sizeof(int *).
V prípade že to bude 64bitová aplikácia, tak zhltneš ten istý objem pamäte na zbytočné ukazatele, ako na užitočné data.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: program

Príspevok od používateľa boban » 15 Jan 2014, 22:16

jasne ked predom vie kolko ma riadkov a stlpcov dalo by sa to mapovat do jedneho pola, ale myslim ze toto nie je program ktory by to potreboval, zjavne je pre pochopenie pointrov a prace s pamatou...
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: program

Príspevok od používateľa peterple » 15 Jan 2014, 22:34

Nemyslím si že z takto urobeného príkladu to pochopí. Veď keby si to aj povedzme krokoval. Tak neviem, neviem či mu to bude nejako jasnejšie, čo sa tam vlastne deje. Myslím si že v prvom rade by mal pochopiť čo je:

Kód: Vybrať všetko

#define M 10
#define N 20
int matica[M][N];
že to nie je nič iného len kus pamäte začínajúcej na nejakej adrese, ktorá je veľká M*N*sizeof(int). A potom môže skúšať nejako sa v nej pohybovať za pomoci ukazateľa.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
boban
Stály člen
Stály člen
Príspevky: 137
Dátum registrácie: 03 Jún 2010, 00:00
Bydlisko: po

Re: program

Príspevok od používateľa boban » 15 Jan 2014, 23:37

tak to je uz ina vec ako pochopit pracu s pointrom prip. maticou, on prisiel s takym riesenim tak predpoklad bol ze pointre ovlada, ale urcite sa zide aj takto dynamiky naalokovane pole ked nebude vediet kolko bude napr riadkov atd...
0

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: program

Príspevok od používateľa anonymousCoward » 16 Jan 2014, 07:26

peterple napísal:

Kód: Vybrať všetko

#define M 10
#define N 20
int matica[M][N];
... to nie je nič iného len kus pamäte začínajúcej na nejakej adrese, ktorá je veľká M*N*sizeof(int). A potom môže skúšať nejako sa v nej pohybovať za pomoci ukazateľa. ...
Staticky a dynamicky alokovane viacrozmerne polia v C(++) sa indexuju rovnako; z hladiska programatora medzi nimi v tomto nie je rozdiel.
Pole matica nie je pole o M*N prvkoch typu int ktore sa nachadzaju v pamati za sebou. Je to pole ukazatelov (pocet M) na polia int-ov velkosti N. Cize, v 'jednom kuse' je len prva cast pola ((int*) matica[M]); jeho prvky uz ale mozu ukazovat na uplne ine kusky pamate, rozhadzane kade-tade:
Prílohy
2D pole. Vlavo je 'pole poli' (prvy index), ktoreho prvky ukazuju na polia int-ov (druhy index).
2D pole. Vlavo je 'pole poli' (prvy index), ktoreho prvky ukazuju na polia int-ov (druhy index).
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: program

Príspevok od používateľa peterple » 16 Jan 2014, 20:09

si si istý?
Prílohy
pole.png
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

anonymousCoward
Stály člen
Stály člen
Príspevky: 150
Dátum registrácie: 12 Máj 2013, 11:09
Bydlisko: KE

Re: program

Príspevok od používateľa anonymousCoward » 16 Jan 2014, 21:13

Bol som si isty, ale mylil som sa :)
Z nejakeho dovodu mi nedoslo, ze povodny kod, a kod z Tvojho navrhu pouzivaju dve odlisne veci.

Totiz, C/C++ garantuje, ze viacrozmerne polia, u ktorych su v case alokacie zname rozmery v type (nanajvys chyba prvy rozmer, 'pocet riadkov') budu alokovane v jednom bloku, s prvkami za sebou.
To je pripad deklaracii ako:

Kód: Vybrať všetko

   int matica[M][N];
U viacrozmernych poli s niektorymi neznamymi rozmermi este stale plati, co som pisal v predchadzajucom prispevku. Lenze v skutocnosti ide o polia ukazatelov na (polia ukazatelov na...) polozky.
Tie sa ale zapisuju uplne inak, nez viacrozmerne polia (prvy pripad) - ako pisem, ide o dve odlisne, a nekompatibilne veci:

Kód: Vybrať všetko

   int *matica[M];
0
War is peace. Freedom is slavery. Ignorance is strength.
There is no such thing as a well-adjusted slave.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: program

Príspevok od používateľa peterple » 16 Jan 2014, 21:36

súhlasím s Tebou čo teraz píšeš. V mojom prvom príspevku som len spomenul, že sa mi nepáči takýto prístup pre alokovanie poľa, ktorého veľkosť je v čase alokácie známa, lebo čísla m a n sú zadané na začiatku súboru. Preto som navrhol iný spôsob. Takže nevidím dôvod to alokovať pomocou poľa smerníkov. Prečo, som tam uviedol tiež.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok