Форум программистов, компьютерный форум, киберфорум
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.90
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
#1

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

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

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

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

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

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

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

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

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

Разработать консольное приложение с XML базой данных. Тема: музыкальная библиотека - C#
1 Разработать структуру файла XML для хранения информации об объектах предметной области. 2. Разработать DTD или Schema XML (по выбору...

44
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.04.2012, 11:54 #2
Я чтото сделал сам не понял что именно, но помогите разберитесь
Уважаемый - это будет потеря времени. Люди не умеют мысли читать. Особенно скомканно написанные.
Покажите код, это гораздо продуктивнее.
1
ktalonec
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
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
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
ktalonec
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
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.04.2012, 16:27 #6
Вы пытаетесь засунуть объект на индекс 1, учитывая что Ваш массив попросту пуст(0го элемента НЕТ).
Для обычного добавления объекта в конец массива используйте
Objective-C
1
[notesArray addObject:<some object here>];
PS> Счет начинается с 0! Не с 1.
1
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
16.04.2012, 19:22  [ТС] #7
zulkis, спасибо большое с массивом разобрался, но встала большая проблема которую я понятия не имею как решать, поскольку я инциализирую массив каждый раз когда захожу в sound это первая клавиша, то получается не совсем красивая картинка если я нажму подряд 7 клавиш а потом нажму первую то на выходе получу массив с единичкой внутри, поэтому я сначал подумал что надо создать Action внутри которого будут другие Action'ы но как я понял это невозможно, поэтому я не знаю что делать.
0
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.04.2012, 20:35 #8
Создайте объект notesArray в методе -init вашего класса. Он будет жив до вызова -dealloc, в котором вы его и -release.

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

Добавлено через 5 минут
zulkis, это тот самый init
0
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 01:51 #10
Цитата Сообщение от ktalonec Посмотреть сообщение
zulkis, это тот самый init
Если это вопрос то да, он самый, вот в нем и создавайте Ваш массив нажатий.
А действия будут всего лишь писать туда (addObject);
1
ktalonec
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
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
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
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 20:28  [ТС] #13
zulkis, я конечно нуб, и программирую меньше недели, но после изменения инита ничего не изменилось, программа как возвращала пустой массив так и возвращает, не знаю что не так
0
zulkis
684 / 611 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 20:46 #14
Цитата Сообщение от ktalonec Посмотреть сообщение
программа как возвращала пустой массив так и возвращает
А где именно что возвращаете то?
1
ktalonec
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
17.04.2012, 20:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2012, 20:48
Привет! Вот еще темы с ответами:

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

Программа на массивы - Pascal
Ввести массив А из 7 целых чисел из файла, массив B из 9 псевдослучайных чисел от 1,0 до 2,0 и массив С размерности 5х2 из вещественных...

программа на массивы - Pascal
Даны сведения о массах 16 грузов - массив А . 1) Сформировать массив В из грузов с массой &gt;4 т. Общая масса грузов В не должна...

программа на массивы - C++
Элементы массива B(1;M) расположить в порядке возрастания их значений Весьма благодарен заранее Добавлено через 14 секунд ...


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

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

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