Вместо выполнения
lastLevel [nesting [i]] = new JValue(prop.GetValue (value));
Вы должны выполнить
lastLevel[nesting[i]] = JValue.FromObject(jValue);
В противном случае у нас есть
Не удалось определить тип объекта JSON для типа ...
blockquote> Исключение
Вы можете поместить что-то вроде следующего в a.c
, а затем извлечь его из b.c
.
В a.c:
int a[] = {1, 2, 3};
const int lengthofa = sizeof( a ) / sizeof( a[0] );
А затем в b.c:
extern int a[];
// the extern (thanks Tim Post) declaration means the actual storage is in another
// module and fixed up at link time. The const (thanks Jens Gustedt) prevents it
// from being modified at runtime (and thus rendering it incorrect).
extern const int lengthofa;
void somefunc() {
int i;
for ( i = 0; i < lengthofa; i++ )
printf( "%d\n", a[i] );
}
Если вы хотите, чтобы размер вашего массива был доступен как константа времени компиляции, то у вас нет другого выбора, кроме как явно указать размер массива в объявлении extern
массива
extern int a[9];
В в этом случае ваша ответственность состоит в том, чтобы убедиться, что размер массива согласован между объявлением и определением extern
. Вы можете использовать константу манифеста для этого, но все же вы будете обязаны убедиться, что число инициализаторов между {}
и объявленным размером одинаково.
Если вы не хотите, чтобы размер массива был константой времени компиляции, вы можете сделать то, что предлагает Марк Уилкинс в своем ответе.
Я хотел бы #define ARRAY_MAX (or whatever)
во внешнем заголовке, обычно используемом для определения таких вещей, затем включить этот заголовок в оба файла, которые в нем нуждаются. Это хорошо работает, когда вы склонны хранить большинство, если не все ваши define
в одном или двух центральных заголовках.
Поместите переменную в заголовочный файл только так:
#ifndef A_DEF
#define A_DEF
int a[] = {1,2,3,4,5,6,7,8,9};
#endif
Условная компиляция не позволит переопределить переменную. Таким образом, у вас есть доступ к нему из любого места.
При компиляции b.c компилятору не хватает информации для определения размера массива. Эта информация находится только в a.c, где находится ваш список инициализаторов.
Вам нужно как-то сообщить размер. Один из способов - определить int const с размером и extern. Другой вариант - использовать дозорный (значение за пределами допустимого диапазона данных) для обозначения конца массива.
на мой взгляд, если у вас нет определения и определения с sizeof a в одном файле, он не компилируется.
Файлы компилируются и сохраняются как файлы * .obj / * .a. Вы можете использовать массивы из других файлов благодаря объявлению extern, которое будет проверяться в процессе компоновки после компиляции.
Вы хотите объявить определение (здесь должен помочь препроцессор. Он запускается перед компилятором).
поэтому перед компиляцией вы не получите массив из другого файла ...