Я также хочу использовать этот синтаксис для большей проверки типов.
Но я также согласен с тем, что синтаксис и ментальная модель использования указателей проще и легче запомнить.
Вот еще некоторые препятствия, с которыми я столкнулся.
(*p)[]
: void foo(char (*p)[10])
{
char c = (*p)[3];
(*p)[0] = 1;
}
Вместо этого возникает соблазн использовать локальный указатель на символ: void foo(char (*p)[10])
{
char *cp = (char *)p;
char c = cp[3];
cp[0] = 1;
}
Но это частично превзойдет цель использования правильного типа. char a[10];
char (*p)[10] = &a;
Адрес- оператора получает адрес всего массива в &a
, с правильным типом, чтобы назначить его p
. Без оператора a
автоматически преобразуется в адрес первого элемента массива, как и в &a[0]
, который имеет другой тип. Поскольку это автоматическое преобразование уже происходит, я всегда озадачен тем, что &
необходим. Это согласуется с использованием &
для переменных других типов, но я должен помнить, что массив является особым и мне нужен &
, чтобы получить правильный тип адреса, хотя значение адреса одинаково , Одной из причин моей проблемы может быть то, что я узнал K & amp; R C еще в 80-х годах, что еще не позволило использовать оператор &
на всех массивах (хотя некоторые компиляторы игнорировали это или допускали синтаксис). Это, кстати, может быть еще одной причиной, по которой переходы с привязками трудно принять: они работают только с ANSI C, а ограничение оператора &
может быть еще одной причиной считать их слишком неудобными. typedef
является not , используемым для создания типа для указателя на массив (в общем заголовочном файле), тогда глобальный указатель на массив должен более сложная декларация extern
для обмена ею между файлами: fileA:
char (*p)[10];
fileB:
extern char (*p)[10];
Не попробовали его это "разделенным на блоки" ответом, но что-то вроде этого работало бы?
StringBuilder sb = new StringBuilder();
Byte[] buf = new byte[8192];
Stream resStream = response.GetResponseStream();
string tmpString = null;
int count = 0;
do
{
count = resStream.Read(buf, 0, buf.Length);
if(count != 0)
{
tmpString = Encoding.ASCII.GetString(buf, 0, count);
sb.Append(tmpString);
}
}while (count > 0);
Craig, не видя поток, который Вы читаете, немного трудно отладить, но ВОЗМОЖНО Вы могли изменить настройки переменной количества к этому:
count = resStream.Read(buf, 0, buf.Length-1);
Это - определенный взлом, но если последнее чтение уничтожит Вас, и это не возвращает данных затем теоретически, то это избежит проблемы. Я все еще задаюсь вопросом, почему поток делает это.
У меня была та же проблема (который является, как я закончил здесь :-). В конечном счете разысканный он к тому, что разделенный на блоки поток не был допустим - заключительный нулевой блок длины, отсутствовал. Я придумал следующий код, который обрабатывает и допустимые и недопустимые разделенные на блоки потоки.
using (StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
StringBuilder sb = new StringBuilder();
try
{
while (!sr.EndOfStream)
{
sb.Append((char)sr.Read());
}
}
catch (System.IO.IOException)
{ }
string content = sb.ToString();
}