Как я могу создать файлы EPS в C#?

Как Мелпомена и Ален предложили в комментариях, ваши проблемы связаны с отсутствием NULL-терминаторов в ваших строках. Из вашего комментария, я полагаю, вы можете использовать класс C ++ String, который хранит свойства, которые сообщают вам размер строки сразу. Однако в Си строки - это просто массивы символов в памяти, и не существует непосредственного способа определить их длину, кроме подсчета символов, пока мы не достигнем значения NULL (0x00).

Вот почему strcpy делает неприятные вещи в вашем коде, когда копирует строки, он начинает копировать байты в памяти, пока не достигнет нулевого символа и не вернется. В вашем случае он не найдет нулевой символ сразу и продолжит копирование, пока не найдет его в вашей памяти и не подпишет другие переменные.

Я вижу в вашем коде, что некоторые из ваших строк предназначены для фиксированного размера, и нулевой символ может быть избыточным. В этом случае, когда вы знаете размер строки (либо потому, что вы жестко ее кодируете, либо сохраняете ее в некоторой переменной), вам нужна функция memcpy. Он просто скопирует установленное количество байтов с одного адреса на другой, не полагаясь на нулевые терминаторы. НО Serial.print будет по-прежнему ожидать, что нулевые терминаторы будут печатать его, поэтому вам также придется это изменить.

Самое простое решение - просто оставить больше места в строках. Например, если вы хотите создать строку «abc» , вам следует использовать char myString[4] = "abc". Компилятор автоматически заполняет память, начиная с myString, 0x61 0x62 0x63 0x00, поскольку компилятор знает, что в C строки (отмеченные ") должны заканчиваться нулем, вы должны предоставить только один дополнительный байт для нулевого значения. терминатор. Если ваша строка будет иметь переменную длину, вы должны предоставить достаточно памяти для сценария наихудшего случая плюс нулевой терминатор, чтобы ваша переменная x могла извлечь выгоду из более чем 21 байта. Вы не можете изменить этот размер позже, но то, что определяет длину вашей строки, это нулевой терминатор, а не объем памяти, который он зарезервировал.

Строки этой формы, однако:

char gva_testTime[6] = {'H', 'H', 'M', 'M', 'S', 'S'};

не будет не включать нулевой символ, потому что вместо строки вы объявили массив символов. Если вы хотите использовать strcpy или strtok в этой переменной, вам нужно будет включить нулевой терминатор самостоятельно:

char gva_testTime[7] = {'H', 'H', 'M', 'M', 'S', 'S', 0};

Или объявить его в виде строки:

char gva_testTime[7] = "HHMMSS";

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

5
задан yoyoyoyosef 28 October 2008 в 12:21
поделиться

2 ответа

Можно использовать тот же принцип, как я предложил в HTML вопросу о Постскриптуме здесь: html-to-postscript-conversion

Это неуклюже для установки, но после того как это сделано, это работает вполне хорошо. Если у Вас нет драйвера принтера, который создает файлы EPS, можно загрузить часть бесплатного программного обеспечения драйвера принтера создателя PDF. Я полагаю, что некоторые из них позволяют Вам создавать файлы EPS также.

2
ответ дан 15 December 2019 в 01:14
поделиться

Каирская библиотека http://www.cairographics.org генерирует все виды графических форматов, svf, PDF или PS, например, и она имеет привязку для c#, я думаю.

2
ответ дан 15 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: