Вызов C из Цели C - PullRequest
       1

Вызов C из Цели C

2 голосов
/ 26 мая 2011

Я новичок в цели c & c.Я пытаюсь использовать этот генератор случайных чисел c библиотекой в целевой программе c.Насколько я понимаю, цель c является строгим надмножеством c, поэтому это должно быть возможно.

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

  • предупреждение: неявное объявлениефункции 'mt_seed32'
  • предупреждение: неявное объявление функции 'mt_lrand'
  • предупреждение: семантическая проблема: неявное объявление функции 'mt_seed32' недопустимо в C99
  • предупреждение:Семантическая проблема: неявное объявление функции 'mt_lrand' недопустимо в C99
  • предупреждение: семантическая проблема: несовместимое целочисленное преобразование указателя, инициализирующее uint32_t * (он же unsigned int *) с выражением типа int

Я не импортировал файл заголовка C в целевой класс c - он просто находит его.Если я импортирую его, я получаю повторяющиеся ошибки метода.

Заголовочный файл библиотеки C:

extern void     mt_seed32(uint32_t seed);

extern uint32_t     mt_lrand(void); 

Код для его вызова: [Я пытался вызвать его с помощью [self method ()], нокоторый вылетает

mt_seed32(3);

uint32_t *i = mt_lrand();

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

Ответы [ 3 ]

8 голосов
/ 26 мая 2011

Последняя ошибка компилятора происходит из-за того, что mt_lrand(); возвращает int, а не указатель на int. Поэтому последняя строка должна быть

uint32_t i = mt_lrand();

Все остальные ошибки связаны с тем, что вы не * #include заголовок библиотеки. Не могли бы вы опубликовать ошибки, которые возникают, когда вы включаете заголовок библиотеки?

1 голос
/ 26 мая 2011

Сообщения, такие как implicit declaration of function 'mt_seed32', обычно всплывают, когда вы используете функцию до ее определения.См. Пример.

void foo() {
    //do stuff
    bar(); //call bar that was declared later
}

void bar() {
    ...
}

Это может произойти, если вы забыли включить файл заголовка или включили его после того, как использовали функции, объявленные в этом файле заголовка.Другое исправление - объявить прототип функции перед использованием.

Также вы назначаете ваше случайное число указателю на uint32_t.Это то, что вы действительно хотите?Если нет, то вы должны удалить * из вашей декларации: uint32_t i = mt_lrand();

0 голосов
/ 26 мая 2011

Я смог исправить мою проблему, изменив тип файла с «.m» на «.mm».Это заставляет компилятор использовать obj c ++, а не obj c.Он удаляет предупреждения, но я не уверен, что я исправил основные проблемы

Решение - Дубликат символа

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