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... >__<"
-
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... >__<"
-
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;
}
@ -
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.