Форум программистов, компьютерный форум, киберфорум
Objective-C
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
1

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

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

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

Но остановился я на моменте забивания нажатых клавиш в массив. мне нужно как то объявить массив снаружи, а потом внутри действия нажатия каждой клавиши в него всякое добавлять последовательно, я попробовал insertObject atIndex не получается выводит пустой массив, сначала думал что проблема в переводе массива в строку и выводе, но потом понял что массив просто пустой, после некоторого колдовства обнаружил что если массив объявлять внутри IBAction{} то все нормально, в общем как то так, заранее спасибо)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.04.2012, 11:39
Ответы с готовыми решениями:

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

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

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

Ищу энтузиастов - музыкальная база
Наверное надо было написать - ищу специалистов, готовых работать бесплатно) В общем идея понятна и...

44
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
16.04.2012, 11:54 2
Я чтото сделал сам не понял что именно, но помогите разберитесь
Уважаемый - это будет потеря времени. Люди не умеют мысли читать. Особенно скомканно написанные.
Покажите код, это гораздо продуктивнее.
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
16.04.2012, 12:40  [ТС] 3
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
35
36
37
38
39
40
41
42
43
44
45
46
@synthesize w3;
@synthesize b1;
@synthesize oktava;
 
 
NSArray *Notes;
 
-(IBAction) sound;
 
{
    NSMutableArray *Notes = [NSMutableArray arrayWithCapacity:30];
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    [Notes insertObject:@"1" atIndex:1];
    
}
 
-(IBAction) sound2;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    [Notes insertObject:@"2" atIndex:2];
    
}
 
-(IBAction) sound3;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    NSString *result = [Notes componentsJoinedByString:@","];
    Vvod.text=result;
  }
ну вот как то так правда это я уже восстановил изначальный вариант потому как много раз переделывал
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
16.04.2012, 13:11 4
+arrayWithCapacity always return an autorelease object!
Поэтому при выходе из
Objective-C
1
-(IBAction) sound;
Notes уже будет ссылаться на deallocated object.

Вариант - объявить его
Objective-C
1
static NSMutableArray *notesArray = nil;
затем при 1й инициализации:
Objective-C
1
notesArray = [[NSMutableArray arrayWithCapacity:30] retain];
Либо:
Objective-C
1
notesArray = [[NSMutableArray alloc] initWithCapacity:30];
Скажу от себя - создайте объект notesArray в методе -init вашего класса. Он будет жив до вызова -dealloc, в котором вы его и -release.

PS> И читайте про систему подсчета ссылок. Раз уж не пользуетесь ARC. Обычная логика, если указатель на объект никто не держит - он может быть освобожден.
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
16.04.2012, 14:04  [ТС] 5
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
35
36
37
38
39
40
41
42
43
44
45
46
47
@synthesize w3;
@synthesize b1;
@synthesize oktava;
 
 
 
static NSMutableArray *notesArray = nil;
 
-(IBAction) sound;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    notesArray = [[NSMutableArray alloc] initWithCapacity:30];
    [notesArray insertObject:@"1" atIndex:1];
    
}
 
-(IBAction) sound2;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    [notesArray insertObject:@"2" atIndex:2];
    
}
 
-(IBAction) sound3;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    NSString *result = [notesArray componentsJoinedByString:@","];
    Vvod.text=result;
  }
вот как выглядит сейчас, но прога ругается пишет SIGABRT при нажатии на первую клавишу, это sound
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
16.04.2012, 16:27 6
Вы пытаетесь засунуть объект на индекс 1, учитывая что Ваш массив попросту пуст(0го элемента НЕТ).
Для обычного добавления объекта в конец массива используйте
Objective-C
1
[notesArray addObject:<some object here>];
PS> Счет начинается с 0! Не с 1.
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
16.04.2012, 19:22  [ТС] 7
zulkis, спасибо большое с массивом разобрался, но встала большая проблема которую я понятия не имею как решать, поскольку я инциализирую массив каждый раз когда захожу в sound это первая клавиша, то получается не совсем красивая картинка если я нажму подряд 7 клавиш а потом нажму первую то на выходе получу массив с единичкой внутри, поэтому я сначал подумал что надо создать Action внутри которого будут другие Action'ы но как я понял это невозможно, поэтому я не знаю что делать.
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
16.04.2012, 20:35 8
Создайте объект notesArray в методе -init вашего класса. Он будет жив до вызова -dealloc, в котором вы его и -release.

Для этого:
Прочитайте что такое метод init. Прочитайте про метод dealloc.
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
16.04.2012, 21:23  [ТС] 9
zulkis, dealloc насколько я знаю освобождает память после выполнения программы, а вот про инит я что-то не нахожу ничего, просто init много где встречается а конкретно метоа описание я не нашел пока, но продолжаю поиски)

Добавлено через 5 минут
zulkis, это тот самый init
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
17.04.2012, 01:51 10
Цитата Сообщение от ktalonec Посмотреть сообщение
zulkis, это тот самый init
Если это вопрос то да, он самый, вот в нем и создавайте Ваш массив нажатий.
А действия будут всего лишь писать туда (addObject);
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 10:47  [ТС] 11
zulkis, сделал как написано в мануале

Objective-C
1
2
3
4
5
- (id)init;
{
    notesArray = [[NSMutableArray alloc] initWithCapacity:12];
    return notesArray;
}
предупреждает что возвращать такое нельзя, программа работает но массив пустой, видимо я что-то не так делаю
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
17.04.2012, 15:00 12
Цитата Сообщение от ktalonec Посмотреть сообщение
zulkis, сделал как написано в мануале

Objective-C
1
2
3
4
5
- (id)init;
{
    notesArray = [[NSMutableArray alloc] initWithCapacity:12];
    return notesArray;
}
предупреждает что возвращать такое нельзя, программа работает но массив пустой, видимо я что-то не так делаю
Какой феерический писец.
Уважаемый - init - он Инициализирует объект, который вы создаете.
Objective-C
1
2
3
4
5
6
7
- (id)init {
self = [super init];
if (self) {
     notesArray = [[NSMutableArray alloc] initWithCapacity:12];
}
return self;
}
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 20:28  [ТС] 13
zulkis, я конечно нуб, и программирую меньше недели, но после изменения инита ничего не изменилось, программа как возвращала пустой массив так и возвращает, не знаю что не так
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
17.04.2012, 20:46 14
Цитата Сообщение от ktalonec Посмотреть сообщение
программа как возвращала пустой массив так и возвращает
А где именно что возвращаете то?
1
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 20:48  [ТС] 15
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
@synthesize oktava;
 
 
 
static NSMutableArray *notesArray = NULL;
 
- (id)init 
{
    self = [super init];
    if (self) 
    {
        notesArray = [[NSMutableArray alloc] initWithCapacity:12];
    }
    return self;
}
 
 
 
-(IBAction) sound;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    [notesArray addObject:@"1"];
    NSUInteger n =oktava.selectedSegmentIndex;
    //int myInt=oktava.selectedSegmentIndex;
    [notesArray addObject:[NSNumber numberWithInt:n]];
    
}
 
-(IBAction) sound2;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    [notesArray addObject:@"2"];
    NSUInteger n =oktava.selectedSegmentIndex;
    [notesArray addObject:[NSNumber numberWithInt:n]];
    
}
 
-(IBAction) sound3;
 
{
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef;
    soundFileURLRef= CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Grand Piano - Fazioli - minor chords - A#m highest", CFSTR ("wav"), NULL);
    UInt32 soundID;
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
    AudioServicesPlaySystemSound(soundID);
    NSString *result = [notesArray componentsJoinedByString:@","];
    Vvod.text=result;
  }
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
17.04.2012, 20:57 16
И что вы хотите сделать то? Я просто не понимаю где не так то что? Поставьте breakpointы в методы sound\1\2 и посмотрите что там у вас в массиве, после добавления объектов.
0
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 21:14  [ТС] 17
zulkis, суть в следующем при нажатии на клавиши соответствующие sound,sound2,sound3, воспроизводится звук и вместе с этим в массив забивается сначала номер клавиши 1,2,3 соответственно а затем номер октавы взятый с сегментКонтроллера, и для проверки я вывожу этот массив через label вместе с нажатием клавиши 3, так вот когда я перебросил инициализацию в инит массив выводится пустой, т.е была надпись Label при нажатии на 3ю клавишу она пропадает и все, когда же массив инициализировался в первой кнопке выводилась последовательность цифр, через запятую, но в случае повторного вызова первой кнопки массив перезаполнялся
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
17.04.2012, 21:22 18
Уберите из методов строчки
Objective-C
1
[notesArray addObject:[NSNumber numberWithInt:n]];
У вас получачется в массиве и строчки и объекты типа NSNumber.
И если честно, я не уверен как себя поведет componentsJoinedByString: в этом случае.
Вместо этого можете добавлять так:
Objective-C
1
[notesArray addObject:[NSString stringWithFormat:@"%d", n]];
0
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 21:30  [ТС] 19
zulkis, убрал, заменил все так же, да с этим не было проблем вроде добавляло все как надо, а вот инициализированный в ините массив отказывается видеть((
0
686 / 613 / 43
Регистрация: 13.01.2011
Сообщений: 1,722
17.04.2012, 21:35 20
Objective-C
1
static NSMutableArray *notesArray = NULL; //изменить на nil
И это же у Вас контроллер, да еще и инициализация через xib?
измените весь init на:
Objective-C
1
2
3
4
5
6
7
8
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
          notesArray = [[NSMutableArray alloc] initWithCapacity:12];
    }
    return self;
}
0
17.04.2012, 21:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.04.2012, 21:35
Помогаю со студенческими работами здесь

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

Музыкальная коллекция. taglib treeview QAbstractItemModel
Добрый день! Нашел в сети такой вот редактор тегов - http://code.google.com/p/qtagger/ Десять...

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru