Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Prawdopodobnie przekroczenie pamięci

Ostatnio zmodyfikowano 2014-04-09 07:24
Autor Wiadomość
Frangles
Temat założony przez niniejszego użytkownika
Prawdopodobnie przekroczenie pamięci
» 2014-04-08 22:48:56
witam, mam program w c++ lecz nie kompiluje sie prawdopodobnie przez wyjscie poza pamiec. nie bardzo wiem w ktorym momencie

Plik Test.cpp
C/C++
#include "wierszyk.h"
#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>

using namespace std;


int main( int argc, char * argv[] ) {
    int b = 0, n = 0, x;
   
    n = atoi( argv[ 1 ] );
    WTP * wiersz;
   
    if( n >= 0 ) {
        /* if(argv[1] == "0") {
        cout << "bledne dane"<<endl;
        return 0;
        } */
        try {
            wiersz = new WTP( n );
        } catch( string s ) {
            cout << s;
            return 0;
        }
       
        for( int i = 2; i < n; i++ ) {
            try {
                b = atoi( argv[ i ] );
                x = wiersz->wspolczynnik( b );
                // if(b == 0 && argv[i] != "0") {
                // cout << "bledne dane2"<<endl;
                // continue;
                // }
            } catch( string s2 ) {
                cout << s2;
                continue;
            }
            delete wiersz;
           
           
        }
    }
   
    return 0;
}

Plik WTP.cpp

C/C++
#include <stdlib.h>
#include <iostream>
#include "wierszyk.h"

using namespace std;

WTP::WTP( int n ) throw( string ) {
    if( n < 0 ) throw( string ) "blad, n<0";
   
    rozmiar = n + 1;
    tab = new int[ n + 1 ];
    for( int i = 0; i <= n; i++ ) {
        tab[ i ] = 0;
    }
    tab[ 0 ] = 1;
    for( int i = 0; i < n; i++ ) {
        for( int j = i + 1; j > 0; j-- ) {
            tab[ j ] = tab[ j ] + tab[ j - 1 ];
        }
    }
}

int WTP::wspolczynnik( int m ) throw( string ) {
    if( m < 0 || m >= rozmiar + 1 ) throw( string ) "blad zakresu";
   
    return tab[ m ];
}

WTP::~WTP() {
    delete tab;
}

Plik wierszyk.h

C/C++
#ifndef wierszyk
#define wierszyk
#include <stdlib.h>
#include <iostream>

using namespace std;

class WTP {
   
private:
    int * tab;
    int rozmiar;
public:
    WTP( int n ) throw( string );
    ~WTP();
    int wspolczynnik( int m ) throw( string );
   
};

#endif


bad reloc address 0x0 in section `.data'
final link failed: Invalid operation
[Error] ld returned 1 exit status

Zamiarem tego programu jest tworzenie wiersza trojkata pascala dla pierwszego elementu, a nastepnie dla kolejnych argumentow wypisanie odpowiednich elementow tego wiersza. Gdy probowalem dodać obsługę wyjątku, że argument jest tekstem, a nie liczbą program się posypał i nie działa.
P-107938
Monika90
» 2014-04-09 07:24:36
Wygląda na to, że próbujesz zlinkować nie takie pliki jak powinieneś - zła konfiguracja projektu?

Natomiast w samym programie (co nie ma związku z błędem):
C/C++
#ifndef wierszyk
#define wierszyk
źle - w nazwach makr używaj tylko wielkich liter

C/C++
using namespace std;
źle - dyrektywa using w globalnej przestrzeni nazw w pliku nagłówkowym - okropne!

C/C++
WTP( int n ) throw( string );
int wspolczynnik( int m ) throw( string );
źle - specyfikacje wyjatków są deprecated, na dodatek nie używa się std::string jako wyjątku, w standardowej bibliotece są specjalne klasy do tego (albo zdefiniuj sobie własną).

C/C++
class WTP { int * tab; };
źle - klasa zarządza zasobami, a nie ma deklaracji konstruktora kopiującego, ani operatora przypisania, dodaj
C/C++
WTP( const WTP & ) = delete;
WTP & operator =( const WTP & ) = delete;

C/C++
delete wiersz;
źle - wywołujesz new tylko raz, a delete wiele razy w pętli. I po co w ogóle używasz tu pamięci dynamicznej?
P-107942
« 1 »
  Strona 1 z 1