У меня есть функция, принимающая в качестве аргумента массив int
. Массив int
представляет собой строку, но должен содержать EOF
и поэтому не может иметь тип char[]
. Моя функция выглядит примерно так:
_Bool fun(int str[]) {
// does something involving checking elements for EOF, e.g.:
return (str[0]==EOF);
}
В целях тестирования я хотел бы вызвать fun
со строковым литералом (хотя, естественно, строковый литерал имеет тип char[]
и не сможет содержать EOF
), в действительности:
fun("test");
который будет компилироваться, но с предупреждениями о неправильном типе аргумента. Это ожидаемо, поскольку строковый литерал — char[]
, а аргумент — int[]
.
Я мог бы сделать это:
fun( (int*) "test");
что, вероятно, эквивалентно, просто я делаю приведение явно, те же предупреждения компиляции.
Я читаю, что приведение char*
к int*
не гарантирует работу (ссылка). Что в общем случае естественно, так как если я сейчас попытаюсь записать большое int
в str[some_index]
, то оно может не поместиться - str[some_index]
имеет память, выделенную только под char
(скажите, если я ошибаюсь).
Но так как я не буду делать никаких подобных записей, а просто сравню (и сравнение char и int должно быть в порядке) - я в порядке с любым из вышеперечисленных? Как в этом случае избавиться от предупреждений компиляции? Или как лучше это решить?
Конечно, я мог бы написать простую функцию для копирования массива char
, который дает строковый литерал, в массив int
, значение за значением, но должен быть лучший способ. Такое решение также приведет к пустой трате памяти.
(Кстати - при тестировании с EOF
я сделаю примерно так:
int str[] = {'t', 'e', 's', 't', EOF};
fun(str);
который должен работать нормально.)
'\0'
для обозначения конца строки. - person Jonathan Leffler   schedule 30.12.2012fun
для тестирования.fun
в противном случае работает со стандартным вводом, так что это имеет смысл. @ Трой, не понимаю твоего вопроса. Но посколькуfun
предназначен для работы с данными из стандартного ввода, он обычно не будет двоичным. - person Carl   schedule 30.12.2012fun()
читает изstdin
с помощьюgetchar()
, и я хочу протестироватьfun()
с помощью своей среды модульного тестирования. При тестированииgetchar()
заменяется другой функцией, которая вместо этого считывает символы из массива, который я могу предоставить из своих процедур тестирования. Могут появляться не только значенияchar
, но иEOF
, для которых требуетсяint
. Вот почему мне нужно использовать массивint
для символов. - person Carl   schedule 30.12.2012fun
читает из стандартного ввода с помощью getchar(), но при тестировании fun вместо этого читает из предоставленного int[]. Независимо от того, как я организую функции, при тестировании необходимо предоставить искусственную последовательность целых чисел, предоставленную мной, которая будет считываться вместо чтения со стандартного ввода, и мне все равно нужно будет определить эту последовательность в моих процедурах тестирования. Я хотел бы иметь возможность использовать строковые литералы и EOF в этой последовательности, чтобы она имитировала стандартный ввод. Поэтому я все еще вижу необходимость в возможности комбинировать строковый литерал со значением EOF и передавать его вfun
. - person Carl   schedule 30.12.2012