Nano Hash - криптовалюты, майнинг, программирование

EXC_BAD_ACCESS с консольным приложением

Я пытаюсь изучить Objective C (и C вместе с ним) и пишу интерактивное консольное приложение. Мой опыт связан с Java, и многие различия в Objective C до сих пор непонятны мне. Я написал следующий метод:

-(void)start {
    [self startMenu]; // calls a method that prints the menu options
    char selectedOption = '\0'; // instantiating selectedOption
    char w = 'w';
    char n = 'n';
    char b = 'b';
    bool validOption = NO;
    while(!validOption) {
        scanf("%c", selectedOption);
        if(selectedOption == w) {
            [self setWinningScore];
        } else if(selectedOption == n) {
            [self setName];
        } else if(selectedOption == b) {
            break;
        } else {
            printf("'%s' is not a valid option.\n", selectedOption);
        }

    }
}

Но всякий раз, когда он запускается, он выдает ошибку EXC_BAD_ACCESS, когда достигает строки scanf("%c", *selectedOption);.

Я погуглил эту ошибку. Я нашел эту статью Лу Франко, но я все еще потеря относительно того, что я могу сделать.

ИЗМЕНИТЬ

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


  • Проблема scanf связана с чистым C, а не с Objective-C. 07.01.2014
  • Верно, хорошая мысль. Соответственно отредактировал мой вопрос. 07.01.2014

Ответы:


1

сначала узнайте, что такое указатель.

ваша проблема заключается в попытке разыменовать неверный указатель.

-(void)start {
    [self startMenu]; // calls a method that prints the menu options
    char selectedOption = '\0';
    char w = 'w';
    char n = 'n';
    char b = 'b';
    bool validOption = NO;
    while(!validOption) {
        scanf("%c", &selectedOption);
        if(selectedOption == w) {
            [self setWinningScore];
        } else if(selectedOption == n) {
            [self setName];
        } else if(selectedOption == b) {
            break;
        } else {
            printf("'%c' is not a valid option.\n", selectedOption);
        }

    }
}
07.01.2014
  • Я только что изменил свой код в соответствии с вашим ответом. К сожалению, я все еще получаю ту же самую ошибку в том же самом месте. Кроме того, я читал и перечитывал, что означает указатель. Я понимаю это, но мое понимание все еще немного шаткое из-за моего опыта работы с Java. Я не думаю, что это должно лишить меня права задавать этот вопрос, потратив час на его решение. 07.01.2014
  • @TJamesBoone: Итак, просто для подтверждения, строка теперь читается как scanf("%c", &selectedOption);с амперсандом — и вы все еще получаете сообщение об ошибке? 07.01.2014
  • @ Чак Да. Я даже пробовал оба. С амперсандом или без, я получаю ту же ошибку. 07.01.2014
  • @TJamesBoone вы пробовали чистую перестройку? и отладчик сообщает вам какое-либо сообщение об ошибке? какая линия? 07.01.2014
  • @Чак Ха! Это сделало это! :р Спасибо. Думаю, я должен принять ответ Брайана Чена. 07.01.2014
  • На самом деле, я думаю, что меня сбивало с толку то, что теперь я получал ошибку в нижней строке, в операторе else, поскольку для этого также нужен амперсанд. Я заметил это после того, как почистил и поменял. В остальном ответ Брайана идеален. 07.01.2014
  • @TJamesBoone: printf() не должен нуждаться в амперсанде. Что-то происходит очень странно, если он работает с амперсандом. 07.01.2014
  • @ Чак, признаюсь, моя программа теперь ведет себя неожиданным образом. Но это больше не дает мне эту ошибку, поэтому я подумал, что теперь это отдельная проблема. Но видимо нет. Мне нужно найти какое-то объяснение указателей, которое не так запутано для моего мозга Java. 07.01.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..