Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
#1

Массивы (музыкальная программа)

16.04.2012, 11:39. Просмотров 3806. Ответов 44
Метки нет (Все метки)

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

Но остановился я на моменте забивания нажатых клавиш в массив. мне нужно как то объявить массив снаружи, а потом внутри действия нажатия каждой клавиши в него всякое добавлять последовательно, я попробовал insertObject atIndex не получается выводит пустой массив, сначала думал что проблема в переводе массива в строку и выводе, но потом понял что массив просто пустой, после некоторого колдовства обнаружил что если массив объявлять внутри IBAction{} то все нормально, в общем как то так, заранее спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.04.2012, 11:39
Ответы с готовыми решениями:

Музыкальная коллекция
Музыкальная коллекция. Организуйте структуру для хранения информации о...

Музыкальная открытка на микроконтроллере
хочу сделать музыкальную открытку, подскажите пожалуйста, можно ли...

Музыкальная картотека в динамическом массиве
Написать программу, которая позволяет хранить музыкальную картотеку в...

Нужна музыкальная база даных
Поделитесь пожалуйста простенькой музыкальной базой

Музыкальная коллекция. taglib treeview QAbstractItemModel
Добрый день! Нашел в сети такой вот редактор тегов -...

44
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 22:00  [ТС] #21
zulkis, я не xib использую у меня storyboard когда создавал проект не обратил внимание, да и думал разницы нету

Добавлено через 2 минуты
zulkis, все поменял, та же картина(

Добавлено через 6 минут
брейкпоинт зафиксировал пустой массив
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 22:01 #22
Я со storyboard не работал, и разбираться сейчас не буду. Пойду спать.
Что там как вызывается при создании контроллера из сторибоарда не в курсе.
Проинициализируйте Ваш массив в viewdidload:
Objective-C
1
2
3
4
- (void)viewDidLoad {
  [super viewDidLoad];
  notesArray = [[NSMutableArray alloc] initWithCapacity:12];
}
Так должно все работать.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 22:07  [ТС] #23
zulkis, спасибо огромное за столько полезных советов, реально я бы не справился сам, и кстати только что с viewDidLoad заработало!! Спасибо большое, спокойной ночи)
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
19.04.2012, 21:25  [ТС] #24
zulkis, прошу прощения за беспокойство, но возник вопрос, а точнее два, первый это есть ли метод для поиска строки в строке, ну типа найти "привет" в строке "привет как дела", и второй можно ли как то скинуть приложение на девайс, прошивка 5.0.1 джейл есть. икскод один из последних, метод с "Не подписывать приложение" через плист не работает
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 06:13 #25
Есть классные методы hasSuffix и hasPrefix (проверяют является ли подстрока концом и началом строки соответственно)
А для конкретного нахождния подстроки можете использовать rangeOfString, а затем сравнивать полученный NSRange.location с NSNotFound. И если строка будет найдена, то в location будет номер первого символа, а length будет соответственно длина.

Читаем:
Немного про NSRange
Ну и найдите в доке описание rangeOfString, stringWithRange, hasPrefix, hasSuffix.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
20.04.2012, 10:33  [ТС] #26
zulkis, хмм, почитал я про range и все с ним связанное, и понял что не правильно сформулировал вопрос, ну т.е я искал что-то на подобие bool containts только для строк, потому что в массиве у меня каждая цифра это элемент, а мне необходимо найти например 60813151 в этом массиве, рэйнджы возвращают диапазон, а я хочу чтобы просто 1 или 0
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 12:26 #27
Сравните NSRange.location с NSNotFound
Типа:
Objective-C
1
2
3
4
NSRange range = [@"OLOLO" rangeOfString:@"LOL"];
        if (range.location != NSNotFound) {
            NSLog(@"LOL Found at %d", range.location);
        }
Или:
Objective-C
1
2
3
4
5
6
NSString *string = @"hello bla bla";
if ([string rangeOfString:@"bla"].location == NSNotFound) {
  NSLog(@"string does not contain bla");
} else {
  NSLog(@"string contains bla!");
}
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
20.04.2012, 22:19  [ТС] #28
zulkis, наверное последний вопрос, вы не знаете как заставить несколько звуков играться не вместе а друг за другом?
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
20.04.2012, 23:00 #29
Ну вы можете создать очередь, а затем запускать воспроизведение звука из этой очереди с возведением запуска таймера на временной отрезок данного звука. При следующем срабатывании таймера вы запускаете следующий звук и снова включаете таймер.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
21.04.2012, 08:43  [ТС] #30
zulkis, поковырялся я в примерах с таймером понял только то что таймером можно вызывать какое то действие т.е IBAction а мне нужно просто выполнять операции внутри if и в этом случае непонятно что писать в селектор например

Objective-C
1
(NSTimer *)timerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if ([result rangeOfString:@"63143454"].location != NSNotFound) 
    {
        CFBundleRef mainBundle1 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef1;   
        soundFileURLRef1= CFBundleCopyResourceURL(mainBundle1, (CFStringRef) @"11650__techsetsu__grandmither-s-piano-31", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle2 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef2;   
        soundFileURLRef2= CFBundleCopyResourceURL(mainBundle2, (CFStringRef) @"11644__techsetsu__grandmither-s-piano-25", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle3 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef3;   
        soundFileURLRef3= CFBundleCopyResourceURL(mainBundle3, (CFStringRef) @"11646__techsetsu__grandmither-s-piano-27", CFSTR ("wav"), NULL);
        CFBundleRef mainBundle4 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef4;   
        soundFileURLRef4= CFBundleCopyResourceURL(mainBundle4, (CFStringRef) @"11648__techsetsu__grandmither-s-piano-29", CFSTR ("wav"), NULL);
        UInt32 soundID1;
        AudioServicesCreateSystemSoundID(soundFileURLRef1, &soundID1);
        AudioServicesPlaySystemSound(soundID1);
        UInt32 soundID2;
        AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
        AudioServicesPlaySystemSound(soundID2);
        UInt32 soundID3;
        AudioServicesCreateSystemSoundID(soundFileURLRef3, &soundID3);
        AudioServicesPlaySystemSound(soundID3);
        UInt32 soundID4;
        AudioServicesCreateSystemSoundID(soundFileURLRef4, &soundID4);
        AudioServicesPlaySystemSound(soundID4);
        
    }
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
21.04.2012, 14:22 #31
Вы в терминологии хоть подразберитесь немного. IBAction это просто указание Интерфейс Билдеру опознавать метод. Это обычный void. Как вызывать селектор я Вам не буду рассказывать, ибо это есть везде.
А то получается я за Вас Вашу задачу решаю.

Читайте, разбирайтесь.

Насчет
таймером можно вызывать какое то действие
Ну и вызывайте, кто Вам мешает. Еще и объект передайте как аргумент(Можно вообще передавать строчку(имя файла)).
Если не хотите работать(не понимаете) с таймером - пробуйте -performSelector:withObject:afterDelay:

PS. Без знания Основ языка и банальных конструкций, для выбранной задачи, Вы далеко не уедете. Это Вам не "Hello, world".
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
22.04.2012, 14:08  [ТС] #32
zulkis, может я конечно совсем глупый, но я не могу понять, во всех примерах что я нашел c performSelector:withObject:afterDelay: селектором является некая функция (void), вот один из них

Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (void) methodCalledByButtonClick 
{
  for (id obj in array) {
    [self doSomethingWithObj:obj];
  }
}
 
static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
  if (isBad) {
    return;
  }
  if ([obj isBad]) {
    isBad = YES;
    [self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
    return;
  }
  //Do something with obj
}
 
- (void) resetIsBad {
  isBad = NO;
}
Ну я думаю ладно, возможно я поступаю слишком прямолинейно, пытаюсь сделать как в примере, внутри действия привязанного к кнопке воспроизведения 4х звуков, я создаю -(void)play; в заголовочном файле и пытаюсь использовать его внутри кнопки, но мне пишет что я использую "undeclaraited identifier", я совершенно запутался

Добавлено через 1 час 6 минут
вот единственное что нашел по селектору, из этого определения понятно не многое

Добавлено через 1 минуту
"Селектор — это строка, состоящая из идентификаторов, разделённых двоеточиями. Например, если вызов имеет вид:

[mycalendar ordinalityOfUnit:myunit inUnit:myunit2 forDate:mydate]

...то селектор этого вызова "ordinalityOfUnit:inUnit:forDate:". Непосредственно в objc_sendmsg передаётся не строка, а 32битное число. Каждая динамическая библиотека и сама программа при инициализации регистрируют все используемые селекторы, устанавливая соответствие между строками и числами."
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
22.04.2012, 14:33 #33
И? Что неясно то именно?
Покажите Ваш код, а не тот0, что из примера.
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
22.04.2012, 20:21  [ТС] #34
zulkis,
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
if ([result rangeOfString:@"63143454"].location != NSNotFound) 
    {
        CFBundleRef mainBundle1 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef1;   
        soundFileURLRef1= CFBundleCopyResourceURL(mainBundle1, (CFStringRef) @"11650__techsetsu__grandmither-s-piano-31", CFSTR ("wav"), NULL);
        UInt32 soundID1;
        AudioServicesCreateSystemSoundID(soundFileURLRef1, &soundID1);
        AudioServicesPlaySystemSound(soundID1);
        
        CFBundleRef mainBundle2 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef2;   
        soundFileURLRef2= CFBundleCopyResourceURL(mainBundle2, (CFStringRef) @"11644__techsetsu__grandmither-s-piano-25", CFSTR ("wav"), NULL);
        UInt32 soundID2;
        [self performSelector:  withObject:nil afterDelay:];
        AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
        AudioServicesPlaySystemSound(soundID2);
        
        CFBundleRef mainBundle3 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef3;   
        soundFileURLRef3= CFBundleCopyResourceURL(mainBundle3, (CFStringRef) @"11646__techsetsu__grandmither-s-piano-27", CFSTR ("wav"), NULL);
        UInt32 soundID3;
        AudioServicesCreateSystemSoundID(soundFileURLRef3, &soundID3);
        AudioServicesPlaySystemSound(soundID3);
        
        CFBundleRef mainBundle4 = CFBundleGetMainBundle();
        CFURLRef soundFileURLRef4;   
        soundFileURLRef4= CFBundleCopyResourceURL(mainBundle4, (CFStringRef) @"11648__techsetsu__grandmither-s-piano-29", CFSTR ("wav"), NULL);
       
        UInt32 soundID4;
        AudioServicesCreateSystemSoundID(soundFileURLRef4, &soundID4);
        AudioServicesPlaySystemSound(soundID4);
        
    }
}
насколько я понимаю мне нужно AudioServicesCreateSystemSoundID(soundFileURLRef2, &soundID2);
AudioServicesPlaySystemSound(soundID2); положить в void и этот void записать в performSelector
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
22.04.2012, 21:25 #35
Нет, вы понимаете не правильно.
Цитата Сообщение от ktalonec Посмотреть сообщение
положить в void и этот void записать в performSelector
Читайте мат часть.
Читайте что такое void, что такое функции в Си и прочие основополагающие вещи. Лучше вместо гуглинга возьмите книжку и почитайте.
И ваши AudioServicesCreateSystemSoundID, etc функции - это функции C, никакие не селекторы.
Я бы рад помочь, но без принципиального понимания базовых принципов - я даже не знаю, что предложить.
Только - читайте, разбирайтесь, спрашивайте, если совсем непонятно.
0
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
22.04.2012, 21:35  [ТС] #36
zulkis, я знаю что такое воид, это функция не возвращающая значения, ну так откуда мне ее взять тут, просто сама структура не понятна, в примере что я выложил в качестве перформСелектора именно функция воид
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
22.04.2012, 22:03 #37
void это НЕ функция.
Структура - создаете objC метод, внутри него пишете что вам там со звуками нужно делать, затем вызываете этот objC метод через performSelector.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
23.04.2012, 09:56  [ТС] #38
zulkis, я понимаю что я уже достал, но я начал читать мануал который описывает все с нуля, там написано про методы, я все это прочитал сделал все по шаблону мне говорят undeclaired identifier на название моего метода, там про объявление метода ничего не сказано, вот я и думаю в чем проблема я понимаю что это азы, но где правда не знаю
Описание синтаксиса методов из мануала
Начнем с методов, синтакси которых в общем виде выглядит так:

- (ТипВозвращаемыхДанных)названиеМетодаТипДанных)агрумент1продолжениеНазванияМетодаТипДанных)аргумент2;

И реальный пример:

- (NSArray *)shipsAtPointCGPoint)bombLocation withDamageBOOL) damaged;

В данном случае представлен метод с двумя аргументами. Метод начинается с знака «-» для методов экземпляра класса или с «+» для методов класса. Подробнее об отличиях мы поговорим позже.

Далее идет тип возвращаемых значений, он может быть (void), если ничего не возвращается, или (id), если возвращается объект, при этом тип его может быть любым (NSString, NSArray, NSNumber, NSDictionary…). Однако рекомендуется по возможности явно указывать тип данных, для того, чтобы компилятор мог предупредить нас о возможной ошибке.

*Разрешается не писать тип возвращаемого значения и не ставить скобки в начале метода вообще, тогда это расценивается как (id). Также, когда мы указываем (IBAction), это аналогично (void), но при этом мы сообщаем Interface Builder, что этот метод будет вызван из интерфейса.
0
zulkis
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
23.04.2012, 11:41 #39
Что конкретно Вы передаете в performSelector: и на какой конкретно метод выводит undeclared identifier?
Строчки кода пожалуйста.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
23.04.2012, 12:10  [ТС] #40
zulkis, так дело в том что до перформСелектора дела пока не дошло, я делаю по шаблону
Шаблон
- (ТипВозвращаемыхДанных)названиеМетодаТипДанных)агрумент1продолжениеНазванияМетодаТипДанных)аргумент2;


вот так примерно
-(id)zvuk: (CFURLRef)ssylka peremennaya: (UInt32)soundObject;
0
23.04.2012, 12:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.04.2012, 12:10

Разработать консольное приложение с XML базой данных. Тема: музыкальная библиотека
1 Разработать структуру файла XML для хранения информации об объектах...

Массив структур "Музыкальная школа": вывести информацию по ученикам, играющим на заданном инструменте
Создать массив, элементами которого являются структуры – список учеников...

Программа (массивы)
Здравствуйте. Помогите пожалуйсто решить задачу: Переписать в массив A...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru