Отправляет email-рассылки с помощью сервиса Sendsay

Rezound error.

Собираю тему, и в конце концов получаю вот такое:
AStatusComm.h:59: warning: 'class AStatusComm' has virtual functions but
non-virtual destructor
../../src/PoolFile/TStaticPoolAccesser.h: In instantiation of
'TStaticPoolAccesser<uint8_t [20], TPoolFile<sample_pos_t, uint64_t> >':
CrezSoundTranslator.cpp:356: instantiated from here
../../src/PoolFile/TStaticPoolAccesser.h:74: error: function returning
an array
../../src/PoolFile/TStaticPoolAccesser.h: In instantiation of
'TStaticPoolAccesser<uint8_t [24], TPoolFile<sample_pos_t, uint64_t> >':
CrezSoundTranslator.cpp:378: instantiated from here
../../src/PoolFile/TStaticPoolAccesser.h:74: error: function returning
an array
../../src/PoolFile/TStaticPoolAccesser.h: In instantiation of
'TStaticPoolAccesser<uint8_t [25], TPoolFile<sample_pos_t, uint64_t> >':
CrezSoundTranslator.cpp:400: instantiated from here
../../src/PoolFile/TStaticPoolAccesser.h:74: error: function returning
an array
../../src/PoolFile/TStaticPoolAccesser.h: In instantiation of
'TStaticPoolAccesser<uint8_t [132], TPoolFile<sample_pos_t, uint64_t>

../../src/PoolFile/TPoolAccesser.h:31: instantiated from
'TPoolAccesser<uint8_t [132], TPoolFile<sample_pos_t, uint64_t> >'
CrezSoundTranslator.cpp:453: instantiated from here
../../src/PoolFile/TStaticPoolAccesser.h:74: error: function returning
an array
make[3]: *** [CrezSoundTranslator.lo] Error 1
make[3]: Leaving directory `/tmp/rezound-0.12.0beta/src/backend'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/tmp/rezound-0.12.0beta/src/backend'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/tmp/rezound-0.12.0beta/src'
make: *** [all-recursive] Error 1
Я так понимаю, своими силами, я её собрать не смогу: нет чего-либо от
меня зависящего (там недостающие пакеты, и т.д.) - ошибка в проге
"function returning an array"?!

Ответить   Strong Mon, 25 Jul 2005 23:36:01 +0700 (#407104)

 

Ответы:

В сообщении от 1122323761 секунд после начала Эпохи Strong написал(а):

Это следствие несовместимости двух вещей: строгого компилятора (gcc
4.0) и программы, написанной без учета стандартов (Rezound).

Я не слишком силен в C++, но покажите что находится в
`src/PoolFile/TStaticPoolAccesser.h' на 74-ой и ближайших строках, а
так же в `src/backend/CrezSoundTranslator.cpp' на 356-ой и ближайших
строках.

Ответить   Konstantin Korikov Mon, 25 Jul 2005 21:55:57 +0300 (#407198)

 

/* !!! NOTE !!!
* It is very important to use this const subscript operator whenever
* the data is being read but not modified. If you use the non-const
* subscript operator it will cause the block to be flagged as dirty
* and the data will be written back to disk even though it did not
* need to be.
*/
74 inline pool_element_t operator[](const l_addr_t where) const
75 {
... if(where>endAddress || where<startAddress)
{
if(poolFile!=NULL)
cacheBlock(where);
else
throw runtime_error(string(__func__)+" const -- CPoolFile object no
longer exists");
}
return cacheBuffer[where-startAddress];
}

bool CrezSoundTranslator::onLoadSound(const string filename,CSound
*sound) const
{
// after the "Format Info" pool is read, these will be populated with
data from the file
sample_pos_t size=0;
Endians endian=eLittleEndian;
unsigned sampleRate=0;
unsigned channelCount=0;
AudioEncodingTypes audioEncodingType;

CSound::PoolFile_t
loadFromFile(REZOUND_POOLFILE_BLOCKSIZE,REZOUND_POOLFILE_SIGNATURE);
loadFromFile.openFile(filename,false); // we could pass a read-only
flag if there was such a thing???

try
{

// read the meta data pool
{
// check version at the beginning of RFormat and perhaps handle
things differently
uint32_t version=0xffffffff;
loadFromFile.readPoolRaw("Format Info",&version,sizeof(version));
lethe(&version);
if(version==1)
{
// read packed version into p
RFormatInfo1::PackedChunk p;
356 loadFromFile.getPoolAccesser<RFormatInfo1::PackedChunk>("Format
Info").read(&p,1);

358 // unpack from p into r
359 RFormatInfo1 r;
... r.unpack(p);

// use values now in r
if(r.size>MAX_LENGTH)
{
// ??? what should I do? truncate the sound or just error out?
}

size=r.size;
endian=eLittleEndian;
sampleRate=r.sampleRate;
channelCount=r.channelCount;
audioEncodingType=aetPCMSigned16BitInteger;
}
else if(version==2)
{
// read packed version into p
RFormatInfo2::PackedChunk p;
loadFromFile.getPoolAccesser<RFormatInfo2::PackedChunk>("Format
Info").read(&p,1);

// unpack from p into r
RFormatInfo2 r;
r.unpack(p);

// use values now in r
if(r.size>MAX_LENGTH)
{
// ??? what should I do? truncate the sound or just error out?
}

size=r.size;
endian=eLittleEndian;
sampleRate=r.sampleRate;
channelCount=r.channelCount;
audioEncodingType=(AudioEncodingTypes)r.audioEncodingType;
}
else if(version==3)
{
// read packed version into p
RFormatInfo3::PackedChunk p;
loadFromFile.getPoolAccesser<RFormatInfo3::PackedChunk>("Format
Info").read(&p,1);

// unpack values from p into r
RFormatInfo3 r;
r.unpack(p);

// use values now in r
if(r.size>MAX_LENGTH)
{
// ??? what should I do? truncate the sound or just error out?
}

size=r.size;
endian=(Endians)r.endian;
sampleRate=r.sampleRate;
channelCount=r.channelCount;
audioEncodingType=(AudioEncodingTypes)r.audioEncodingType;
}
else ...

Ответить   Strong Tue, 26 Jul 2005 21:25:50 +0700 (#407711)

 

В сообщении от 1122402350 секунд после начала Эпохи Strong написал(а):

Тут я бессилен.

Хотя можно методом тыка узнать что за функция возвращает массив.
Например если

loadFromFile.getPoolAccesser<RFormatInfo1::PackedChunk>("Forma Info");

скомпилируется, то это read(), иначе это
getPoolAccesser<RFormatInfo1::PackedChunk>(). Потом нужно смотреть на
описание и определение этой функции.

Ответить   Konstantin Korikov Wed, 27 Jul 2005 07:43:02 +0300 (#407931)

 

Ясно что несудьба... Как люди проги выкидывают для широкой аудитории...
Тут у этой хоть configure, make есть... а давеча я наткулся на детектор
чистой музыки (определяет источник звука, что на КД пишут пираты), так
там вообще дириктория кучи сёвых исходников в перемешку с библиотеками,
и никакой доки по сборке не наблюдается - и это всё что люди дают!
Но спасибо за потраченное время, силы.
А как думаете, если "сползти" на gcc версией пониже, может помочь, или это в
свою очередь, может за собой другие проги потянуть?

Ответить   Strong Wed, 27 Jul 2005 22:55:28 +0700 (#408378)

 

В сообщении от 1122494128 секунд после начала Эпохи Strong написал(а):

Думаю поможет.

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

Можете еще попытаться связаться с разработчиком этого Rezound, уж он
точно знает что делает строка 356 в файле
`src/backend/CrezSoundTranslator.cpp'. Сообщите ему ваш дистрибутив,
версию gcc, и ошибки, которые он выдает.

Намного проще когда программа написана на C, почему я и люблю этот
язык. К тому же программы на C компилируются раз в 5 быстрее.

Ответить   Konstantin Korikov Wed, 27 Jul 2005 21:53:03 +0300 (#408472)

 

Я тут додумал, может я не правильно tar.gz распаковываю (ну, права
всякие, может ещё чего)... Я пишу просто:
$ gzip -d *.tar.gz
$ tar -xf *.tar
Правильно?

Ответить   Strong Thu, 28 Jul 2005 21:39:18 -0400 (#409028)

 

В сообщении от 1122575958 секунд после начала Эпохи Strong написал(а):

Все правильно вы делаете. Я уже писал что проблема в несовместимости
исходников и компилятора. Это больше проблема исходников, чем
компилятора.

А распаковывать еще можно так:

$ tar -xzf *.tar.gz

Так вить короче.

Ответить   Konstantin Korikov Thu, 28 Jul 2005 20:30:59 +0300 (#409115)

 

Объясните, как это нужно реализовать:
"Try the patch below. Save it in the top or the src tree and run patch [-p1
?] < gcc4.patch"
- где его нужно положить: в верхушке дириктории rezound-0.12.0beta - где configure
лежит?
- Как точно комманда выглядит: "patch -p1 < gcc4.patch"?
- Какой файл мне указать, когда он спрашивает, - на что заплату накладывать?

Ответить   Strong Sat, 30 Jul 2005 19:55:07 -0400 (#410183)

 

В сообщении от 1122742507 секунд после начала Эпохи Strong написал(а):

Если он спрашивает файл, то значит он не может его найти, и значит
что-то не так в командной строке или в самом патче. Патчь
(`gcc4.patch') можно класть в любое место, главное чтобы в командной
строке был указан правильно путь к нему. Лучше чтобы этот файл лежал за
перделами дерева исходников, например, в домашнем каталоге, или на
уровень выше каталога исходников. Какой номер нужно ставить после опции
`-p' зависит от самого патча, точнее от того как он был изготовлен.
Если внутри него имена файлов начинаются с имени каталога верхнего
уровня, например:

rezound-0.12.0beta.orig/some/file
+++ rezound-0.12.0beta/some/file

то после опции `-p' нужно поставить число 1. Это означает что при
поиске файла, который нужно изменить (пропатчить), из его пути,
полученного из patch-файла, нужно удалить один компонент, т.е.
`rezound-0.12.0beta.orig/'. В любом случаи команду `patch' нужно
вызывать находясь в вершине дерева исходников, т.е. там где `configure'.

Ваши действия будут примерно такими:

$ cd /путь/к/rezound-0.12.0beta
$ patch -p1 < /путь/к/gcc4.patch

Возможно вместо `-p1' нужно будет поставить `-p0'.

Ответить   Konstantin Korikov Sat, 30 Jul 2005 18:24:17 +0300 (#410245)

 

В командной строке всё верно - она (заплата) лежит в одно дире с
configure, и запускается от туда же.

В заплате:
1 Index: src/PoolFile/TPoolFile.cpp
2 3 RCS file: /cvsroot/rezound/rezound/src/PoolFile/TPoolFile.cpp,v
4 retrieving revision 1.27
5 diff -c -r1.27 TPoolFile.cpp
6 *** src/PoolFile/TPoolFile.cpp 23 Jun 2004 15:06:55 -0000 1.27
7 src/PoolFile/TPoolFile.cpp 18 Jun 2005 19:48:16 -0000
8 ***************
9 *** 494,516 ****
...

Поэтому командую:
$ patch -p1 < ./gcc4.patch

Получаю:
can't find file to patch at input line 8
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
|Index: src/PoolFile/TPoolFile.cpp
||RCS file: /cvsroot/rezound/rezound/src/PoolFile/TPoolFile.cpp,v
|retrieving revision 1.27
|diff -c -r1.27 TPoolFile.cpp
|*** src/PoolFile/TPoolFile.cpp 23 Jun 2004 15:06:55 -0000 1.27
|src/PoolFile/TPoolFile.cpp 18 Jun 2005 19:48:16 -0000
File to patch:

Файлик существует в src/PoolFile/TPoolFile.cpp - хотя, мне видится он
его залатал?
- Я делаю это до configure/make/make install, да?

Ответить   Strong Mon, 01 Aug 2005 14:47:25 -0400 (#410961)

 

В сообщении от 1122896845 секунд после начала Эпохи Strong написал(а):

В командной строке вить не только указывается путь к файлу. Не правда
ли?

Почему? Имя `src/PoolFile/TPoolFile.cpp' разве содержит имя каталога
верхнего уровня? Тут нужно `-p0'. И патч, как я уже говорил, лучше
чтобы лежал за пределами каталога исходников.

Конечно он его не найдет, вить вы скомандовали искать не
`src/PoolFile/TPoolFile.cpp', а `PoolFile/TPoolFile.cpp'.

Правильно.

Ответить   Konstantin Korikov Mon, 1 Aug 2005 14:57:59 +0300 (#411184)

 

On Mon, 2005-08-01 at 14:57 +0300, Konstantin Korikov wrote:

Так... я что ещё? Это всё что содержит командная строка, - по-крайней
мере я так делаю:
$ patch -p1 < gcc4.patch

Извините за невнимательность. - Получилось.
Только прога всё равно не хочет собираться, правда ошибка хоть
изменилась.
Спасибо за помощь.

Ответить   Strong Mon, 01 Aug 2005 22:30:28 -0400 (#411273)

 

В сообщении от 1122924628 секунд после начала Эпохи Strong написал(а):

| | | | | | |
+-1-+ +2+ | +---4----+
+----3-----+

1 - имя команды;
2 - аргументы команды (в данном случаи, это опция `-p1');
3 - перенаправление ввода;
4 - имя входного файла.

Ответить   Konstantin Korikov Mon, 1 Aug 2005 20:47:25 +0300 (#411434)

 

В сообщении от 1122494128 секунд после начала Эпохи Strong написал(а):

Например, в FC4 на 3-тем диске есть `compat-gcc-32' и
`compat-gcc-32-с++'. Их можно ставить совместно с `gcc' и
`gcc-c++' (которые 4.0), и при необходимости компилировать программы
используя gcc 3.2. Для этого нужно установить переменные окружения `CC'
и `CXX' перед вызовом `configure':

$ CC=gcc32 CXX=g++32 ./configure

Ответить   Konstantin Korikov Sun, 21 Aug 2005 04:42:15 +0300 (#420919)