Переменная только для чтения не может быть присвоена - PullRequest
0 голосов
/ 08 мая 2020

Я думаю, что это более поздняя проблема Xcode (я использую Xcode 11), поскольку этот код был хорош ранее в более старых версиях.

В моем main.mm файле у меня есть следующее:

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSString * path = [[NSBundle mainBundle] pathForResource:  @"fd" ofType: @"dat"];
    NSData* image = [NSData dataWithContentsOfFile:path];

    const char* szPathName = [path UTF8String];
    const char* pos = strrchr (szPathName, '/');
    //char* pos = strrchr (szPathName, '/');


    *pos = 0;

    if (CreateFaceFatted(szPathName) == 0)
    {
        NSLog(@"Init Dictionary failed");
    }
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

Я изменил char* pos = strrchr (szPathName, '/'); на const char* pos = strrchr (szPathName, '/');, иначе это вызовет

Cannot initialize a variable of type 'char *' with an rvalue of type 'const char *'

, поэтому, выполнив вместо этого const char, я, по крайней мере, мог бы продолжить, однако в следующем part;

*pos = 0;

Я получаю сообщение об ошибке Read only variable is not assignable

У меня есть небольшое понимание кода C ++, смешанного с obj- c, но я изо всех сил пытаюсь найти способ получить это для компиляции

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

Вы объявили указатель szPathName как указатель на постоянные данные

 const char* szPathName = [path UTF8String];

Таким образом, вы не можете изменять указанные данные, используя указатель pos

*pos = 0;

, который также должен быть объявлен с квалификатором const, потому что функция strchr возвращает постоянный указатель.

const char* pos = strrchr (szPathName, '/');

Сделать указатель szPathName так, чтобы он указывал на непостоянные данные.

1 голос
/ 09 мая 2020

Не похоже, что вы что-то сделали с момента вашего предыдущего вопроса , ТАК действительно требует от вас некоторых усилий.

Давайте пройдемся по исходному коду, чтобы, надеюсь, помочь понять проблемы:

Я думаю, что это более поздняя проблема Xcode (я использую Xcode 11), поскольку этот код был в порядке ранее в более старых версиях.

Это не проблема Xcode per se , ваш код всегда был неправильным, но, к счастью для вас, вы получили желаемый результат, просто улучшились сообщения об ошибках и предупреждениях.

const char* szPathName = [path UTF8String];

Эта строка занимает NSString значение, на которое ссылается path, вызывает для него метод UTF8String, который возвращает указатель на строковое значение C, и сохраняет эту ссылку в szPathName. Из Objective- C вы узнаете, что значение NSString равно неизменяемому , вы не можете изменить символы в строке. Метод UTF8String возвращает указатель на строковое значение константы C, поэтому szPathName имеет тип const char * - NSString и const char * - это типы в Objective- C и C соответственно для переменные, хранящие ссылки на постоянные строки; аналогично NSMutableString и char * - это типы для ссылок на изменяемые строки.

char* pos = strrchr (szPathName, '/');

Эта строка кода ищет крайний правый / в строке C и возвращает указатель на него. Как вы узнали из своего последнего вопроса, strrchr() в C ++ возвращает const char *, если передано const char *. Эта строка кода всегда была неправильной, но похоже, что более ранний компилятор не сообщал об ошибке, которая заключалась в том, чтобы ввести pos в качестве указателя на изменяемую строку, которой не является. Точно так же, как присвоение значения NSString * типизированной переменной NSMutableString * в Objective- C не приводит к изменению указанной строки, присвоение значения const char * типизированной переменной char * в C не делает ссылка C строка изменяема.

*pos = 0;

Эта строка верна, поскольку тип pos равен char *, но также неверна, поскольку значение, хранящееся в pos, является указателем на неизменяемая C строка.

Ваш код ранее работал, поскольку C слаб, когда дело доходит до изменчивости / неизменяемости, и, к счастью, записывается в C строку , хранящуюся внутри an экземпляр NSString (см. документацию UTF8String) не вызвал никаких проблем.

Вы не собираетесь решать вашу проблему, но добавление или удаление const в различных местах может привести к появлению кода который работает, но может легко сломаться в любой момент. не зная C (++), вам лучше посмотреть, что этот код пытается сделать, и закодировать это как можно больше в Objective- C.

Итак, что такое цель кода?

  1. Начать с пути к файлу, хранящемуся в path, как NSString значение
  2. Определить родительскую папку / каталог этого файла
  3. Передать эту родительскую папку в качестве константы C строковое значение функции CreateFaceFatted

У вас уже есть код для получения пути к файлу и сохранения его в path, так что шаг 1 не требует работы.

Вы также знаете, как создать указатель на постоянную строку C из значения NSString - используйте UTF8String. Итак, шаг 3.

Остается шаг 2. Ваш текущий код пытается сделать это после преобразования в строку C, и вы не знаете, как это сделать. Но вы знаете Objective- C, есть ли метод / свойство на NSString, которое принимает путь к файлу и возвращает путь к содержащей его папке / каталогу? Хорошим местом для поиска будет документация .

Надеюсь, это поможет вам разобраться в вашей проблеме и, следовательно, быстро найти решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...