gnu make : invalid conversion from const char * to char *
const char suffixName[] = ".vld";
char* pSuffixStart
char numBuffer[20];
Почему нет ; после объявления pSuffixStart?
Я код руками писал, с экрана В проге все точки с запятыми на месте.
#include <cstring>, кстати, не хватает.
Зачем путаешь? #include <string.h> надо писать там, если уж так хочется
Я код руками писал, с экранаПосле этого тред надо закрывать. Нельзя искать ошибки в коде, который ты увидел, а не в настоящем.
When including header files for the standard C libraries, it is preferable to use the cfile notation instead of the file.h notation. The file.h notation works, but it is mainly meant for backwards compatibility.The difference between the cfile and file.h notation is that functions included via the file.h notation will appear in the global namespace instead of the std namespace.Хотя пользуясь g++, я никогда не замечал эффектов от последнего предложения. Поскольку в приведенном коде наблюдается string, там и так явно using namespace std.
Нет, они молодцы, конечно. Вместо того чтобы сравнить последние четыре буквы имени с суфиксом... велика и полна чудесами Индия, и многое в ней есть непонятное белому человеку.if ( (pSuffixStart=strstr(vldFileName.c_str suffixName ) // 176 строка
{ assert (strlen(pSuffixStart) ==strlen(suffixName;
Тем более там же написано "backward compatibility", а это как раз старый код
Вообще, не обратил внимание на юзание string, но как минимум везде, где я видел cfile'ы реализованы примерно так:
#include <file.h>
namespace std {
using ::somesymb1;
using ::somesymb2;
...
};
поэтому using namespace std необязателен даже получается. Но полагаться на это, понятно, не стоит (хотя как еще можно обмануть линкер, я не знаю, и скорее всего, по-другому в принципе нельзя)
Это я понимаю, но там все остальное инклюдится по-старому, поэтому ни к чему ломать традицию.В общем, да.
Тем более там же написано "backward compatibility", а это как раз старый код
Поменял <string> на <cstring> - не помогло. Дебаггер выдает ту же мессагу.
Но судя по всему и это не поможет (но все же попробуй). Странно. Попробуй вот просто ради интереса добавить такую строчку:
extern "C" const char* strstr( const char*, const char* );
Куда-нибудь ближе к началу файла (после инклюдов, скажем).
Неужели в версии std автора кода string::c_str возвращает char*?
2) с добавленным <string.h> поменял тип pSuffixStart с char * на const char * gcc ругнулось, правда, уже ниже по коду:
../squashGenome.cpp:206: Error: assignment of read-only location '* pSuffixStart'
в 206 строке:
*pSuffixStart='\0' ;
3) вернул прежний тип pSuffixStart, сразу за инклюдами добавил
extern "C" const char* strstr( const char*, const char* );
gcc выдает :
/usr/include/string.h:333: Error: previous declaration of 'const char* strstr(const char *, const char*)' with 'C++' linkage
/home/.../squashGenome.cpp:36: Error: conflicts with new declaration with 'C' linkage
/home/.. /squashGenome.cpp: In function 'void OutputSizesToXML (const char*, DIR *)' :
/home/.. /squashGenome.cpp:182: Error: invalid conversion from 'const char *' to 'char *'
2) с добавленным <string.h> поменял тип pSuffixStart с char * на const char * gcc ругнулось, правда, уже ниже по коду:О, этого я и боялся. Супер. Чуваки правят строку, которую возвращает c_str. Как-то даже грустно стало. Ну тогда ничего, кроме такого
if ( (pSuffixStart=strstr(const_cast<char*>(vldFileName.c_str suffixName ) // 176 строка
не хочется с этим кодом делать. Ну либо пойми, что они там пытаются сделать (подозреваю, что зарубить расширение и перепиши по-нормальному.
А вообще, что, нету более свежих версий? Просто это пиздец невиданный (ну хотя, гармонично сочетается с поиском суффикса внутри всей строки, да может приводить к веселеньким сайд-эффектам.
ты компилировал свой код?
там тоже можно. Но я сделал именно так, потому что это полное сведение к тому пути, который видимо работал у автора строк (вызов перегрузки char* strstr(char*,const char*. Конечно, не компилировал, делать мне еще нечего. А ты?
Кстати, ассёрт в этом коде шикарен, Bachan бы заценил
ассёрт в этом коде шикаренВ этом коде шикарна каждая строка, включая присваивание перед if-ом.
честно говоря, не понимаю, чего шикарного в этой отдельно взятой строчке.
а зачем оно там нужно, если дальше не используется?
Тем более, строго говоря оно используется в следующей строчке
ну вот в том и дело, что только один раз используется
1) я вверху писал, что не понимаю шикарности именно отдельно взятой строчки;
2) шикарна работа с string'ами методом C-функций работы со строками, а не присваивание string'у C-строки, полученной из C'шного API, это как раз так и надо (если не писать обертки). Таким образом, все равно неясно, что плохого именно в этой строчке, бред дальше.
ну да, этот бред сильнее ненужного присваивания.
предлагаю
- char* pSuffixStart;
+ const char* pSuffixStart;
нет, я конешно же тоже не компилировал
Да мы ему уже помогли как бэ. И это предложение было, и выводы из этой попытки сделаны
Я код руками писал, с экрана В проге все точки с запятыми на месте.эээ
нет мышки?
не умеешь мышкой копировать?
нет связи между тем компом на котором компилишь и тем на котором в флокал пишешь?
честно говоря, не понимаю, чего шикарного в этой отдельно взятой строчке.ну типа копирование строки идет а не взятие ссылки
но может копия и правда потом будет меняться...
Ну тогда ничего, кроме такогону я бы предложил отстрдапать строчку и если надо то в конце всех изменений переприсвоить назад
if ( (pSuffixStart=strstr(const_cast<char*>(vldFileName.c_str suffixName ) // 176 строка
не хочется с этим кодом делать.
хотя что там в троеточий хз, может внешние фукнции зовутся, ну тогда можно после каждого изменения переприсваивать
2 Bowti - объясни поподробней, пожалуйста, что предлагается сделать.
На всякий случай, вот полный листинг.
const char suffixName[] = ".vld";
поставить
const string suffixName = ".vld";
2. Строку
char* pSuffixStart;
убрать.
3. Вместо
if ( (pSuffixStart=strstr(vldFileName.c_strsuffixName )
поставить
if (suffixName.compare(vldFileName.size - suffixName.size suffixName.size vldFileName) == 0)
4. assert в следующей строке убрать.
5. Вместо
*pSuffixStart='\0';
поставить
vldFileName.resize(vldFileName.size - suffixName.size;
И радоваться, что pSuffixStart больше нигде не используется
ну типа копирование строки идет а не взятие ссылкиЧиво, простите? Какой ссылки? Там в левой части C++-строка, в правой — сишный char*, какой еще ссылки?
но может копия и правда потом будет меняться...
В общем, пускай ответит
ну я бы предложил отстрдапать строчку и если надо то в конце всех изменений переприсвоить назадТвое предложение занимает второе место по ужасу
хотя что там в троеточий хз, может внешние фукнции зовутся, ну тогда можно после каждого изменения переприсваивать
Это C++, тут можно забыть про strdup, malloc, strstr, strcpy и всю прочую хуету, просто выкинуть из головы, забыть, что она существовала и это повысит уровень программиста. Парадокс, да
Твое предложение занимает второе место по ужасуну не знаю
Это C++, тут можно забыть про
я стараюсь максимально аккуратно в чужой код влезть
раз у них Си стайл лезет во все щели - ну пускай уж так и будет
Чиво, простите? Какой ссылки? Там в левой части C++-строка, в правой — сишный char*упс, протупил, не заметил что там char*
но пойнт тот же
тип переменной vldFileName - строка - только для того чтобы откопировать изначальную chat * dirEntry->d_name
раз уж потом идет изменение этой строки сишным способом, то в этой строчке как раз и должен быть strdup
char * vldFileName;
...
vldFileName = strdup(dirEntry->d_name);
весь дальнейший код типа таким же остается
free токо не забыть сделать
Оставить комментарий
Xomiak09
Инсталлирую софт, установка прерывается, отладчик выдает:...
в файле squashGenome.cpp //176 строка помечена комментарием:
Соответственно, у меня два вопроса знатокам: 1 ) Что нужно поправить в коде файла, чтоб устранить ошибку (может быть дело обойдется добавлением #include);
2) и как поменять язык gcc дебагера с русского на английский.
К слову, в техсаппорте софта предлагают откатить gcc до версии 4.1.2, текущая же версия на компе gcc 4.4.1. Откатить не удалось, поэтому я правлю файлы, добавляя #include по мере сбоев при инсталляции.