Проблема банальна, решения точного не существует. Меня интересует, кто что думает о лучшем решении.
В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно. Она не может внутри себя иметь пробелов и может их иметь в конце (но может не иметь). Если пробелы в конце есть — первый из них рассматривается как конец строки.
Эту строку надо сравнить с массивом других и найти равную.
Ясно, что точного решения нет, но что лучше всего сделать ?
Изменения в строке делать нельзя (например) искать пробел и встроить на его место ноль), так как строка может храниться на странице read-only. Копировать можно, но опять-таки где ее конец — сказать трудно.
Свое решение не привожу, интересно, кто что скажет.
PD>Свое решение не привожу, интересно, кто что скажет.
такой вопрос, а возможно на паскале сделать функцию StrCmp которую экспортировать, для дальнейшего использования в C? тогда отпадет вообще надобность о знании внутреннем устройстве стороки Фортрана...
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Уважаемый Олл!
PD>Проблема банальна, решения точного не существует. Меня интересует, кто что думает о лучшем решении.
PD>В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно. Она не может внутри себя иметь пробелов и может их иметь в конце (но может не иметь). Если пробелы в конце есть — первый из них рассматривается как конец строки.
PD>Эту строку надо сравнить с массивом других и найти равную.
PD>Ясно, что точного решения нет, но что лучше всего сделать ?
PD>Изменения в строке делать нельзя (например) искать пробел и встроить на его место ноль), так как строка может храниться на странице read-only. Копировать можно, но опять-таки где ее конец — сказать трудно.
PD>Свое решение не привожу, интересно, кто что скажет.
//попробуем угадать максимальный размер строкиchar stringCopy[MAX_STRING_SIZE];
//в принципе, здесь можно сначала проверить имею-ли я доступ к этому куску памяти...
memcpy(&stringCopy[0],srcString,MAX_STRING_SIZE-1);
stringCopy[MAX_STRING_SIZE-1] = 0;
// а потом еще проверяем на пробелы, ну и т.д.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно. Она не может внутри себя иметь пробелов и может их иметь в конце (но может не иметь). Если пробелы в конце есть — первый из них рассматривается как конец строки.
PD>Эту строку надо сравнить с массивом других и найти равную. PD>Ясно, что точного решения нет, но что лучше всего сделать ?
PD>Изменения в строке делать нельзя (например) искать пробел и встроить на его место ноль), так как строка может храниться на странице read-only. Копировать можно, но опять-таки где ее конец — сказать трудно.
А изменить код можно? Чтобы он передавал в C — функцию char* и длину строки?
PD>Эту строку надо сравнить с массивом других и найти равную.
PD>Ясно, что точного решения нет, но что лучше всего сделать ?
Первое, что приходит в голову — нужно определить длину строки, например, поискать закономерности в символах поступающих в строку. Если брать сам алгоритм, то производить проверки до первого пробела или до первого некорректного символа, или до первого нуля, или до завершения известной строки. Получится от нуля до n строк. Если n, то наверное включить генератор случайных чисел .
Здравствуйте, ssm, Вы писали:
ssm>такой вопрос, а возможно на паскале сделать функцию StrCmp которую экспортировать, для дальнейшего использования в C? тогда отпадет вообще надобность о знании внутреннем устройстве стороки Фортрана...
Когда-то давно смотрел, как устроены строки в MS Fortran 5.0. Компилятор брал константу из объявления строки и везде в дальнейшем подставлял непосредственное значение. Я, когда подобное делал, знал, как объявлены строки в Фортране, поэтому такой проблемы у меня не возникало. Если был доступен исходник Фортран-программы, объявлял строку как С-строку, тогда к ней добавлялся 0 в конце. Правда, я и сейчас не знаю, вошло ли это в стандарт Фортрана.
AFAIK, в строках Паскаля длина хранится в начале строки. И потом, использовать еще один язык, imho, лишнее.
Re: char*
От:
Аноним
Дата:
04.04.05 11:06
Оценка:
PD>В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно.
А разве в Фортране строки заканчиваются не на '$' ?
Pavel Dvorkin wrote:
> В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно. Она не может внутри себя иметь пробелов и может их иметь в конце (но может не иметь). Если пробелы в конце есть — первый из них рассматривается как конец строки.
А если нет пробелов в конце? Как гарантированно определить конец строки?
ssm>это была описка по поводу паскаля, я имел в виду Фортран
Да, я увидел твою поправку после того, как отправил свой пост. В Фортране, AFAIR, есть функция LEN, возвращающая длину строки. Проблема в том, что возвращает она объявленную, а не фактическую длину. Откровенно говоря, не помню, что происходит при перезаписи в строку, мусор с прошлого раза, imho, не остается. Как-нибудь этим воспользоваться. Но максимальную длину знать не помешает.
Re: char*
От:
Аноним
Дата:
04.04.05 12:37
Оценка:
менять надо....
Одно можно сказать уверенно.
Осторожнее с этой "библиотекой" на фортране, если уж такая оплошность вылезла тогда сложно даже догадаться что там еще есть.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Уважаемый Олл!
PD>Проблема банальна, решения точного не существует. Меня интересует, кто что думает о лучшем решении.
PD>В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно. Она не может внутри себя иметь пробелов и может их иметь в конце (но может не иметь). Если пробелы в конце есть — первый из них рассматривается как конец строки.
PD>Эту строку надо сравнить с массивом других и найти равную.
PD>Ясно, что точного решения нет, но что лучше всего сделать ?
PD>Изменения в строке делать нельзя (например) искать пробел и встроить на его место ноль), так как строка может храниться на странице read-only. Копировать можно, но опять-таки где ее конец — сказать трудно.
PD>Свое решение не привожу, интересно, кто что скажет.
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, Pavel Dvorkin, Вы писали:
RB>Передать вместе со строкой ее длину, конечно, нельзя?
Хе-хе... Иногда она передается сама, хоть я и не просил — если пытаюсь возвращать из C функции строку. В этом случае возвращаемая строка в С функции оказывается в виде двух ВХОДНЫХ параметров — строка и длина. Я сегодня соорудил такую функцию, у нее в С 4 аргумента, а в Фортране — 2
А в обычном случае — не передается. И передать сам не могу, т.к. не знаю, а знал бы — не хочу.
Здравствуйте, Privalov, Вы писали:
P>Здравствуйте, ssm, Вы писали:
P>Когда-то давно смотрел, как устроены строки в MS Fortran 5.0. Компилятор брал константу из объявления строки и везде в дальнейшем подставлял непосредственное значение. Я, когда подобное делал, знал, как объявлены строки в Фортране, поэтому такой проблемы у меня не возникало. Если был доступен исходник Фортран-программы, объявлял строку как С-строку, тогда к ней добавлялся 0 в конце. Правда, я и сейчас не знаю, вошло ли это в стандарт Фортрана.
Да, это я и делаю. Но вдруг юзер забудет добавить C в конце...
SL>char stringCopy[MAX_STRING_SIZE];
SL>//в принципе, здесь можно сначала проверить имею-ли я доступ к этому куску памяти...
SL>memcpy(&stringCopy[0],srcString,MAX_STRING_SIZE-1);
Здесь и на AV недолго нарваться... Откуда ты знаешь, что из srcString можно копировать MAX_STRING_SIZE-1 ?
zuv>Первое, что приходит в голову — нужно определить длину строки, например, поискать закономерности в символах поступающих в строку. Если брать сам алгоритм, то производить проверки до первого пробела или до первого некорректного символа, или до первого нуля,
Здравствуйте, Аноним, Вы писали:
PD>>В функцию передается указатель char*. Он показывает на строку, но она может быть не закончена нулем. Ничего не поделаешь — строка передается из Фортрана, там это не обязательно.
А>А разве в Фортране строки заканчиваются не на '$' ?
Это в Бейсике ИМЕНА текстовых переменных заканчиваются $
Здравствуйте, Аноним, Вы писали:
А>менять надо....
что или кого ?
А>Одно можно сказать уверенно. А>Осторожнее с этой "библиотекой" на фортране, если уж такая оплошность вылезла тогда сложно даже догадаться что там еще есть.