Gde oshibka (C++)

  • Вот функция, которая должна конвертировать имя файла из одной кодировки в другую, а потом обратно (для [VDR]). Первый проход идёт нормально, а при втором из [main()] ерунда приходит. В чём дело?



    ПС. вместо [bukvain = buf] поставить [strcpy(bukvain, buf)] выдаёт [Segmentation fault].

    Файлы

    • converting.zip

      (610 Byte, скачали 5 раз, последнее скачивание: )

    Сообщение было отредактировано 1 раз, последнее редактирование пользователем ispodvala ().

  • Цитата

    Со слов пользователя ispodvala
    ПС. вместо [bukvain = buf] поставить [strcpy(bukvain, buf)] выдаёт [Segmentation fault].


    у тебя конкретная проблема с указателями. в вызовах тех функций, где обрабатываются строки, а не указатели на них. поэтому, в частности, и не работает strcpy().
    если ты действительно так сильно хочешь обработать переменную bukvain, то лучше всего так работать:
    void conv(char &bukvain, bool T) {
    ...
    дальше ты её можешь обрабатывать нормально, путаницы не будет.
    strcpy(bukvain, buf);

  • попробуй так: f,t и cd декларировать в начале, буффер постоянного размера.




    все goto я бы повыкидывал...

  • Спасибо за советы, ещё не успел попробовать. Да, забыл сказать, это всё пробую под [g++].
    Это я пытаюсь изменить код [VeDRa]. Про вызов [by value] и [by reference] я тоже читал, но в оригинальном коде именно так (конечно не значит, что это правильно). И там эта функция [ExchangeChars] тоже два раза подряд вызывается.


    [static char *ExchangeChars(char *s, bool ToFileSystem) ...]


    [... name = ExchangeChars(name, false);]


    И при первом вызове функции, ведь всё работает.

  • Попробовал. С постоянным размером буфера из [main()] передаётся всё правильно, но как только проходит [char* in = bukvain;], строка [bukvain] затирается. И дальше всё по нулям. Пробовал показывать адреса переменных на экране ([printf("%x", &bukvain)], оказывается, он берёт старые адреса, т.е. при выходе из функции не освобождает место.


    Попробуйте, что у вас получается. (Должен быть настроен русский язык с кодировкой, т.е. переменная оболочки типа: [LANG=ru_RU.KOI8-R]).


    Спасибо

  • Почитай C-Entpackt, C/C++ new reference. Там такие случаи с указателями очень хорошо описаны. Разделы: а) передача параметров б) работа с указателями.
    в чистом С нету типа "string", там есть только массив символов.