Хорошо, я собираюсь сохранить это простым и не включать весь код (пока), если мне не нужно. Мои внутренние чувства говорят мне, что, возможно, есть простой ответ на этот вопрос, и я, как обычно, упустил его. Более неопытные могут сказать, что проблема в компиляторе, но я никогда не знал, что в 99,999% случаев это всегда было ошибкой с моей стороны, так что … вот вопрос.
У меня есть программа, эта программа должна выводить две строки, ничего особенного
TCHAR* firststring = _T("FirstValue");
TCHAR* secondstring = _T("SecondValue");
_tprintf(_T("%s\n"),firststring);
_tprintf(_T("%s\n"),secondstring);
какие выводы ..
firststring
в определенном разделе моего кода это не работает (это работает в другом месте), ЕСЛИ Я не перешагиваю отладку … тогда это хорошо …
firststring
secondstring
Я даже попытался объединить операцию в одну, выполнив это:
_tprintf(_T("%s\n[%s]\n"),firststring,secondstring);
Мой результат — первая строка и фигурные скобки, чтобы попытаться указать, что строка пытается распечатать, и если она пуста, и т. Д. Я получаю этот вывод:
firststring
]
и это все .. опять же, ЕСЛИ НЕ пошаговая отладка, тогда все нормально и модно:
firststring
[secondstring]
кто-нибудь когда-нибудь слышал о такой проблеме? В последний раз, когда я сталкивался с такими странными проблемами, это было в дни ASM с выравниванием сегментов, но я сомневаюсь, что это так, хотя я не уверен во внутренней работе _tprintf … Я собираюсь попробовать это снова, если никто не знает, я приму это из-за ошибки, вызванной кодом ранее. Главный вопрос заключается в том, происходит ли это по какой-то простой причине или это просто указывает на проблемы в программе, вот и все. Спасибо за ваш ответ.
PS: я понимаю, что не предоставил достаточного количества кода, чтобы полностью ответить на проблему, но вопрос в том, есть ли известная простая причина для такого поведения в отладчике (запуск или перешагивание). Точка останова установлена на уровне функций, я использую Visual Studio 2008. Следующие версии компилятора:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 80x86
Microsoft (R) Macro Assembler Version 9.00.21022.08
Microsoft (R) Incremental Linker Version 9.00.21022.08
Microsoft (R) Windows (R) Resource Compiler Version 6.0.5724.0
Microsoft Browse Information Maintenance Utility Version 9.00.21022
Microsoft (R) Manifest Tool version 5.2.3790.2075
Позже я решил эту проблему, изменив эти строки с TCHAR * на const TCHAR *
при использовании строк, доступных только для чтения, якобы не определено поведение для записи массива строк со строковым литералом. Я не уверен, было ли это потому, что сам документ хранился как Unicode
или если бы это даже сыграло свою роль, но я научился трудному способу не назначать так. И если бы мне нужно было писать в эти места, я бы использовал отдельную константную строку и скопировал ее содержимое с помощью strcpy, когда мне это было нужно, в буфер чтения / записи. Очевидно, что если этого не сделать, в коде могут появиться дыры в безопасности и другие подводные камни, даже если это было просто.
(ниже мои рассуждения только по частичному коду — наведите курсор мыши, если интересно)
Что касается примера кода, который не был завершен, то это был очень большой проект с тысячами и тысячами строк кода, и я почти не ожидал, что кто-то здесь займет ЭТО много времени, чтобы пройти через все это. В конце концов, это не похоже на то, что кому-то здесь платят за это, и мне действительно нужно было выяснить, был ли это я, или это было обычным делом, и если это было обычным делом, как это исправить. Когда мы задаем вопросы здесь, мы не только задаем вопрос, но мы также даем руководящие указания относительно того, насколько широкой области мы ожидаем, ответ будет, и ни в коем случае мы не ожидаем, что кто-то будет ясным, как некоторые, кажется, предложить. Если вы не хотите отвечать на вопрос или у вас недостаточно информации для этого, просто сделайте это не так просто (это потому, что у нас нет всей информации, которую мы запрашиваем в первую очередь) ,
Других решений пока нет …