Преобразование типов в C++ [РЕШЕНО] (Замучался совсем, куда копать не знаю.....)

Модератор: Модераторы разделов

Ответить
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

Собственно говоря есть код....

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

typedef struct TypeBuf
{
  unsigned char Type[1];
  unsigned char Dlit[2];
  unsigned char NumberA[4];
  unsigned char NumberB[12];
  unsigned char DateTime[8];
};

char buf[27];
struct TypeBuf *Var1;
FILE *input;
FILE *output;

WriteBuf()
{
  int ret;
  int i=0;
  unsigned char ch;
  while (i < 27)
  {
     ret=fread(&ch,sizeof(char),1,input);
     if (ret==0)  return(1);
     buf[i]=ch;
     i++;
  }
  return(0);
}

WriteFile()
{
    int i;
    Var1 = (struct TypeBuf *) buf;

<пропущено для экономии места>

    fprintf(output, ";");

// DATE+TIME
unsigned char temp;

temp = Var1->DateTime[7]; // переставляем местами байтики ибо Солярис
Var1->DateTime[7] = Var1->DateTime[0];
Var1->DateTime[0] = temp;

temp = Var1->DateTime[6];
Var1->DateTime[6] = Var1->DateTime[1];
Var1->DateTime[1] = temp;

temp = Var1->DateTime[5];
Var1->DateTime[5] = Var1->DateTime[2];
Var1->DateTime[2] = temp;

temp = Var1->DateTime[4];
Var1->DateTime[4] = Var1->DateTime[3];
Var1->DateTime[3] = temp;

double *DateTime;
DateTime = (double *)Var1->DateTime;

*DateTime = *DateTime - 25569; // вот тут эта падла сегфолтится.....
*DateTime = *DateTime * 86400;

time_t t = *DateTime;

struct tm* lt = gmtime(&t);
char time_str[20];
sprintf(time_str, "%04d%02d%02d %02d%02d%02d",
      lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday,
      lt->tm_hour, lt->tm_min, lt->tm_sec
);
    fprintf(output,"%s", time_str);
    fprintf(output,";");


Не пойму что я делаю не так?????

Код: Выделить всё

]$gcc -v
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.2/specs
Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls
Thread model: posix
gcc version 3.2
Спасибо сказали:
Аватара пользователя
agentprog
Сообщения: 362
Статус: Ad Astra per aspera
ОС: openSUSE 11.4, Arch

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение agentprog »

а че компилятор по этому поводу говорит?
No problems - just solutions!
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

agentprog писал(а):
15.06.2009 12:10
а че компилятор по этому поводу говорит?

Ничего не говорит :-(
Спасибо сказали:
fulltick
Сообщения: 25

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение fulltick »

Проверь, чему равен sizeof (TypeBuf). Скорее всего, он у тебя больше 27 байт.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

Коли time_t осьмибайтово - к нему и веди, а не к double... :)
Пойдём на рыбалку !
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

fulltick писал(а):
15.06.2009 12:32
Проверь, чему равен sizeof (TypeBuf). Скорее всего, он у тебя больше 27 байт.

именно 27 байт....описан в самом начале

Код: Выделить всё

typedef struct TypeBuf
{
  unsigned char Type[1];
  unsigned char Dlit[2];
  unsigned char NumberA[4];
  unsigned char NumberB[12];
  unsigned char DateTime[8];
};
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Какая аппаратная архитектура? sparcv9?

И почему к double??
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

Supervisor писал(а):
15.06.2009 13:32
fulltick писал(а):
15.06.2009 12:32
Проверь, чему равен sizeof (TypeBuf). Скорее всего, он у тебя больше 27 байт.

именно 27 байт....описан в самом начале

Код: Выделить всё

typedef struct TypeBuf
{
  unsigned char Type[1];
  unsigned char Dlit[2];
  unsigned char NumberA[4];
  unsigned char NumberB[12];
  unsigned char DateTime[8];
};



Не... Он, скорее всего, более далёк,
если нет выравнивания в один байт...

Т.е. адресуясь на крайнее поле, ты будешь хватать за буфер... :)

(А про double - это лишь продолжение...)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Честно говоря выглядит очень странно.. вот у меня тест-минимум работает прекрасно. При чём что Sun CC, что gcc.. в обоих случаях всё ОК.

Код: Выделить всё

baracuda% cat test.c

struct test {
        unsigned char test[8];
};

void test( struct test * s ) {
        double * d;
        d = (double*) s->test;
        *d += 7.;
}

int main(void) {
        struct test t;
        test( &t );
        return 0;
}

baracuda% CC test.c
baracuda% ./a.out
baracuda% gcc test.c
baracuda% ./a.out
baracuda%
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение sim1 »

Встречал что на разных компиляторах разный приоритет операций (*) и (-)

Код: Выделить всё

*DateTime = *DateTime - 25569;

Попробуйте так:

Код: Выделить всё

(*DateTime) = (*DateTime) - 25569;

ну или вообще вот так

Код: Выделить всё

double tmp = (*DateTime) - 25569;
*DateTime = tmp;
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Ага! поймал ба-бах
Похоже на багу в gcc:

Код: Выделить всё

baracuda% cat test.c
#include <stdlib.h>
struct test {
        unsigned char Type[1];
          unsigned char Dlit[2];
            unsigned char NumberA[4];
              unsigned char NumberB[12];
        unsigned char test[8];
};

void test( struct test * s ) {
        double * d;
        d = (double*) s->test;
        *d += 7;
}

int main(void) {
        struct test t;
        test( &t );
        return 0;
}

baracuda% CC test.c
baracuda% ./a.out
baracuda% gcc test.c
baracuda% ./a.out
zsh: bus error (core dumped)  ./a.out
baracuda%
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

cy6erGn0m писал(а):
15.06.2009 13:50
Ага! поймал ба-бах
Похоже на багу в gcc:

Код: Выделить всё

zsh: bus error (core dumped)  ./a.out
baracuda%

У меня с такимже сообщением вываливается....
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Вот если собирать сановым компайлером, то всё работает.



Как видите дело не в приоритетах операций.

Кстати у меня gcc другой версии нежели у вас, но падает один хрен

Код: Выделить всё

baracuda% CC -V
CC: Sun C++ 5.9 SunOS_sparc 2007/05/03
baracuda% gcc --version
gcc (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

baracuda%


Ой, я извиняюсь, я по ошибке собирал с помощью CC вместо cc. Но это погоды не меняет в данном случае: и с CC и с cc всё работает, а с gcc не работает.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение sim1 »

cy6erGn0m писал(а):
15.06.2009 13:58
Вот если собирать сановым компайлером, то всё работает.



Как видите дело не в приоритетах операций.

Кстати у меня gcc другой версии нежели у вас, но падает один хрен

Код: Выделить всё

baracuda% CC -V
CC: Sun C++ 5.9 SunOS_sparc 2007/05/03
baracuda% gcc --version
gcc (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

baracuda%


Ой, я извиняюсь, я по ошибке собирал с помощью CC вместо cc. Но это погоды не меняет в данном случае: и с CC и с cc всё работает, а с gcc не работает.

именно в приоритетах
собирали разными компиляторами получили разный результат
в чем отличие ? ответ - в компиляторах
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

cy6erGn0m писал(а):
15.06.2009 13:58
Вот если собирать сановым компайлером, то всё работает.



Как видите дело не в приоритетах операций.

Кстати у меня gcc другой версии нежели у вас, но падает один хрен

Код: Выделить всё

baracuda% CC -V
CC: Sun C++ 5.9 SunOS_sparc 2007/05/03
baracuda% gcc --version
gcc (GCC) 3.4.3 (csl-sol210-3_4-branch+sol_rpath)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

baracuda%


Блин чтоже делать......


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

Код: Выделить всё

typedef struct TypeBuf
{
  unsigned char Private[4];
  unsigned char TypeCall[4];
  unsigned char NumberA[20];
  unsigned char NumberB[20];
  unsigned char Reserved1[4];
  unsigned char DateTime[8];
  unsigned char Dlit[4];
  unsigned char AdditionalInfo[32];
  unsigned char Reserved2[4];
};

и все работает.......


нету санового компайлера..... :cray: нету ни cc ни CC :cray:
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

УРААААААААААААААААААА!!!!! Заработало!


Код: Выделить всё

temp = Var1->DateTime[4];
Var1->DateTime[4] = Var1->DateTime[3];
Var1->DateTime[3] = temp;

unsigned char tmp[8];
memcpy(tmp, Var1->DateTime, 8);

double *DateTime;
DateTime = (double *)tmp;

*DateTime = *DateTime - 25569;
*DateTime = *DateTime * 86400;

time_t t = *DateTime;



Всем спасибо!
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

именно в приоритетах
собирали разными компиляторами получили разный результат
в чем отличие ? ответ - в компиляторах


Ничего подобного: посмотрите внимательно мой пример - у меня никаких неоднозначностей в коде нет
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

Supervisor писал(а):
15.06.2009 14:02
Рядом лежит еще один исходник в котором используется точно такаяже конструкция, отличается только

Код: Выделить всё

typedef struct TypeBuf
{
  unsigned char Private[4];
  unsigned char TypeCall[4];
  unsigned char NumberA[20];
  unsigned char NumberB[20];
  unsigned char Reserved1[4];
  unsigned char DateTime[8];
  unsigned char Dlit[4];
  unsigned char AdditionalInfo[32];
  unsigned char Reserved2[4];
};

и все работает.......


Возможно, выравнивание структур установлено в 4 байта.
Последняя структура - не будет иметь проблем, т.к. длины её полей кратны 4.

В твоём случае -
можно держать переменную,
а не указатель структуры, и заполнить её поля явно... :)
Пойдём на рыбалку !
Спасибо сказали:
sim1
Сообщения: 155
ОС: GNU,BSD
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение sim1 »

Ну может быть и не в приоритетах. Ну вообще по первоначальному коду, на мой взгляд правильнее сделать так.
1. Объявить структуру
2. Преобразовывать к указатель char* только там где нужно т.е


Код: Выделить всё

int main(int argc,char **) {
   TypeBuf buf;
  // работаем с содержимым buf;
  buf.DateTime += 7.;

  // нужен буфер,для пересылки,
  char * buf_pointer = (char*)(&buf);

  // работаем с buf_pointer границу определяем по sizeof(buf)

}

Уж слишком много, на мой взгляд, "опасных" мест в приведенном коде. Хотя на вкус и цвет ...
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Думаю gcc просто не делает выравнивание самостоятельно, поэтому всё падает, а CC наверное дописывает перед структурой какие-нибудь нули если требуется вот и прокатывает.
bus error тому подтверждение, потому что тут не просто сегфолт, а именно bus error.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

Supervisor писал(а):
15.06.2009 14:09
УРААААААААААААААААААА!!!!! Заработало!

Код: Выделить всё

unsigned char tmp[8];
memcpy(tmp, Var1->DateTime, 8);


Оно просто не падает теперь...
Но данные будут - не обязательно те, которые читались... :)
Пойдём на рыбалку !
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

Женя Подсыпальников писал(а):
15.06.2009 14:21
Supervisor писал(а):
15.06.2009 14:09
УРААААААААААААААААААА!!!!! Заработало!

Код: Выделить всё

unsigned char tmp[8];
memcpy(tmp, Var1->DateTime, 8);


Оно просто не падает теперь...
Но данные будут - не обязательно те, которые читались... :)

Именно те что читались, и на выходе получается именно то что нужно :)
Я проверил ;)
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

Supervisor писал(а):
15.06.2009 14:23
Именно те что читались, и на выходе получается именно то что нужно :)
Я проверил ;)


А на кой ты их в оконцовке "подгоняешь" (плюс и множить) ? :)

Можа, выведешь sizeof(TypeBuf) ? Интересно ! :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Вот добавил вывод
printf( "%p - %d\n", &t, sizeof( struct test ) );
в свой пример

Поулучил

Код: Выделить всё

baracuda% CC test.c
baracuda% ./a.out
ffbff909   - 27
baracuda% ./a.out
ffbff909   - 27
baracuda% gcc test.c
baracuda% ./a.out
ffbff8f8   - 27
zsh: bus error (core dumped)  ./a.out


Как видно, CC ничего вроде как не выровнял... а gcc выровнял, так что дело не в выравнивании и не в размерах.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Supervisor »

Женя Подсыпальников писал(а):
15.06.2009 14:29
Supervisor писал(а):
15.06.2009 14:23
Именно те что читались, и на выходе получается именно то что нужно :)
Я проверил ;)


А на кой ты их в оконцовке "подгоняешь" (плюс и множить) ? :)

Можа, выведешь sizeof(TypeBuf) ? Интересно ! :)


Мне нужно из TDateTime получить наглядное представление даты и времени :-)

type TDateTime = type Double;

Description

Most VCL objects represent date and time values using the TDateTime type. The integral part of a TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of a TDateTime value is fraction of a 24 hour day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates and times:
0 12/30/1899 12:00 am
2.75 1/ 1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/ 1/1996 12:00 am


По примеру cy6erGn0m

Код: Выделить всё

printf( "%p - %d\n", &Var1, sizeof( struct TypeBuf ) );

результат

Код: Выделить всё

2194c - 27
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

cy6erGn0m писал(а):
15.06.2009 14:34
Как видно, CC ничего вроде как не выровнял... а gcc выровнял, так что дело не в выравнивании и не в размерах.


А адрес последнего поля - не выведешь ещё, c gcc ? :)

И потом попробывать с доведением его до кратного 8,
путём добавки массива байт в структуру перед ним - падает ?
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

А адрес последнего поля - не выведешь ещё, c gcc ? smile.gif


Код: Выделить всё

baracuda% cc test.c
baracuda% ./a.out
ffbff909 - 27
last field addr ffbff91c
baracuda% gcc test.c
baracuda% ./a.out
ffbff8f8 - 27
last field addr ffbff90b
zsh: bus error (core dumped)  ./a.out



Может дело в выравнивании именно адреса для double?

Может это поможет? (я немного занят сейчас)

Для gcc

Код: Выделить всё

baracuda% gcc test.c
baracuda% objdump -d a.out | less
......................................
00010688 <test>:
   10688:       9d e3 bf 88     save  %sp, -120, %sp
   1068c:       f0 27 a0 44     st  %i0, [ %fp + 0x44 ]
   10690:       c2 07 a0 44     ld  [ %fp + 0x44 ], %g1
   10694:       82 00 60 13     add  %g1, 0x13, %g1
   10698:       c2 27 bf ec     st  %g1, [ %fp + -20 ]
   1069c:       fa 07 bf ec     ld  [ %fp + -20 ], %i5
   106a0:       c2 07 bf ec     ld  [ %fp + -20 ], %g1
   106a4:       d5 00 40 00     ld  [ %g1 ], %f10
   106a8:       d7 00 60 04     ld  [ %g1 + 4 ], %f11
   106ac:       03 00 00 41     sethi  %hi(0x10400), %g1
   106b0:       82 10 63 c8     or  %g1, 0x3c8, %g1     ! 107c8 <_lib_version+0x8>
   106b4:       d1 00 40 00     ld  [ %g1 ], %f8
   106b8:       d3 00 60 04     ld  [ %g1 + 4 ], %f9
   106bc:       91 a2 88 48     faddd  %f10, %f8, %f8
   106c0:       d1 27 40 00     st  %f8, [ %i5 ]
   106c4:       d3 27 60 04     st  %f9, [ %i5 + 4 ]
   106c8:       81 c7 e0 08     ret
   106cc:       81 e8 00 00     restore
................


Для SunCC

Код: Выделить всё

baracuda% cc test.c
baracuda% objdump -d a.out | less
..............
00010bc0 <test>:
   10bc0:       9d e3 bf 98     save  %sp, -104, %sp
   10bc4:       92 06 20 13     add  %i0, 0x13, %o1
   10bc8:       d2 27 bf fc     st  %o1, [ %fp + -4 ]
   10bcc:       cd 02 60 00     ld  [ %o1 ], %f6
   10bd0:       cf 02 60 04     ld  [ %o1 + 4 ], %f7
   10bd4:       11 00 00 43     sethi  %hi(0x10c00), %o0
   10bd8:       c9 1a 20 80     ldd  [ %o0 + 0x80 ], %f4        ! 10c80 <_lib_version+0
x8>
   10bdc:       89 a1 88 44     faddd  %f6, %f4, %f4
   10be0:       c9 22 60 00     st  %f4, [ %o1 ]
   10be4:       cb 22 60 04     st  %f5, [ %o1 + 4 ]
   10be8:       81 c7 e0 08     ret
   10bec:       81 e8 00 00     restore
   10bf0:       81 c7 e0 08     ret
   10bf4:       81 e8 00 00     restore
   10bf8:       00 01 00 00     illtrap  0x10000
   10bfc:       00 01 00 00     illtrap  0x10000
   10c00:       00 01 00 00     illtrap  0x10000
   10c04:       00 01 00 00     illtrap  0x10000
............
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение Женя Подсыпальников »

cy6erGn0m писал(а):
15.06.2009 15:38
Может дело в выравнивании именно адреса для double?


Код: Выделить всё

#define MAX 20

void test()
{
  double dTest[MAX];
  char* pChar = (char*) dTest;
  for (int i = 0; i < sizeof(double) * (MAX - 1); i++) {
    cout << "i = " << i << "&pChar[i] = " << &pChar[i] << "\n";
    double* pdTest = (double*) &pChar[i];
    *pdTest += 12;
  }
}


Вот-тута, наверна, на втором шаге хряпнется...

Но я такое доселе лишь не на х86-ых наблюдал... :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

В самую точку

Код: Выделить всё

baracuda% cat test2.c
#include <iostream>

using namespace std;

#define MAX 20

int main(void)
{
  double dTest[MAX];
  char* pChar = (char*) dTest;
  for (int i = 0; i < sizeof(double) * (MAX - 1); i++) {
    cout << "i = " << i << "&pChar[i] = " << &pChar[i] << "\n";
    double* pdTest = (double*) &pChar[i];
    *pdTest += 12;
  }
}
baracuda% CC test2.c
baracuda% ./a.out| tail
i = 142&pChar[i] = (
i = 143&pChar[i] = (
i = 144&pChar[i] = (
i = 145&pChar[i] = (
i = 146&pChar[i] = (
i = 147&pChar[i] = (
i = 148&pChar[i] = (
i = 149&pChar[i] = (
i = 150&pChar[i] = (
i = 151&pChar[i] = (
baracuda% g++ test2.c
baracuda% ./a.out
i = 0&pChar[i] =
i = 1&pChar[i] = (
zsh: bus error (core dumped)  ./a.out
baracuda%



gcc просто не учитывает это.. надо бы попробовать более новую версию gcc.. только у меня нет под рукой
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Аватара пользователя
cy6erGn0m
Сообщения: 119
ОС: MandrivaLinux/Solaris 10
Контактная информация:

Re: Преобразование типов в C++ [РЕШЕНО]

Сообщение cy6erGn0m »

Вот! Выравнивание! Только сейчас додумался попробовать отладчиком

Код: Выделить всё

Reading libc_psr.so.1
i = 0&pChar[i] =
i = 1&pChar[i] = (
signal BUS (invalid address alignment) in main at 0x10b30
0x00010b30: main+0x00b4:        ld       [%g1], %f10
(dbx)


Invalid address alignment.
I want to Believe!

They must find it difficult...
Those who have taken authority as the truth,
Rather than trusth as the authority.
/G.Messey/
Спасибо сказали:
Ответить