2010-01-30 2 views
2

Я написал простую программу, чтобы понять, как работает объектив-c. Эта программа - i-ching, древнее предсказание, основанное на ответе на шесть строк, рассчитанное после запуска трех монет в шесть раз, а затем построение гексаграммы, которая является ответом.очень простой объектив-c вопрос

Я застрял в этом, что я уверен, имеет простое решение. Вот как я определил строки, я знаю, что это не лучший дизайн, но я стараюсь использовать как можно больше технологий. Предположим, что вы запускаете монету, она может быть 3 или 2 в зависимости от стороны, три монеты приводят к возможному значению 6,7,8,9.

/** 
    * identifying a coin 
    */ 
typedef enum { 
    head=3, 
    tail=2 
} Coin; 

/** 
    identify a line, three coins with a side value of 
    2 and 3 can result in 6,7,8,9 
    */ 
typedef enum { 
    yinMutable=tail+tail+tail, // 6 --> 7 
    yang=tail+tail+head, // 7 
    yin=head+head+tail, // 8 
    yangMutable=head+head+head // 9 --> 8 
} Line; 

/** 
    The structure of hexagram from bottom "start" to top "end" 
    */ 
typedef struct { 
    Line start; 
    Line officer; 
    Line transit; 
    Line minister; 
    Line lord; 
    Line end; 
} Hexagram; 

Первой проблемой, с которой я сталкиваюсь с этой конструкцией, является назначение значения в каждой строке в гексаграмме. Первый запуск должен заполнить значение в начале, второй в офицере .... и так далее. Но можно легко решить с помощью переключателя ... хотя мне это не нравится.

1) Первый вопрос: интересно, есть ли какая-либо функция, например, в javascript или C#, например foreach (свойство в гексаграмме), которые позволяют мне просматривать свойства в порядке их объявления, что решит мою проблему.

2) Второй вопрос: как альтернативный способ я использовал массив линии:

Controller.m 
.... 
Line response[6] 
.... 

-(id) buildHexagram:... { 

for(i =0.....,i++)..... 
    response[i]=throwCoins; 

// I omit alloc view and the rest of the code...then 
[myview buildSubview:response]; 
} 


---------------------- 
subView.m 


-(id) buildSubView:(Line[]) reponse { 

NSLog(@"response[0]=%o",[response objectAtIndex[0]]); <--- HERE I GOT THE ERROR 
} 

, но затем, йота этого решения, которое я получил EXC_BAD_ACCESS ошибки Так, очевидно, я недоразумение как массив работает в объективно- c или c! В надежде, что я сделал себе достаточно ясно, может кто-то указать на решение первого вопроса и что я делаю неправильно во втором варианте.

благодаря Leonardo

ответ

3

Вы создали массив C из линии - для доступа к элементам нужно использовать стиль C аксессор массива.

Таким образом, вместо

[response objectAtIndex[0]] 

использование

response[0] 
+0

Привет ... это работало, но у меня есть еще один основной вопрос один. В методе приема я хотел бы сделать назначение: Линия therespone [6]; <- переменная класса - (id) buildSubView: (строка []) ответ { theresponse = response; <- это вызывает ошибку недопустимой присваивания сборки ........ } , но я не могу, поскольку компилятор будет жаловаться на «несовместимые типы при назначении». – Leonardo

Смежные вопросы