Форум программистов, компьютерный форум CyberForum.ru

Objective-C

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

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

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

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

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

Музыкальная программа Color midi
Может кто-то проверить, работает ли моя прога на windows 7 ? На XP она работает.

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

DigiClock и музыкальная шкатулка
С днем уважения и любви

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.04.2012, 11:54     Массивы (музыкальная программа) #2
Я чтото сделал сам не понял что именно, но помогите разберитесь
Уважаемый - это будет потеря времени. Люди не умеют мысли читать. Особенно скомканно написанные.
Покажите код, это гораздо продуктивнее.
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;
  }
ну вот как то так правда это я уже восстановил изначальный вариант потому как много раз переделывал
zulkis
681 / 608 / 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. Обычная логика, если указатель на объект никто не держит - он может быть освобожден.
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
zulkis
681 / 608 / 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.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
16.04.2012, 19:22  [ТС]     Массивы (музыкальная программа) #7
zulkis, спасибо большое с массивом разобрался, но встала большая проблема которую я понятия не имею как решать, поскольку я инциализирую массив каждый раз когда захожу в sound это первая клавиша, то получается не совсем красивая картинка если я нажму подряд 7 клавиш а потом нажму первую то на выходе получу массив с единичкой внутри, поэтому я сначал подумал что надо создать Action внутри которого будут другие Action'ы но как я понял это невозможно, поэтому я не знаю что делать.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
16.04.2012, 20:35     Массивы (музыкальная программа) #8
Создайте объект notesArray в методе -init вашего класса. Он будет жив до вызова -dealloc, в котором вы его и -release.

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

Добавлено через 5 минут
zulkis, это тот самый init
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 01:51     Массивы (музыкальная программа) #10
Цитата Сообщение от ktalonec Посмотреть сообщение
zulkis, это тот самый init
Если это вопрос то да, он самый, вот в нем и создавайте Ваш массив нажатий.
А действия будут всего лишь писать туда (addObject);
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;
}
предупреждает что возвращать такое нельзя, программа работает но массив пустой, видимо я что-то не так делаю
zulkis
681 / 608 / 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;
}
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 20:28  [ТС]     Массивы (музыкальная программа) #13
zulkis, я конечно нуб, и программирую меньше недели, но после изменения инита ничего не изменилось, программа как возвращала пустой массив так и возвращает, не знаю что не так
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 20:46     Массивы (музыкальная программа) #14
Цитата Сообщение от ktalonec Посмотреть сообщение
программа как возвращала пустой массив так и возвращает
А где именно что возвращаете то?
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;
  }
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
17.04.2012, 20:57     Массивы (музыкальная программа) #16
И что вы хотите сделать то? Я просто не понимаю где не так то что? Поставьте breakpointы в методы sound\1\2 и посмотрите что там у вас в массиве, после добавления объектов.
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 21:14  [ТС]     Массивы (музыкальная программа) #17
zulkis, суть в следующем при нажатии на клавиши соответствующие sound,sound2,sound3, воспроизводится звук и вместе с этим в массив забивается сначала номер клавиши 1,2,3 соответственно а затем номер октавы взятый с сегментКонтроллера, и для проверки я вывожу этот массив через label вместе с нажатием клавиши 3, так вот когда я перебросил инициализацию в инит массив выводится пустой, т.е была надпись Label при нажатии на 3ю клавишу она пропадает и все, когда же массив инициализировался в первой кнопке выводилась последовательность цифр, через запятую, но в случае повторного вызова первой кнопки массив перезаполнялся
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
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]];
ktalonec
0 / 0 / 0
Регистрация: 25.03.2011
Сообщений: 36
17.04.2012, 21:30  [ТС]     Массивы (музыкальная программа) #19
zulkis, убрал, заменил все так же, да с этим не было проблем вроде добавляло все как надо, а вот инициализированный в ините массив отказывается видеть((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2012, 21:35     Массивы (музыкальная программа)
Еще ссылки по теме:

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

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

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

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

Программа Массивы - Delphi
Здравствуйте! скачал delphi 7. Есть программа на Pascal ABC, в силу не знания делфи и ограниченности времени прошу у Вас помощи. Нужно...


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

Или воспользуйтесь поиском по форуму:
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
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;
}
Yandex
Объявления
17.04.2012, 21:35     Массивы (музыкальная программа)
Ответ Создать тему
Опции темы

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