» »

[c++] Nezaželjeno spreminjanje vrednosti

[c++] Nezaželjeno spreminjanje vrednosti

]Fusion[ ::

Zdaj sem pisal en program za šolo in sem naletel na eno težavo. Po tem ko se izvede finkcija vnos() se vrednost spremenljivke v kar naenkra poveča na zelo veliko vrednost, pa ne vem zakaj. Med funkcijo se nič ne spremeni, kar sem prevero.

Pa še koda: (označo sem kje nastane sprememba)

#include <iostream>

using namespace std;

void vnos(double matr[][20], int velikost)
{
	for (int i = 0; i <= velikost; i++)
	{
		for (int j = 0; j <= velikost; j++)
		{
			cout << "vnesi element matrike: ";
			cin >> matr[i][j];
		}
	}
}

int main()
{	
	int v;

	cout << "Vpisite velikost kvadratne matrike: ";
	cin >> v;
	v--;
	
	double matr[v][20];
	
	cout << v << endl;          //če sem prej vpisal 2 je tu normalno v = 1
	vnos(matr, v);                //med funkcijo sem tudi prevero in je v = 1
	cout << v << endl;          //tu pa ima v neko drugo vrednost
	
	return 0;
 }


Hvala vnaprej
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

Vesoljc ::

v čem pa delaš to?
namreč tole
double matr[v][20];

se meni noče prevesti, kajti v ni konstanta! bo treba narest dinamični array... alpa izbrati kako drugo strukturo (iz std?).
Abnormal behavior of abnormal brain makes me normal...

]Fusion[ ::

Hmm zanimivo. Uporabljam g++, ki je zraven Slo-Tech Linuxa:) Drugače pa ne vem zakaj bi moral bit v konstanta?
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

Zgodovina sprememb…

  • spremenilo: ]Fusion[ ()

]Fusion[ ::

Zdaj sem se še spomnil in sprobal, če dela v DevC++ 4 In presenetljivo deluje :P
Samo meni bi moralo pod Linuxi delat, ker tudi v šoli delamo v njih takda... Če ima kdo kako idejo? Na novo naložit g++?
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

Zgodovina sprememb…

  • spremenilo: ]Fusion[ ()

BigWhale ::

cin >> v;
v--;
double matr[v][20];


Tole je ze narobe... Tukaj povprasas o velikosti matrike, potem jo zmanjsas za ena...

Remember:

int a[3]; a[0] = 1; a[1] = 2; a[2] = 3;

:)


> for (int i = 0; i <= velikost; i++)

Gnjik! Tisti <= bi moral biti samo <

Imas polje a[v] (v = 3) Tvoja zanka se izvede enkrat prevec... Ker ven dobis tole:

a[0], a[1], a[2] in a[3]

Tiste trojke ni vec, vprasanje kaj in predvsem kam zapises... ;)

Potem, matriko definiras kot matr[v][20]

V funkciji vnos, pa gres skozi dve dve zanki in ne preverjas ali je v > 20, ker, ce je, bo spet foo... :)

Ce je omejitev matrike na max 20x20, potem lahko to hardkodiras in se izognes dinamicnim poljem, parameter velikost pa obdrzis, ki to potem pove dejansko velikost matrike, ki jo vnasas...


Tvoj program je solski primer buffer overun napake... Evo, haxorji na juris! :) In to ne samo enkrat ;)

BigWhale ::

> Na novo naložit g++?

Tee Hee Hee. Ce dela, dela ker se ti je usralo ;)

Aja, pa delate z LINUXOM! ;)

]Fusion[ ::

BigWhale:
Hvala ti lepa :)) Sem popravo tak da ne uporabim v-- in ko kličem funkcijo samo (v-1) dam kot 2. parameter pa dela. Sem malo pomešal pojme o velikosti polja :P Te pa pišem kolokvij v petek :/

Pa pusti slovenščino ker nikoli ni bla moja močna točka. :)
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

]Fusion[ ::

Ce dela, dela ker se ti je usralo


Bo kar držalo ker sem zdaj ugotovil da sem že prej v par programih naredil enako napako pa so vsi delali :D
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

CCfly ::

Ko prevajaš vedno dodaj parametra -Wall -ansi, ki te opozorita na marsikatero tako neumnost.
"My goodness, we forgot generics!" -- Danny Kalev

Gundolf ::

Pa ne ustvarjat tabele drugac kot s konstantami no folk. Sej verjamem, da se vam to ne zdi nc posebnega ampak to preprosto ni prav ;((

Ok konc sale, to ni po ANSI C++ standardu in je nek cudn feature g++a. Sem ze videl in slisal za to ampak ce je treba naredit tabelo ki ni konstantne velikosti se normalno uporabi dinamicno alociranje (new double[20*v]). Ali pa vsaj uporabi std::vector. Iz enodimenzionalne tabele naredit matriko je pa tud mala malca. Vzemi si to kot izziv.

]Fusion[ ::

Hmm dobro, sem se odločil da bom naredil fiksno matriko matr[20][20] (naloga zak al tak zahteva matriko največ 20x20) tak da se bom izognil tem težavam. Glede dinamičnega polja pa še ga ne poznam tak doro ker smo komaj pred kratkim jemali snov, bom pa si definitivno pogledal...

Hvala vsem za pomoč.
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

BigWhale ::

Pa ne rabis klicat z v-1!

for (a = 0; a < velikost; a++


!!!

ce stejes od nic do toliko dokler je a manjsi kot velikost tabele, bos dobil tocno velikost tabele ven! :)

prvo mesto v tabeli ni 1 ampak 0!

]Fusion[ ::

Ja vem ja samo je blo hitreje to napisat kot pa vse "manjše_je_enako" spremenit v "manjše" Kar je ekvivalentno tvoji rešitvi ko uporabim samo v in same "manjše" znake.
Saj glavno da dela :)
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

OwcA ::

Tragično je, da se šele učiš, pa si že globoko v močvari imenovani zanič programer.
Otroška radovednost - gonilo napredka.

CCfly ::

... zato se nehaj tolažiti da program dela in poskusi razumeti kje delaš napake.
"My goodness, we forgot generics!" -- Danny Kalev

]Fusion[ ::

In kje sem naredil napako?
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

BigWhale ::

Pa saj sem ti ze napisal...

.. men se ne da vec... :P

]Fusion[ ::

BigWhale:
Saj sem poravil napako, sicer ne na način kot si ti napisal samo za moje pojme je popravljeno.

tak da tvoje resitev:

void izpis(matr[],  velikost)
{
      for (int i = 0; i < velikost; i++)
...
}

int main()
}
     int v = 8
     int matr[v]
     izpis(matr, v);


je enaka moji:
void izpis(matr[],  velikost)
{
      for (int i = 0; i <= velikost; i++)
...
}

int main()
}
     int v = 8
     int matr[v]
     izpis(matr, v-1);
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

Vesoljc ::

tuki gre za praktičnost!

misliš da se boš vedno spomnil, da je pa tam treba dat v-1?
Abnormal behavior of abnormal brain makes me normal...

]Fusion[ ::

Aha tak da sem mel pravo rešitev, samo da ni bla najlepša, ki obstaja. Dobro, bom se probal naslednič spomnit da ne vzet v-1. Zaj mi je jasno kaj ste hotli. povedat :P

No šeenkrat hvala vsem za pomoč
"I am not an animal! I am a human being! I... am... a man!" - John Merrick

BigWhale ::

Pa ti sedaj program dela?

]Fusion[ ::

Ja
"I am not an animal! I am a human being! I... am... a man!" - John Merrick


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C++] Ali je mogoče?

Oddelek: Programiranje
161526 (1002) Ciklamen
»

[c#] Vstavljanje vrednosti v tabelo

Oddelek: Programiranje
111528 (1350) Cvenemir
»

Program v C

Oddelek: Programiranje
51845 (1684) darkkk
»

[c++] bubblesort

Oddelek: Programiranje
293062 (3062) strictom
»

[C++] urejanje nizov po velikosti

Oddelek: Programiranje
82158 (1939) Matako

Več podobnih tem