-
- Не, именно к указателю на инт надо приводить нечетный инт, а потом звездочкой брать значение по этому нечетному указателю: c = *((int*)((int)&var+1)) (сама переменная var должна быть int16 или int32) - testerplus(09.02.2011 18:24 - 18:26)
- проходили. Там, где невыровненные данные не работают, этот приём ничего не давал, подставлялась одна 32-битная выборка, а не собиралось слово из отдельных байт. Да и сами посмотрите: Вы просто несколько раз преобразовываете тип указателя, но koyodza(27 знак., 09.02.2011 18:30)
- А если в несколько операций? Считать по указателю в переменную. Пошаманить с переменой. Указатель в чар и считать по адресу. +1 на указатель. Снова считать. Указатель в инт. Ну и записать по нему что-то вычисленное ранее. Все переменные volitile, Evgeny_CD(34 знак., 09.02.2011 20:05)
- всю глубину мысли ниасилил. Но если правильно понял, примерно так и делалось - koyodza(09.02.2011 20:29)
- Просто, чтобы компилятор поменьше оптимизировал, я предложил разнести это в несколько строк. И в несколько неоптимизиремых действий. - Evgeny_CD(09.02.2011 20:51)
- ну да, в первом приближении так koyodza(134 знак., 09.02.2011 21:10)
- Так топикстартер хочет определить на этапе компиляции. Я так понял, что для того, чтобы мелкому 8-битнику подсунуть менее ресурсоемкую функцию. - testerplus(09.02.2011 20:59)
- Просто, чтобы компилятор поменьше оптимизировал, я предложил разнести это в несколько строк. И в несколько неоптимизиремых действий. - Evgeny_CD(09.02.2011 20:51)
- всю глубину мысли ниасилил. Но если правильно понял, примерно так и делалось - koyodza(09.02.2011 20:29)
- Да я тоже думаю, что не будет давать ни ошибок ни варнингов. Сейчас открыт С для PIC32, компилятор молча съел, а при дебаге программа улетела по exception'у testerplus(298 знак., 09.02.2011 18:44)
- Переменная должна быть статическая, тогда у линкера будет конкретный адрес, который к инструкции не подойдет. Можно было написать *((int *)1), но не известно по каким адресам есть память, т.е. со статической переменной более универсально. - AlexBi(09.02.2011 18:51)
- Не, даже на static volatile int никак не ругается. (И на c = *((int*)1) тоже молчит.) По-моему тут никак, кроме как писал SciFi (тестировать марку компилятора) не выкрутиться. - testerplus(09.02.2011 18:56)
- Видать нужную опцию при сборке гнутых тулзов под PIC32 не поставили... - Evgeny_CD(09.02.2011 19:16)
- Не, даже на static volatile int никак не ругается. (И на c = *((int*)1) тоже молчит.) По-моему тут никак, кроме как писал SciFi (тестировать марку компилятора) не выкрутиться. - testerplus(09.02.2011 18:56)
- Переменная должна быть статическая, тогда у линкера будет конкретный адрес, который к инструкции не подойдет. Можно было написать *((int *)1), но не известно по каким адресам есть память, т.е. со статической переменной более универсально. - AlexBi(09.02.2011 18:51)
- А если в несколько операций? Считать по указателю в переменную. Пошаманить с переменой. Указатель в чар и считать по адресу. +1 на указатель. Снова считать. Указатель в инт. Ну и записать по нему что-то вычисленное ранее. Все переменные volitile, Evgeny_CD(34 знак., 09.02.2011 20:05)
- проходили. Там, где невыровненные данные не работают, этот приём ничего не давал, подставлялась одна 32-битная выборка, а не собиралось слово из отдельных байт. Да и сами посмотрите: Вы просто несколько раз преобразовываете тип указателя, но koyodza(27 знак., 09.02.2011 18:30)
- Не, именно к указателю на инт надо приводить нечетный инт, а потом звездочкой брать значение по этому нечетному указателю: c = *((int*)((int)&var+1)) (сама переменная var должна быть int16 или int32) - testerplus(09.02.2011 18:24 - 18:26)