Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: problém s C++ (MonoDevelop) v Ubuntu  (Přečteno 1745 krát)

zeminem

problém s C++ (MonoDevelop) v Ubuntu
« kdy: 12 Ledna 2011, 20:45:57 »
Ahoj, mám problém s programem.. už jsem ho osekal co to šlo a nic:
Kód: [Vybrat]
#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:
Kód: [Vybrat]
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??
http://zeminem.cz/ (to jsi v životě neviděl)

Kedrigern

Re: problém s C++ (MonoDevelop) v Ubuntu
« Odpověď #1 kdy: 12 Ledna 2011, 21:49:57 »
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čí:
Kód: [Vybrat]
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ř:
Kód: [Vybrat]
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;
}
Kód: [Vybrat]
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é.
« Poslední změna: 12 Ledna 2011, 21:54:19 od Kedrigern »

Martin - ViPEr*CZ*

Re: problém s C++ (MonoDevelop) v Ubuntu
« Odpověď #2 kdy: 13 Ledna 2011, 12:49:04 »
No já toho tam nechápu více... např.:

Kód: [Vybrat]
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 ;)
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

premet

  • Host
Re: problém s C++ (MonoDevelop) v Ubuntu
« Odpověď #3 kdy: 13 Ledna 2011, 13:17:36 »
Nebo když už používáš C++ a nechceš pořád realokovat tak můžeš použít třeba vector  :)
« Poslední změna: 13 Ledna 2011, 13:31:58 od Honza Grulich »

Martin - ViPEr*CZ*

Re: problém s C++ (MonoDevelop) v Ubuntu
« Odpověď #4 kdy: 13 Ledna 2011, 13:22:07 »
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  :)
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

zeminem

Re: problém s C++ (MonoDevelop) v Ubuntu
« Odpověď #5 kdy: 13 Ledna 2011, 15:45:24 »
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..
http://zeminem.cz/ (to jsi v životě neviděl)

Martin - ViPEr*CZ*

Re: problém s C++ (MonoDevelop) v Ubuntu
« Odpověď #6 kdy: 13 Ledna 2011, 15:54:23 »
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..
Open source is gold way... Mint 17.2, Debian 8.1 Jessie| Ubuntu Wiki (návody) | Google vyhledávač | Qt4 návody

 

Provoz zaštiťuje spolek OpenAlt.