#1 2011-01-24 21:45:15

n0de
Narys
Užsiregistravo: 2010-11-04
Pranešimai: 23

c++ segmentation fault "suvaldymas"

Esmė paprasta.

Rašiau žmogučiam iš technologijos.lt bet arba ten nesupranta ko aš noriu, arba jie nežino kas yra linux.. Taigis pacituosiu pats save tingėdamas perrašyt:

Aš_Pats_:D rašė:

Sveiki,

nežinau, kaip ten būtų su windows'ais, bet linux'ai man neleidžia error'ų handle'int..

atoi () funkcija grąžina 0, jeigu kas nors negerai (pvz paduodi ne skaičių, o kokį žodį), tad žinodamas, kad grąžina 0 aš pasirašau tokį elementarų veiksmą:

if ( atoi ( konvertuojamas_kintamasis ) == 0 )
{
<...>
visa tai, ką noriu atlikt
<...>
}

Tačiau jis man žieba į akis "segmentatios fault" vietoj to, kad vykdytų tai, ką prašau..

Tiesa, kintamasis kurį turiu konvertuoti yra char tipo, o atoi () reikalauja const char *, na tai gal čia ir bėda iškyla, nes aš darau šitaip:

 (const char *) mano_char 

Atsijungęs

#2 2011-01-24 23:55:56

adomas
Narys
Iš: Vokietija
Užsiregistravo: 2011-01-20
Pranešimai: 69

At: c++ segmentation fault "suvaldymas"

o ką tas iš technologijos.lt atrašė tau į klausimą?

Atsijungęs

#3 2011-01-25 00:16:27

n0de
Narys
Užsiregistravo: 2010-11-04
Pranešimai: 23

At: c++ segmentation fault "suvaldymas"

Atrašė, cituoju:

Pasitikrink, ar paduodi teisingą pointerį.

wtf, aš išvis pointerio nepaduodu, ką ir rašiau poste, kad paduodu tiesiog char. Galiu įrašyt iškart į funkciją 'n' ir man rodys tą patį error'ą..

Paskutinį kartą redaguotas n0de (2011-01-25 00:17:39)

Atsijungęs

#4 2011-01-25 07:09:11

Dummas
Linux Rat
Iš: Vilnius
Užsiregistravo: 2010-10-10
Pranešimai: 177
Tinklapis

At: c++ segmentation fault "suvaldymas"

Na iš mano greitom parašyto kodo

#include <stdio.h>
#include <stdlib.h>

int main ( int argc, char *argv[])
{
    char *mano_char = "20";

    printf("My number in chars: %s\n", mano_char);

    if ( atoi ( mano_char ) == 0 )
        {
            printf("Error on converting to int");
        }
    else
        {
            printf("My number in numbers: %d\n", atoi ( mano_char ) );
        }

    return 0;
}

Segmentation fault'ą išmesdavo, jeigu kabutes kitas parašydavau:

#include <stdio.h>
#include <stdlib.h>

int main ( int argc, char *argv[])
{
    char *mano_char = '20';

    ......
}

Castingą C ( kas galioja ir Cpp ) daryti reikia labai retais atvėjais.

Man labai įdomu ką tu paduodi į atoi(), t.y. koks būtent yra tavo siunčiamas skaičius:
- Ar vienetinį char'ą ( char mano_char )
- Ar char pointerį ( char *mano_char )
- Jeigu pas tave yra char masyvas, tai ar yra užbaigiamas string'as ( the magic "\0" ) ?

Gal gali parodyti tavo char'o deklaravimo kodo gabalą ?


Arch Linux Lietuva

Atsijungęs

#5 2011-01-25 11:09:51

n0de
Narys
Užsiregistravo: 2010-11-04
Pranešimai: 23

At: c++ segmentation fault "suvaldymas"

Dėkui už atsakymą wink

Jau man gerieji žmonės iš daniweb tą patį pasakė, kad esmė, jog nėra magic "\0" wink tai ir buvo esminė bėda.

Atsijungęs

#6 2011-01-25 23:19:35

Dummas
Linux Rat
Iš: Vilnius
Užsiregistravo: 2010-10-10
Pranešimai: 177
Tinklapis

At: c++ segmentation fault "suvaldymas"

C casting'as yra toks "smagus dalykas", kad net tokia nesąmonė kaip :

#include <stdio.h>
#include <stdlib.h>

void *sum ( void *, void *);

int main ( int argc, char *argv[])
{
    int x = (int) sum ( (void *) 2, (void *)2 );
    printf("x: %d\n", x);
    return 0;
}

void *sum ( void *_a, void *_b )
{
    return (int ) (int)_a + (int)_b;
}

Veikia puikiai. big_smile


Arch Linux Lietuva

Atsijungęs

#7 2011-01-26 16:42:14

edacval
Moderatorius
Iš: Vilnius
Užsiregistravo: 2010-10-10
Pranešimai: 40

At: c++ segmentation fault "suvaldymas"

Ruošiesi dalyvauti http://www.ioccc.org/ ? big_smile

Atsijungęs

#8 2011-01-27 16:00:04

Dummas
Linux Rat
Iš: Vilnius
Užsiregistravo: 2010-10-10
Pranešimai: 177
Tinklapis

At: c++ segmentation fault "suvaldymas"

Ne kaip ne. : )

Šitą fokusą nužiūrėjau iš pthreads bibliotekos. smile


Arch Linux Lietuva

Atsijungęs

#9 2011-05-31 16:31:47

s2
Narys
Užsiregistravo: 2011-05-31
Pranešimai: 9

At: c++ segmentation fault "suvaldymas"

Fokusų naudojimas, kai jų nereikia, yra maždaug toks pat blogis, kaip ir išankstinė optimizacija:)

Atsijungęs

Lentos poraštė