SIG11 crashing - can't figure it out

John Colvin via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri May 15 05:31:48 PDT 2015


On Friday, 15 May 2015 at 11:44:32 UTC, John Colvin wrote:
> On Friday, 15 May 2015 at 11:08:06 UTC, Rob Pieké wrote:
>> Working my way through Ali Çehreli's rather amazing e-book, 
>> I've hit a snag where some code I've written is pretty crashy. 
>> I consistently get "Segmentation fault: 11" (dmd 2.067.1, OSX).
>>
>> I can't figure out where things are going wrong, because any 
>> attempt I make to debug via extra print statements causes the 
>> program to run successfully. Same if I try to compile with 
>> "-gc" ... it suddenly starts working, so I can't debug with 
>> gdb.
>>
>> Putting aside any "that's probably not a great solution to the 
>> problem you're tying to solve" thoughts, can anyone offer me 
>> the "eureka" moment I'm missing to understand why the code 
>> below doesn't work?
>>
>> Many thanks in advance!
>>
>> * * *
>>
>> import std.stdio;
>>
>> enum Suit {
>> 	HEARTS, DIAMONDS, CLUBS, SPADES
>> }
>>
>> enum Value {
>> 	ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, 
>> TEN, JACK, QUEEN, KING
>> }
>>
>> struct Card {
>> 	Value value;
>> 	Suit suit;
>> }
>>
>> void printCard(in Card card) {
>> 	final switch(card.value) {
>> 		case Value.ACE:
>> 			write("A");
>> 			break;
>> 		case Value.TWO, Value.THREE, Value.FOUR, Value.FIVE, 
>> Value.SIX, Value.SEVEN, Value.EIGHT, Value.NINE, Value.TEN:
>> 			writef("%d", card.value);
>> 			break;
>> 		case Value.JACK:
>> 			write("J");
>> 			break;
>> 		case Value.QUEEN:
>> 			write("Q");
>> 			break;
>> 		case Value.KING:
>> 			write("K");
>> 			break;
>> 	}
>> 	final switch(card.suit) {
>> 		case Suit.HEARTS:
>> 			write("♡");
>> 			break;
>> 		case Suit.DIAMONDS:
>> 			write("♢");
>> 			break;
>> 		case Suit.CLUBS:
>> 			write("♣");
>> 			break;
>> 		case Suit.SPADES:
>> 			write("♠");
>> 			break;
>> 	}
>> 	write("\n");
>> }
>>
>> int main() {
>> 	auto card = Card(Value.JACK, Suit.CLUBS);
>> 	printCard(card);
>> 	return 0;
>> }
>
> It seems to be DMD specific, it works fine with ldc. If you're 
> a homebrew user, brew install ldc and try it for yourself.
>
> P.s. you can use the `with` statement to make things less 
> verbose:
>
> import std.stdio;
>
> enum Suit {
> 	HEARTS, DIAMONDS, CLUBS, SPADES
> }
>
> enum Value {
> 	ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN,
> JACK, QUEEN, KING
> }
>
> struct Card {
> 	Value value;
> 	Suit suit;
> }
>
> void printCard(in Card card) {
> 	final switch(card.value) with(Value) {
> 		case ACE:
> 			write("A");
> 			break;
> 		case TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN:
> 			writef("%d", card.value);
> 			break;
> 		case JACK:
> 			write("J");
> 			break;
> 		case QUEEN:
> 			write("Q");
> 			break;
> 		case KING:
> 			write("K");
> 			break;
> 	}
> 	final switch(card.suit) with(Suit) {
> 		case HEARTS:
> 			write("♡");
> 			break;
> 		case DIAMONDS:
> 			write("♢");
> 			break;
> 		case CLUBS:
> 			write("♣");
> 			break;
> 		case SPADES:
> 			write("♠");
> 			break;
> 	}
> 	write("\n");
> }
>
> void main() {
> 	auto card = Card(Value.JACK, Suit.CLUBS);
> 	printCard(card);
> }

Please submit a bug report at issues.dlang.org


More information about the Digitalmars-d-learn mailing list