gnu make : invalid conversion from const char * to char *

Xomiak09

Инсталлирую софт, установка прерывается, отладчик выдает:
...
 
  
...
[ 63%] Buidling CXX object c++/programs/CMakefiles/squashgenome.dir/squashGenome.cpp.o
/home/user9/progs/GAPipeline-1.5.1/c++/programs/squashGenome.cpp:176 : ошибка: некорректное преобразование из 'const char*' в 'char '
make[3]: *** [c++/programs/CMakefiles/squashgenome.dir/squashGenome.cpp.o] Ошибка 2
...

в файле squashGenome.cpp //176 строка помечена комментарием:
 


#include <stdlib.h>
#include <stdio.h>
#include <fcnt1.h>
#include <sys/mman.h>
#include <unistd.h>
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <dirent.h>
#include <set>
#include "MathComatibility.h"
#include "GlobalUtilities.h"
#include "XMLContentHandler.h"
...
void ouputSizesToXML( const char * dirName, DIR * pDir )
{
const char suffixName[] = ".vld";
char* pSuffixStart;
char numBuffer[20];

string vldFileName, vldFileFullPath;

FILE* pVldFile;
dirent* dirEntry;
...
while ( (dirEntry = readdir(pDir )
{
vldFileName=dirEntry->d_name;
if ( (pSuffixStart=strstr(vldFileName.c_str suffixName ) // 176 строка
{
assert (strlen(pSuffixStart)
==strlen(suffixName;
...
}
...
}
...
}

Соответственно, у меня два вопроса знатокам: 1 ) Что нужно поправить в коде файла, чтоб устранить ошибку (может быть дело обойдется добавлением #include);
 
 2) и как поменять язык gcc дебагера с русского на английский.
К слову, в техсаппорте софта предлагают откатить gcc до версии 4.1.2, текущая же версия на компе gcc 4.4.1. Откатить не удалось, поэтому я правлю файлы, добавляя #include по мере сбоев при инсталляции.

Helga87

const char suffixName[] = ".vld";
char* pSuffixStart
char numBuffer[20];

Почему нет ; после объявления pSuffixStart?

Xomiak09

Я код руками писал, с экрана :) В проге все точки с запятыми на месте.

apl13

#include <cstring>
, кстати, не хватает.

Serab

Зачем путаешь? #include <string.h> надо писать там, если уж так хочется :)

Helga87

Я код руками писал, с экрана
После этого тред надо закрывать. Нельзя искать ошибки в коде, который ты увидел, а не в настоящем.

apl13

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.

apl13

if ( (pSuffixStart=strstr(vldFileName.c_str suffixName ) // 176 строка
{ assert (strlen(pSuffixStart) ==strlen(suffixName;
Нет, они молодцы, конечно. Вместо того чтобы сравнить последние четыре буквы имени с суфиксом... велика и полна чудесами Индия, и многое в ней есть непонятное белому человеку.

Serab

Это я понимаю, но там все остальное инклюдится по-старому, поэтому ни к чему ломать традицию.
Тем более там же написано "backward compatibility", а это как раз старый код :)
Вообще, не обратил внимание на юзание string, но как минимум везде, где я видел cfile'ы реализованы примерно так:

#include <file.h>
namespace std {
using ::somesymb1;
using ::somesymb2;
...
};

поэтому using namespace std необязателен даже получается. Но полагаться на это, понятно, не стоит (хотя как еще можно обмануть линкер, я не знаю, и скорее всего, по-другому в принципе нельзя)

apl13

Это я понимаю, но там все остальное инклюдится по-старому, поэтому ни к чему ломать традицию.
Тем более там же написано "backward compatibility", а это как раз старый код :)
В общем, да. :)

Xomiak09

Поменял <string> на <cstring> - не помогло. Дебаггер выдает ту же мессагу.

Serab

Его не надо менять, надо добавить еще string.h
Но судя по всему и это не поможет (но все же попробуй). Странно. Попробуй вот просто ради интереса добавить такую строчку:

extern "C" const char* strstr( const char*, const char* );

Куда-нибудь ближе к началу файла (после инклюдов, скажем).

Serab

А, ёпты, поправь-ка тип pSuffixStart с char* на const char*
Неужели в версии std автора кода string::c_str возвращает char*?

Xomiak09

1) добавил <string.h> - то же самое
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 *'

:(

Serab

2) с добавленным <string.h> поменял тип pSuffixStart с char * на const char * gcc ругнулось, правда, уже ниже по коду:
О, этого я и боялся. Супер. Чуваки правят строку, которую возвращает c_str. Как-то даже грустно стало. Ну тогда ничего, кроме такого

if ( (pSuffixStart=strstr(const_cast<char*>(vldFileName.c_str suffixName ) // 176 строка

не хочется с этим кодом делать. Ну либо пойми, что они там пытаются сделать (подозреваю, что зарубить расширение и перепиши по-нормальному.
А вообще, что, нету более свежих версий? Просто это пиздец невиданный (ну хотя, гармонично сочетается с поиском суффикса внутри всей строки, да может приводить к веселеньким сайд-эффектам.

Maurog

не там каст разместил. надо перед strstr
ты компилировал свой код? :grin:

Serab

там тоже можно. Но я сделал именно так, потому что это полное сведение к тому пути, который видимо работал у автора строк (вызов перегрузки char* strstr(char*,const char*. Конечно, не компилировал, делать мне еще нечего. А ты? :)

Serab

Кстати, ассёрт в этом коде шикарен, Bachan бы заценил :)

kokoc88

ассёрт в этом коде шикарен
В этом коде шикарна каждая строка, включая присваивание перед if-ом.

Serab

честно говоря, не понимаю, чего шикарного в этой отдельно взятой строчке.

Vadim69

а зачем оно там нужно, если дальше не используется?

Serab

Я за многоточия не ручаюсь.
Тем более, строго говоря оно используется в следующей строчке :)

Vadim69

ну вот в том и дело, что только один раз используется

Serab

Ну это да. Но, во-первых, почти неизвестно, что там в многоточиях, но если не используется, то действительно странно, но:
1) я вверху писал, что не понимаю шикарности именно отдельно взятой строчки;
2) шикарна работа с string'ами методом C-функций работы со строками, а не присваивание string'у C-строки, полученной из C'шного API, это как раз так и надо (если не писать обертки). Таким образом, все равно неясно, что плохого именно в этой строчке, бред дальше.

Vadim69

ну да, этот бред сильнее ненужного присваивания.

rosali

я так и не понял вы между флудом человеку уже починили всё или нет? :)
предлагаю

- char* pSuffixStart;
+ const char* pSuffixStart;

нет, я конешно же тоже не компилировал

Serab

Да мы ему уже помогли как бэ. И это предложение было, и выводы из этой попытки сделаны :)

pitrik2

Я код руками писал, с экрана :) В проге все точки с запятыми на месте.
эээ
нет мышки?
не умеешь мышкой копировать?
нет связи между тем компом на котором компилишь и тем на котором в флокал пишешь?

pitrik2

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

pitrik2

Ну тогда ничего, кроме такого

if ( (pSuffixStart=strstr(const_cast<char*>(vldFileName.c_str suffixName ) // 176 строка

не хочется с этим кодом делать.
ну я бы предложил отстрдапать строчку и если надо то в конце всех изменений переприсвоить назад
хотя что там в троеточий хз, может внешние фукнции зовутся, ну тогда можно после каждого изменения переприсваивать

Xomiak09

2 - я уже объявлял pSuffixStart как const char *, но это не помогло, так как далее по коду, к строке pSuffixStart добавляется нуль-символ.
2 Bowti - объясни поподробней, пожалуйста, что предлагается сделать.

Xomiak09

На всякий случай, вот полный листинг.

tamusyav

1. Вместо
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 больше нигде не используется :)

Serab

ну типа копирование строки идет а не взятие ссылки
но может копия и правда потом будет меняться...
Чиво, простите? Какой ссылки? Там в левой части C++-строка, в правой — сишный char*, какой еще ссылки?
В общем, пускай ответит :)

Serab

ну я бы предложил отстрдапать строчку и если надо то в конце всех изменений переприсвоить назад
хотя что там в троеточий хз, может внешние фукнции зовутся, ну тогда можно после каждого изменения переприсваивать
Твое предложение занимает второе место по ужасу :)
Это C++, тут можно забыть про strdup, malloc, strstr, strcpy и всю прочую хуету, просто выкинуть из головы, забыть, что она существовала и это повысит уровень программиста. Парадокс, да :)

pitrik2

Твое предложение занимает второе место по ужасу
Это C++, тут можно забыть про
ну не знаю
я стараюсь максимально аккуратно в чужой код влезть
раз у них Си стайл лезет во все щели - ну пускай уж так и будет

pitrik2

Чиво, простите? Какой ссылки? Там в левой части C++-строка, в правой — сишный char*
упс, протупил, не заметил что там char*
но пойнт тот же
тип переменной vldFileName - строка - только для того чтобы откопировать изначальную chat * dirEntry->d_name
раз уж потом идет изменение этой строки сишным способом, то в этой строчке как раз и должен быть strdup
char * vldFileName;
...
vldFileName = strdup(dirEntry->d_name);
весь дальнейший код типа таким же остается
free токо не забыть сделать
Оставить комментарий
Имя или ник:
Комментарий: