Страниц: [1] 2
  Печать  
Автор Тема: Проблемы с шаблоном.  (Прочитано 12743 раз)
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« : Июля 09, 2007, 08:25:59 pm »

Уважаемые посетители форума,ситуация такая:
-Есть шаблон:
//----------------------------------------------
template<class T>
void cashtest_shabl(value_cycles *pstrt, value_static *staticstrt, uint_t numcycls)
{
   double cycle1;
   double cycle2;
   uint_t elemsize = sizeof(T) * SIZE_MEM;
   
   T y = (T)0;
   T x = (T)1;
   
   printf( "Long double size is: %d bits.
", sizeof(T) * 8 );
         
   /* snap the time */
    cycle1 = ClockCycles(); //стартуем
   for( uint_t i = 0; i < SIZE_MEM; i++ )
   {
      x = y;
   }
   /* snap the time again */
    cycle2 = ClockCycles(); //засекаем   
    double num_cycles_mem = cycle2 - cycle1;
   staticstrt->num_sec_96cash = (double)num_cycles_mem / pstrt->cycles_per_sec;
   staticstrt->num_speed_96cash = elemsize * pstrt->cycles_per_sec / num_cycles_mem / 1024;     
   printf( " Speed is = %0.3f Kb/sec
", staticstrt->num_speed_96cash );*/
      
};
//*******************************************************
-При вызове его из тела main
//*******************************************************
cashtest_shabl<long double>(pstrt,staticstrt,numcycls)
//*******************************************************
именно в єтом месте,при компиляции, выдаёт ошибку: INSTANTIETED FROM HERE
Что самое интересное когда тело ф-и пустое то компилит без ошибки, а когда там есть хотя-бы одна строка кода ошибка появляется...

-И еще одна ошибка появляется, которую сложно характеризировать.... В месте
        cycle1 = ClockCycles(); //стартуем
   for( uint_t i = 0; i < SIZE_MEM; i++ )
   {
      x = y;
   }
Появляесться тоже ошибка `volatile' undeclared(first use this function)...
Никто не знает как это исправить?
P.S. Писалось все под
QNX® Momentics® Integrated Development Environment

Version: 3.0.0
Build id: 200509222156
Установленой в Windows XP
Под QNX-ом ошибки теже...
Записан
VladK
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #1 : Июля 09, 2007, 10:55:55 pm »

Приведите полный текст ошибки, то что после "instantiated from here...".
Записан
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #2 : Июля 10, 2007, 12:12:55 am »

Суть в том что это и есть полный код ошибки
Мне нет смысла давать вам не полную информацию о проблеме!
Записан
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #3 : Июля 10, 2007, 12:21:13 am »

Тоесть ошибка "instantiated from here" указывает на строку вызова шаблонной функции:
cashtest_shabl<long double>(pstrt,staticstrt,numcycls).
Как я догадываюсь, конечно это может быть не так, вызывать такую ф-ю нужно как-то по другому потому что при написании других шаблонных функций проблема та же. А вот как мне не известно... и help-a к сожалению молчит
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #4 : Июля 10, 2007, 02:27:32 am »

Hagen_001
<i>P.S. Писалось все под
</i>


1. версия компилятора? 2.95 / 3.3.x ?

2.
value_cycles *pstrt, value_static *staticstrt,

- а это что за типы?: value_cycles? value_static?
- это полный пример?
Записан
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #5 : Июля 10, 2007, 02:45:01 am »

To Olej:
1.QNX® Momentics® Integrated Development Environment
Version: 3.0.0
Build id: 200509222156

2.а это что за типы?: value_cycles? value_static?

#ifndef _DEFTEST_H_
#define _DEFTEST_H_

#include <stdlib.h>
#include <stdio.h>
#include <sys/neutrino.h>
#include <inttypes.h>
#include <math.h>
#include <sys/syspage.h>
#include <inttypes.h>
#include <sys/procfs.h>
#include <fcntl.h>
#include <sys/times.h>
#include <sys/siginfo.h>
#include <signal.h>
#include <time.h>
#include <sys/netmgr.h>
#include <math.h>

typedef unsigned int uint_t;

 typedef struct value_cycles_t
{
   double    num_cycles;
   double    cycles_per_sec;
   
   double   num_cycles_add;
   double   num_cycles_sub;
   double   num_cycles_ mul;
   double   num_cycles_div;   
   
   double   num_cycles_64add;
   double   num_cycles_64sub;
    double   num_cycles_64mul;
   double   num_cycles_64div;   
   
   double   num_cycles_32add;
   doubl e   num_cycles_32sub;
   double   num_cycles_32mul;
   double   num_cycles_32div;
   
   double   num_ cycles_16add;
   double   num_cycles_16sub;
   double   num_cycles_16mul;
   double   num_cycles_16 div;
   
   double   num_cycles_8add;
   double   num_cycles_8sub;
   double   num_cycles_8mul;
   do uble   num_cycles_8div;
}  value_cycles;
typedef struct value_static_t
{
   double   num_sec_add;
   double   num_sec_sub;
   double   num_sec_mul;
   doub le   num_sec_div;
   double   num_sec_64add;
   double   num_sec_64sub;
   double   num_sec_64mul;
    double   num_sec_64div;
   double   num_sec_32add;
   double   num_sec_32sub;
   double   num_sec_32m ul;
   double   num_sec_32div;      
   double   num_sec_16add;
   double   num_sec_16sub;
   double   num _sec_16mul;
   double   num_sec_16div;   
   double   num_sec_8add;
   double   num_sec_8sub;
   doubl e   num_sec_8mul;
   double   num_sec_8div;   
   
   double   num_oper_add;
   double   num_oper_sub;
    double   num_oper_mul;
   double   num_oper_div;   
   double   num_oper_64add;
   double   num_oper_6 4sub;
   double   num_oper_64mul;
   double   num_oper_64div;   
   double   num_oper_32add;
   double    num_oper_32sub;
   double   num_oper_32mul;
   double   num_oper_32div;   
   double   num_oper_16ad d;
   double   num_oper_16sub;
   double   num_oper_16mul;
   double   num_oper_16div;   
   double   nu m_oper_8add;
   double   num_oper_8sub;
   double   num_oper_8mul;
   double   num_oper_8div;   
   
    double  num_cycloper_add;
   double num_cycloper_sub;
   double num_cycloper_mul;
   double num_cycloper_div;   
   double num_cycloper_64add;
   double num_cycloper_64sub;
   double num_cycloper_64mul;
   double num_cycloper_64div;   
   double num_cycloper_32add;
   double num_cycloper_32sub;
   double num_cycloper_32mul;
   double num_cycloper_32div;   
   double num_cycloper_16add;
   double num_cycloper_16sub;
   double num_cycloper_16mul;
   double num_cycloper_16div;   
   double num_cycloper_8add;
   double num_cycloper_8sub;
   double num_cycloper_8mul;
   double num_cycloper_8div;
   
   double num_sec_80mem1;
   double num_speed_80mem1;
   double num_sec_80mem2;
   double num_speed_80mem2;
   double num_sec_80mem3;
   double num_speed_80mem3;
   double num_sec_80mem4;
   double num_speed_80mem4;
   double num_sec_64mem1;
   double num_speed_64mem1;
   double num_sec_64mem2;
   double num_speed_64mem2;
   double num_sec_64mem3;
   double num_speed_64mem3;
   double num_sec_64mem4;
   double num_speed_64mem4;
   double num_sec_32mem1;
   double num_speed_32mem1;
   double num_sec_32mem2;
   double num_speed_32mem2;
   double num_sec_32mem3;
   double num_speed_32mem3;
   double num_sec_32mem4;
   double num_speed_32mem4;
   double num_sec_16mem1;
   double num_speed_16mem1;
   double num_sec_16mem2;
   double num_speed_16mem2;
   double num_sec_16mem3;
   double num_speed_16mem3;
   double num_sec_16mem4;
   double num_speed_16mem4;
   double num_sec_8mem1;
   double num_speed_8mem1;
   double num_sec_8mem2;
   double num_speed_8mem2;
   double num_sec_8mem3;
   double num_speed_8mem3;
   double num_sec_8mem4;
   double num_speed_8mem4;
   double num_sec_96cash;
   double num_speed_96cash;
   double num_sec_64cash;
   double num_speed_64cash;
   double num_sec_32cash;
   double num_speed_32cash;
   double num_sec_16cash;
   double num_speed_16cash;
   double num_sec_8cash;
   double num_speed_8cash;
   
} value_static;
#define      SUCCESS      1
#define      NOSUCCESS   0
#define     SIZE_MEM    2000000
template<class T>void cashtest_shabl(value_cycles *pstrt, value_static *staticstrt, uint_t numcycls);
#endif //_DEFTEST_H_
Записан
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #6 : Июля 10, 2007, 02:57:15 am »

- это полный пример?


Самое интересное что даже такой код:
//********************************************
Template<class T>void funtest()
{
   T Ttype;
}
int main(int argc, char *argv[])
{
  funtest<int>();
  return EXIT_SUCCESS;
}
//********************************************
выдаёт ошибку:"INSTANTIETED FROM HERE"
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #7 : Июля 10, 2007, 02:31:36 pm »

Hagen_001
1.QNX® Momentics® Integrated Development Environment
Version: 3.0.0
Build id: 200509222156


- я спрашивал версию компилятора - у вас их 2: 2.95.3 & 3.3.5 (или 3.3.1 если SP2 не стоит), например так:

# qcc -v
cc: looking for gcc_ntox86 in /usr/qnx630/host/qnx6/x86/etc/qcc/gcc/3.3.5/gcc_ntox86++.conf
cc: looking for gcc_ntox86 in /usr/qnx630/host/qnx6/x86/etc/qcc/gcc/3.3.5/gcc_ntox86.conf
cc: no files to process

- видно, что у меня по умолчанию используется 3.3.5;
- у вас, скорее всего - 2.95.3;
- версии отличаются совместимостью с ASII: что работает в одной - синтаксически может быть некорректно в другой, и наоборот... относительно template это особенно проявляется.
- но это "тонкие эффекты", здесь до этого дело ещё не дошло:

Hagen_001
выдаёт ошибку:"INSTANTIETED FROM HERE"


- не выдаёт!


#include <stdlib.h>
#include <iostream>

using std::cout;
using std::endl;

template<class T> void funtest( void) {
   T Ttype;
   cout << sizeof( T ) << endl;
};

int main( int argc, char* argv[] ) {
   funtest<int>();
   funtest<double>();
   exit( EXIT_SUCCESS );
};


- это ваш пример? А теперь:

1.make-файл для версии 3.3.5 (make3):

CC = QCC -V3.3.1,gcc_ntox86 -Y_gpp -Wno-deprecated
CFLAGS = -fexceptions -O3 -I/usr/include
all:    tp3-1
.SUFFIXES:  .cc
.cc:
        $(CC) $(CFLAGS) $< -o $@
        strip   $@

- я специально неточно указываю версию, чтобы получить сообщение:
# make -fmake3
QCC -V3.3.1,gcc_ntox86 -Y_gpp -Wno-deprecated -fexceptions -O3 -I/usr/include tp3-1.cc -o tp3-1
cc: warning - requested version 3.3.1, using version 3.3.5
strip   tp3-1
# tp3-1
4
8

2. теперь то же самое для версии 2.95.3 :

CC = QCC -V2.95.2,gcc_ntox86 -Y_gpp -Wno-deprecated
CFLAGS = -fexceptions -O3 -I/usr/include
all:    tp2-1
.SUFFIXES:  .cc
.cc:
        $(CC) $(CFLAGS) $< -o $@
        strip   $@

- tp2-1.cc & tp3-1.cc - это эквивалентные файлы, с содержимым нарисованным выше.

# make -fmake2
QCC -V2.95.2,gcc_ntox86 -Y_gpp -Wno-deprecated -fexceptions -O3 -I/usr/include tp2-1.cc -o tp2-1
cc: warning - requested version 2.95.2, using version 2.95.3
strip   tp2-1
# tp2-1
4
8

P.S. всё показанное скопировано с терминала.
Записан
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #8 : Июля 10, 2007, 02:54:53 pm »

Да,действительно версия 2.95.3... Значит ошибка из-за не той версии компилятора...
А вы не знаете как можно пропатчить мою версию компилятора чтобы не выдавало ошибку?
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #9 : Июля 10, 2007, 03:23:38 pm »

Hagen_001
Да,действительно версия 2.95.3... Значит ошибка из-за не той версии компилятора...


Я не думаю, что всё так просто - я же вам привёл пример и в 2.95.3 и в 3.3.5, и оба дают вразумительный и предсказуемый результат. Но вести себя будут компиляторы в более сложных случаях - по разному.
Достаточно часто я видел ошибку: "instantiated from here...", когда компилируешь template-код 2.95.3 по недосмотру, который месяцами успешно компилировался 3.3.5.
Но гораздо чаще это бывает, когда есть какие-то синтаксические несоответствия с самим типом T, от которого производится шаблон - в первую очередь стоит поиграться с программой с определениями типа Т но без шаблонов.

Hagen_001
А вы не знаете как можно пропатчить мою версию компилятора чтобы не выдавало ошибку?


Знаю

Есть 2 (а может и больше) способов:

1.явно указывать требуемую версию в Makefile для конкретной компиляции, ключ: -V3.3.1,gcc_ntox86 (и -Y_gpp посмотрите, не лишнее будет), и вообще:
# use QCC
- там всё есть.

2. определить используемую версию по умолчанию:
- в /usr/qnx630/host/qnx6/x86/etc/qcc/gcc у вас есть файл default;
- его содержимое примерно такое:
DIR=2.95.3
- переименуйте его (пригдится ) в default.old, а в default впишите:
DIR=3.3.5

Во 2-м способе можете иметь некоторые неприятности с PhAB приложениями ... не столько с -V3.3.1,gcc_ntox86, сколько с GNU библиотеками: -Y_gpp - я не знаю способа собрать Photon приложение с GNU библиотеками - может это просто невозможно?

Об том же подробнее:
http://qnxclub.net/modules.php?name=Forums&file=viewtopic&t=332
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #10 : Июля 10, 2007, 03:27:39 pm »

Olej
версию компилятора - у вас их 2: 2.95.3 & 3.3.5 (или 3.3.1 если SP2 не стоит),


Имеющиеся у вас альтернативы можете точно посмотреть:
# QCC -V
(именно V большое).
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #11 : Июля 10, 2007, 04:02:33 pm »

По примеру кода + ещё одно соображение, не имеющее отношения к самому вопросу, вот это место:
Hagen_001

double cycle1;
double cycle2;

/* snap the time */
cycle1 = ClockCycles(); //стартуем
for( uint_t i = 0; i < SIZE_MEM; i++ )
{
x = y;
}
/* snap the time again */
cycle2 = ClockCycles(); //засекаем
double num_cycles_mem = cycle2 - cycle1;

- если временные интервалы, которые вы собираетесь мерять - достаточно большие, то лучше использовать time_t - системное время;
- а если - малые, и с высокой точностью (для чено и процессорные циклы), то тогда вы в измерения свои включаете и время преобразований величин uint64_t -> double;
- как по мне, то лучше так:

static uint64_t cps = SYSPAGE_ENTRY(qtime)->cycles_per_sec;
static double c2s = 1.0E9 / cps;
...
uint64_t cycle1 = ClockCycles(); //стартуем;
// бла-бла-бла... меряем
cycle1 = ClockCycles() - cycle1;
double num_cycles_mem = cycle1 * c2s;

- что-то такое ...
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #12 : Июля 10, 2007, 04:19:53 pm »

Olej
1. версия компилятора? 2.95 / 3.3.x ?

Обратите внимание ещё вот на это ( если ещё не обратили ) - GCC 4.x :
http://qnx.org.ru/viewthread10n4927.html
- это очень интересно;
- но с этим придётся повозиться;
- + выверить всё тщательнейше, относительно библиотек, в первую очередь, потому как все риски здесь вы берёте на себя.
Записан
Hagen_001
Участник
*
Offline Offline

Сообщений: 0


Просмотр профиля
« Ответ #13 : Июля 10, 2007, 05:12:37 pm »

Огромное спасибо за помощь!
Изменил версию компилятора в файле вручную первым методом пока не пользовался... нужно разбираться...
А пока всё компилит....
С материалом который вы подкинули буду разбираться только позже сейчас проэкт переделать нужно..
Записан
olej
QOR.Team
****
Offline Offline

Сообщений: 42



Просмотр профиля
« Ответ #14 : Июля 10, 2007, 06:09:44 pm »

Olej
- что-то такое ...

вот к примеру

int main( int argc, char* argv[] ) {
   const int N = 1000;
   uint64_t cycle1, cycle2, sum1 = 0;
   for( int i = 0; i < N; i++ ) {
      // минимально возможный интервал
      cycle1 = ClockCycles();
      cycle2 = ClockCycles();
      sum1 += cycle2 - cycle1;
   };
   sum1 /= N;
   double cycle3, cycle4, sum2 = 0;
   for( int i = 0; i < N; i++ ) {
      cycle3 = ClockCycles();
      cycle4 = ClockCycles();
      sum2 += cycle4 - cycle3;
   };
   sum2 /= N;
   cout << sum1 << " - " << sum2 << endl;
   exit( EXIT_SUCCESS );
};

и разница:

# tp3-2
32 - 48.001
Записан
Страниц: [1] 2
  Печать  
 
Перейти в: