GRY-Online.pl --> Archiwum Forum

Problem c++

28.10.2009
21:56
[1]

Mraauuu [ Pretorianin ]

Problem c++

Mam program w c++ i próbuję go skompilować w dev c ale nie działa. Koledze program działa na linuxie. U mnie pogram się kompiluje ale po wyświetleniu po chwili konczy swoją pracę z napisen: "...has stopeed working...". Dodam, że po uruchomieniu programu powinienem wstawić w lini poleceń plik, z którego powinien pobrać dane do programu.

W czym może być błąd?

28.10.2009
22:06
[2]

mac2000 [ Konsul ]

Spróbuj zapuścić debugera albo pokaż kod.

28.10.2009
22:08
smile
[3]

wysiak [ Legend ]

Stawiam, ze wklepales gdzies sciezki do plikow/katalogow ze slashami w zla strone.

28.10.2009
22:12
[4]

Mraauuu [ Pretorianin ]


#include <fstream>
#include <iostream>
#include<cctype>
using namespace std;


int main(int argc, char** argv)

int* tablica; // przechowuje wszystkie liczby wczytane z pliku
int* histogram; // liczy ile liczb znajduje sie w kazdym z przedzialow
int dlugosc=0; // liczba wszystkich wczytanych liczb
int podzial=atoi(argv[2]); // ile przedzialow
char temp[3]; // tymczasowa zmienna przechowujaca liczby w formacie znakowym

ifstream plik(argv[1]); // otworzenie pliku


while (!(plik.eof())) ‹ //powtarzaj dopoki nie nastapil koniec pliku
dlugosc++;
plik.getline(temp,256); // pobierz liczbe

plik.seekg(plik.beg); // przewin plik do poczatku
tablica = new int[dlugosc]; // stworz tablice tablica o ilosci elementow okreslonej przez dlugosc
histogram = new int[podzial]; // stworz tablice histogram o ilosci elementow okreslonej przez podzial
for (int a=0;a<podzial;a++) ‹
histogram[a]=0; // w kazdym przedziale nie ma zadnych liczb

for (int a=0;a<dlugosc;a++) ‹
plik.getline(temp,256); // pobierz liczbe z pliku
tablica[a]=atoi(temp); // konwertuj z lanuchca znakow do tablicy wszytskich liczb

plik.close(); // zamknij plik
for (int a=0;a<dlugosc;a++)‹
histogram[tablica[a]*podzial/100]++;

for (int a=0;a<podzial;a++) ‹
if (a==podzial-1) ‹
cout << "[" << a*(100/podzial)+1 << "," << "100" << "]"<<"\t \t";
› else ‹
cout << "[" << a*(100/podzial)+1 << "," << ((a+1)*(100/podzial)) << "]";

for (int b=0;b<histogram[a];b++) ‹
cout << "*";

cout << "\n";

cin>>temp;

return 0;

28.10.2009
22:14
[5]

Moby7777 [ Generał ]

@wysiak: Linux się gubi ale w Windowsach (przynajmniej od XP) to akurat obojętne... A co do problemu to ja raczej stawiam na jakieś biblioteki systemowe ale bez kodu to faktycznie możemy sobie gdybać.

[edit] w jaki sposób przekazujesz nazwę pliku? I czy jesteś pewny, że na pewno taki plik istnieje w miejscu, w którym program go szuka?

28.10.2009
22:19
[6]

Mraauuu [ Pretorianin ]

Chyba powinienem z linii poleceń to przekazywać. A tego pytania czy szuka w dobry miejscu to nie rozumiem.

28.10.2009
22:23
smile
[7]

wysiak [ Legend ]

Podaj komende jaka toto uruchamiasz.

28.10.2009
22:24
[8]

Mraauuu [ Pretorianin ]

ja pracuje na devie wiec klikam F9(kompiluj i uruchom) i sie program otwiera i wywala

28.10.2009
22:27
[9]

peanut [ kriegsmaschine ]

temp[3], getline(temp, 256) <- tu pewnie ladujesz do tablicy 256znakow?
pozniej sypiesz jakimis newami, a nigdzie nie ma delete. generalnie jakas kaszana ostra, albo ja juz niewyraznie widze o tej godzinie.

argv[1] to pierwszy argument w linii komend. sprawdz najpierw argc czy jest > 1.

ps. olej deva. sciagnij sobie visual studio.

28.10.2009
22:29
[10]

Mraauuu [ Pretorianin ]

tak jest napisane po wywaleniu w szczegółach:

Problem signature:
Problem Event Name: APPCRASH
Application Name: lolek.exe
Application Version: 0.0.0.0
Application Timestamp: 4ae8b78b
Fault Module Name: msvcrt.dll
Fault Module Version: 7.0.7100.0
Fault Module Timestamp: 49eea5fe
Exception Code: c0000005
Exception Offset: 0000c999
OS Version: 6.1.7100.2.0.0.256.1
Locale ID: 1045
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789

28.10.2009
22:30
smile
[11]

wysiak [ Legend ]

Nie dotykalem C++ od studiow, ale czy argv[x] nie oznacza zmiennych uruchomieniowych programu?:) Ktorych ty - jak sam napisales - w ogole nie podajesz? A twoj kolega najwyrazniej podaje.

28.10.2009
22:32
[12]

peanut [ kriegsmaschine ]

na msdnie mozesz szukac sobie bledow tych bibliotek, generalnie pewnie program sam sobie robi kuku jakims stack overflowem.

argc - liczba parametrow (lacznie z nazwa programu)
argv[] - nazwa programu, param1, param2, etc

28.10.2009
22:42
[13]

doctor_greenthumb [ Pretorianin ]

Wrzuciłem z ciekawości kod do edytora i skompilował się bez błędu, tyle że pod linuxem.

28.10.2009
22:50
[14]

K_Kakarotto [ Satyros ]

int podzial=atoi(argv[2]);
"ifstream plik(argv[1]);"

Linie wyżej czytają parametry uruchomieniowe programu, musiałbyś sobie w kompilatorze ustawić te parametry (nie wiem czy Dev posiada taką możliwość).
Ewentualnie możesz to zastąpić przez podanie w programie na sztywno parametrów lub zrobić interakcję z użytkownikiem na zasadzie "podaj parametr..."

28.10.2009
22:58
[15]

doctor_greenthumb [ Pretorianin ]

Nie no program najeżony błędami. Mraauuu pozatym mógłbyś przedstawić ideę co program ma realizować.

28.10.2009
22:59
[16]

likfidator2 [ Konsul ]

Tak jak pisali inni. Program oczekuje podania nazwy pliku do wczytania jako parametru.
Najprostszy sposób, to skompilować program, otworzyć konsolkę (cmd), wejść do folderu gdzie jest skompilowany plik lolek.exe i uruchomić go:

np. lolek.exe nazwa_pliku.txt

Drugi sposób, to zmienić opcję kompilatora, żeby podczas uruchamiania dodawał parametry linii poleceń.

Trzeci sposób, to wklepanie na sztywno do kodu programu nazwy testowego pliku.

© 2000-2021 GRY-OnLine S.A.