Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: zeminem 12 Ledna 2011, 20:45:57
-
Ahoj, mám problém s programem.. už jsem ho osekal co to šlo a nic:
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
int pole1[]={};
int a,b,c,d;
c=0;
d=0;
cin>>a;
while(a>0){
b=a%2;
if(b==1){
pole1[c]=b;
d++;
}
if(b==0){
pole1[c]=b;
d++;
}
c++;
a=a/2;
}
cout<<d;
return 0;
}
Snad by to ani nebyl takový problém, kdyby mi nevrátil toto:
15
bash: řádek 1: 6671 Neoprávněný přístup do paměti (SIGSEGV)
Tzn. že pokud zadám číslo 15 tak vrátí tuto řádku, ačkoli ve Win (je to vyzkoušeno) vrátí 4 což je správně..
Víte někdo v čem je problém?? Je to chyba v programu?? Problém mezi klávesnicí a židlí, nebo něco s kompilátorem??
-
Protože pole má pevnou velikost. Inicializoval si pole velikosti 0 - vůbec nevím k čemu by taková konstrukce měla být. Koneckonců kompilátor ti to i naznačí:
keddie@musa:~/src/cpp$ g++ forum.cpp
keddie@musa:~/src/cpp$ g++ -Wall -pedantic forum.cpp
forum.cpp: In function ‘int main(int, char**)’:
forum.cpp:7: error: zero-size array ‘pole1’
(prvně kompiluji bez parametrů - projde to, pak kompiluji s tím, že má kompilátor upozorňovat na vše).
Výsledkem je, že zapisuješ do paměti za polem, což je ošklivé a Unixy ti to nedovolí. Windows občas ano, občas ne.
Např:
using namespace std;
int main (int argc, char *argv[])
{
int *pole1 = new int[10];
int a,b,c,d;
c=0;
d=0;
cin >> a;
while(a > 0){
b=a%2; // a \in {0,1}
if(b==1){
pole1[c]=b;
d++;
}
if(b==0){
pole1[c]=b;
d++;
}
c++;
a=a/2;
}
cout << d;
return 0;
}
keddie@musa:~/src/cpp$ g++ -Wall -pedantic forum.cpp
keddie@musa:~/src/cpp$ ./a.out
15
4
Ale příliš nechápu k čemu ten kód je. Nicméně to je možná tím ořezáním.
PS: MonoDevelop to také kompiluje g++, čili to je stejné.
-
No já toho tam nechápu více... např.:
if(b==1){
pole1[c]=b;
d++;
}
if(b==0){
pole1[c]=b;
d++;
}
Proč tam není podmínka b <= 1 jestli se nepletu tak záporné nikdy nebude... popřípadě si tam dejte ano... bude to vypadat jednodušeji.
Dotyčný chce asi dynamické pole, protože když c bude větší těch 10 co psal kolega, tak dojde k přetečení bufferu, což si musíte ohlídat a nebo udělat nějaké hezčí řešení, např pomocí nějakých malloc funkcí a vyjímek, když dojde k out of memmory... hledejte ;)
-
Nebo když už používáš C++ a nechceš pořád realokovat tak můžeš použít třeba vector (http://www.cplusplus.com/reference/stl/vector/) :)
-
Ano toto je možná ještě lepší řešení a mnohem jednodušší pro Vás než hledat jak si to dynamicky alokovat a ještě přes nějaký vyjímky.
Jednoduše se podívejte jak se pracuje s hlavičkou <vector> , která mimochodem je std jestli se nepletu.
Nebo když už používáš C++ a nechceš pořád realokovat tak můžeš použít třeba vector :)
-
No ono hlavně se to teprve učím a chtěl jsem jen rozlišit jedničky a nuly.. V podstatě je to binárka. Chtěl jsem udělat pole o němž nevím jak bude velké a zmátlo mě to, že tohle ve win fungovalo.. Tedy jelikož nevím jak to udělat vymyslel jsem dnes to, že naplním pole a pokud přijde další prvek tak se vytvoří pole další o jedna větší s tím, že ten prvek co byl v prvním se dá do dalšího a k tomu nově příchozí hodnota.. Je to z jednoho prostého důvodu a to proto, že je to pro mě snadno pochopitelné a nic složitějšího a lepšího nejsem schopen vytvořit.. Tedy aspoň vím, že [ int pole1[]={}; ] je hovadina..
-
No na todle je perfektní to vektorové pole... navíc když se učíte... proč se nenaučit něco co budete pak používat celou dobu.
vector<int> pole;
pridani: pole.push_back(1);
vypis: for (vector<int>::iterator Iter = pole.begin(); Iter < pole.end(); Iter++) cout << (*Iter) << endl;
smazani: pole.clear();
Ale přečtěte si o tom něco. Je toho všude hafo a těch metod třídy je tam více. Kompiler g++ je malinko jinej než Visual např. Ano dá se vytvořit pole pomocí zjištění velikosti.
Velikost se dá upřesnit takhle třeba:
char* str = new char[strlen(l_str)+1];
No ono hlavně se to teprve učím a chtěl jsem jen rozlišit jedničky a nuly.. V podstatě je to binárka. Chtěl jsem udělat pole o němž nevím jak bude velké a zmátlo mě to, že tohle ve win fungovalo.. Tedy jelikož nevím jak to udělat vymyslel jsem dnes to, že naplním pole a pokud přijde další prvek tak se vytvoří pole další o jedna větší s tím, že ten prvek co byl v prvním se dá do dalšího a k tomu nově příchozí hodnota.. Je to z jednoho prostého důvodu a to proto, že je to pro mě snadno pochopitelné a nic složitějšího a lepšího nejsem schopen vytvořit.. Tedy aspoň vím, že [ int pole1[]={}; ] je hovadina..