Assembler przy kompilowaniu - jak się go pozbyć?



  • Wkurzająco często wywala mi jakiś syf w assemblerze zamiast uruchomić mój program (konsolowy, nieużywający Qt) - jak się tego pozbyć? Tracę zmysły już po np. 6 próbach uruchomienia kodu... >__<"


  • Moderators

    Rozumiem, że używasz Qt Creator? Assembler z reguły wchodzi do gry, gdy program się wykrzaczy (SIGSEGV, SIGABRT), a QtC nie może znaleźć kodu źródłowego do pokazania.

    Czyli polecam odpalić w trybie debugowania i sprawdzić, czy program działa poprawnie.



  • Właśnie programy mi działają poprawnie, jeśli akurat nie wyskoczy assembler. On się pojawia losowo. Debugowania w ogóle nie mogę przeprowadzić, bo po kilku krokach wyskakuje assembler... >__<"



  • serdzio ma rację, występuje jakiś błąd w programie.

    bq. 'Właśnie programy mi działają poprawnie, jeśli akurat nie wyskoczy assembler.

    Czyli jest jakiś błąd. Może jakbyś pokazał kod to udałoby się coś zauważyć.



  • Dobra, jak tylko mi znowu coś wywali, to wam pokażę kod.



  • No choćby taki kod, dwa razy wywaliło assemblera, a za trzecim poszło ładnie wszystko:

    @#include <iostream>

    using namespace std;

    int main()
    {
    int liczbaCyfr;
    cin >> liczbaCyfr;
    char liczba[liczbaCyfr];
    cin >> liczba;
    if (liczba[liczbaCyfr - 1] == 5)
    {
    char wynik[liczbaCyfr*2];
    int przesuniecie;
    int wskaznikPozycji;
    // licznik dekrementacji wskaznika pozycji - o ile dekrementowac wskaznik w stosunku do wartosci stalej (liczby cyfr)
    int licznikDekrWskPoz = 0;
    for (int i=liczbaCyfr-1 ; i>=0 ; i--)
    {
    przesuniecie = 0;
    wskaznikPozycji = (liczbaCyfr * 2) - 1 - licznikDekrWskPoz;
    for (int j=liczbaCyfr-1 ; j>=0 ; j--)
    {
    wynik[wskaznikPozycji] += (liczba[i]*liczba[j]) % 10 + przesuniecie;
    przesuniecie = (liczba[i]*liczba[j]) / 10;
    if (wynik[wskaznikPozycji] > 9)
    {
    przesuniecie += (wynik[wskaznikPozycji] / 10);
    wynik[wskaznikPozycji] -= (wynik[wskaznikPozycji] / 10) * 10;
    }
    wskaznikPozycji--;
    }
    // magiczna linijka z forum cpp0x - dzieki niej funkcja zaczela dzialac! O_o"
    if( przesuniecie > 0 )
    wynik[ wskaznikPozycji ] += przesuniecie;
    licznikDekrWskPoz++;
    }

    }
    if (liczba[liczbaCyfr - 1] == 6)
    {
    
    }
    if (liczba[liczbaCyfr - 1] != 5 && liczba[liczbaCyfr - 1] != 6)
    {
        cout << liczbaCyfr - 1;
    }
    return 0;
    

    }
    @


  • Moderators

    Włącz debugger, idź krok po kroku, sprawdź cały stack trace gdy się wysypie.

    Jedziesz na tablicach, w nich przekroczyć zakres jest uber prosto. Do tego nie inicjalizujesz zmiennych, co może prowadzić do nieprzewidzianych sytuacji.



  • Powiem szczerze, że jest tam kilka rzeczy, które wzbudzają moją wątpliwość. Na przykład : @if (liczba[liczbaCyfr - 1] == 5)@ czy nie powinno być: @if (liczba[liczbaCyfr - 1] == '5')@ Skoro @char liczba[liczbaCyfr]; @
    Z tego co widzę to ten program ma działać na typach liczbowych, natomiast Ty nie działasz na integer'ach, double, long itp tylko na char.
    Poza tym, tak jak sierdzio wspomniał na tablicach bardzo łatwo popełnić błąd w zakresach i indeksach oraz nie inicjalizujesz zmiennych.
    Powstawiaj w kodzie np. std::cout do wyświetlenia w wartości zmiennych jakie wychodzą w Twoich działaniach, np. podczas liczenia przesunięcia lub do wyświetlenia aktualnej wartości w tablicy 'wynik'. Wydaje mi się, że wtedy zauważysz ideę problemu. Chyba, że źle rozumiem zasadę działania tego kodu.
    Jeżeli się mylę to proszę o sprostowanie. :) Pozdrawiam.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.