[C++] Signal 10 (SIGBUS)
17 september 2003 - 20:49   
geplaatst door: minne
Ik heb hier een programmaatje dat uitstekend compileert, maar als je hem draait, stopt het programma voortijdig met foutcode 10 (SIGBUS). Nazoeken van mij leerde me dat het een allocatie van verkeerd geheugen betekent. Een beetje debuggen met cout-regeltjes leerde me echt dat de fout in de volgende regel optreedt:
int random = (rand () / RAND_MAX) * m_numberPossibilities;
Wat is er nu zo raar aan deze regel? m_numberPossibilities is een integer met een waarde van ongeveer 70000...
[C++] Signal 10 (SIGBUS)
18 september 2003 - 05:58    reactie #1
geplaatst door: iPanda
Hoi, C++ is voor mij al een tijdje gelden, maar er zijn 3 dingen die ik me afvraag:
1. wat is de waarde van RAND_MAX?
2. wat is de maximum waarde van je int? Als je pech hebt is dat maximaal 65535.
3. wordt je / operatie, wat een gebroken getal op kan leveren (of was dat div?), automatisch geconverteerd naar een geheel getal? Want je kan alleen een geheel getal in je int stoppen.
[C++] Signal 10 (SIGBUS)
18 september 2003 - 13:42    reactie #2
geplaatst door: minne
Die waarde van RAND_MAX staat gedefinieerd in stdlib.h. Ik heb die eens nagezocht en die is echt ontzaglijk groot. Dat past nog niet in een unsigned long int. Maar rand () returneert wel een int :?
Hoe los ik dit nu op?

En als je twee integers deelt doe je toch een integerdeling en krijg je altijd een geheel getal? Dacht ik toch... :)

[C++] Signal 10 (SIGBUS)
18 september 2003 - 20:03    reactie #3
geplaatst door: iPanda
Weet je het zeker dat rand() een int returned? Meeste random functies geven een waarde tussen 0 en 1 terug. Maar zoals ik al zei, C++ is voor mij lang geleden.
[C++] Signal 10 (SIGBUS)
20 september 2003 - 11:28    reactie #4
geplaatst door: minne
Volgens de specificatie in stdlib.h wel (die je krijgt als je Appletje dubbelklikt op rand () in Project Builder). Als je double i = rand () doet, slikt ie dat ook niet...
Bestaat er geen GCC 3.3 API (dat is toch de compiler bij de Developer Tools?). Op gcc.gnu.org vind ik die niet. Alle C++-voorbeelden met rand () die ik vind, gaan uit van een veel kleinere RAND_MAX :?
[C++] Signal 10 (SIGBUS)
5 november 2003 - 22:21    reactie #5
geplaatst door: Reflex
het KAN natuurlijk zijn dat je m_numberPossibilities een pointer is... wat ook kan resulteren in een sighub... (maar daarvoor zie ik niet genoeg code)

verder zou ik proberen van die int een unsigned int geven, dat levert je een
std::numeric_limits<int>::max()^2 op, welke wel afdoende kan zijn.

God has a hard on for Marines, because we kill everything we see. He plays His games, we play ours. To show our appreciation for so much power, we keep heaven packed with fresh souls. God was here before the Marine Corps, so you can give your heart to Jesus, but your ass belongs to the corps.
[C++] Signal 10 (SIGBUS)
5 november 2003 - 22:25    reactie #6
geplaatst door: minne
m_numberPossibilities is gewoon een int, geen pointer. Dat unsigned maken had ik al geprobeerd, zonder resultaat...
Enige oplossing is waarschijnlijk m'n stdlib.h aanpassen :?
[C++] Signal 10 (SIGBUS)
5 november 2003 - 22:52    reactie #7
geplaatst door: Reflex

Citaat
minne om 22:25, 5-11-2003
m_numberPossibilities is gewoon een int, geen pointer. Dat unsigned maken had ik al geprobeerd, zonder resultaat...
Enige oplossing is waarschijnlijk m'n stdlib.h aanpassen :?

Dat zou ik niet doen (aanpassen stdlib.h) waarom define je niet gewoon je eigen RAND_MAX?

remember: het kan ook een samenloop van omstandigheden zijn (geen unsigned int, een te hogen randmax, etc etc)

God has a hard on for Marines, because we kill everything we see. He plays His games, we play ours. To show our appreciation for so much power, we keep heaven packed with fresh souls. God was here before the Marine Corps, so you can give your heart to Jesus, but your ass belongs to the corps.
[C++] Signal 10 (SIGBUS)
6 november 2003 - 08:25    reactie #8
geplaatst door: minne
Opnieuw gecompiled met XCode (net gisteren geinstalleerd), en nu draait ie als een tiet :?
unsigned long int random = ((int)(rand () / RAND_MAX)) * m_numberPossibilities;
[C++] Signal 10 (SIGBUS)
6 november 2003 - 11:25    reactie #9
geplaatst door: Reflex
Ik zal strax, als ik thuis ben, wel eens kijken of ie t bij mij onder PB wel gewoon doet :P
God has a hard on for Marines, because we kill everything we see. He plays His games, we play ours. To show our appreciation for so much power, we keep heaven packed with fresh souls. God was here before the Marine Corps, so you can give your heart to Jesus, but your ass belongs to the corps.
[C++] Signal 10 (SIGBUS)
6 november 2003 - 12:57    reactie #10
geplaatst door: Reflex
Ik heb t even getest, maar bij mij werkt je code (uit de eerste post) gewoon goed hoor :S

mijn RAND_MAX = 1879048.0+e03 (maw: 0x7FFFFFFF)

God has a hard on for Marines, because we kill everything we see. He plays His games, we play ours. To show our appreciation for so much power, we keep heaven packed with fresh souls. God was here before the Marine Corps, so you can give your heart to Jesus, but your ass belongs to the corps.