|
Компилятор Gcc или так и должнобыть?, Почему то отказывается выполнять инструкциии |
|
|
|
May 2 2008, 04:17
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 29-12-04
Пользователь №: 1 738

|
Столкнулся с тем что GCC упорно не хочет выполнять следующее, вроде с синтаксисом нет никакого криминала комерческие компиляторы отрабатывают без проблем (Borlad c++ и пр.) не выдавая никаких ошибок и предупреждений
unsigned long int a[] = {1, 2, 3, 4, 5}; unsigned long int b[5];
void* ptr = a;
b[0] = *((unsigned long int*)ptr)++; b[1] = *((unsigned long long int*)ptr)++;
В обоих случаях отказывается делать инкремент указателя выдавая ошибку хотя здесь явно указатель приводится к указателю на заданный тип, пробовал указатель описать как указатель на тип char или int ситуация не меняется. С точки зрения синтаксиса вроде всё правильно .. пытался искать в стандарте Ansi C но нашел ничего .. Мож у кого есть какие мысли .. не исключаю что может и я что то делаю не коррекктно.. Конечно эту ситуацию можно обойти... Спасибо.
|
|
|
|
|
 |
Ответов
|
May 5 2008, 12:01
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
А если так: Код unuon { char *pc; int *pi; long *pl; } u;
u.pc = &buff;
char c = *u.pc++; int i = *u.pi++; long l = *u.pl++;
|
|
|
|
|
May 6 2008, 18:45
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(777777 @ May 6 2008, 22:53)  Так можно. Только зачем? Языки высокого уровня придумываются для того, чтобы избегать низкоуровневых работ, а также для обнаружения большинства ошибок на этапе компиляции. А чего мы добиваемся подобной конструкцией? Вы уже несколько раз это повторили. А нельзя ли привести пример того, как такое делается на языках высокого уровня? Скажем, вы принимаете сериализованный список переменных разного типа. То есть, принятый вами буфер выглядит следующим образом: [число_переменных_в_пакете][номер_переменной1][переменная1][номер_переменной2][п еременная2]...[номер_переменнойN][переменнаяN]. В зависимости от номера переменной её тип может быть int, char, double, long int. Научите, как это делается на языках высокого уровня?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 7 2008, 04:18
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(AHTOXA @ May 6 2008, 22:45)  А нельзя ли привести пример того, как такое делается на языках высокого уровня? Скажем, вы принимаете сериализованный список переменных разного типа. То есть, принятый вами буфер выглядит следующим образом: [число_переменных_в_пакете][номер_переменной1][переменная1][номер_переменной2][п еременная2]...[номер_переменнойN][переменнаяN]. В зависимости от номера переменной её тип может быть int, char, double, long int. Научите, как это делается на языках высокого уровня? Очень просто. (Правда, номер переменной здесь не нужен - обычно порядок определяет назначение переменной). Можно написать функцию read(void* buf, uint8_t size) которая "принимает" (неважно откуда) данные размера size. Тогда мы пишем: int var1; char var2; double var3; long var4; read(&var1, sizeof(var1)); read(&var2, sizeof(var2)); read(&var3, sizeof(var3)); read(&var4, sizeof(var4)); или еще проще: struct VAR { int var1; char var2; double var3; long var4; } var; read(&var, sizeof(var)); Только здесь надо позаботиться чтобы переменные в стуктуре были выровнены побайтно. А самой функции read нет необходимости знать о типах - она читает только заданное количество байт. Содержимое функции read зависит от того, откуда ей принимать данные, в любом случае ей придется инкрементировать указатель *buf. Если компилятор допускает ++ для типа void* и увеличивает его именно на 1, то такой код годится, если нет (как того требует стандарт) - то прототип функции должен быть read(char* buf, uint8_t size), но тогда при обращении к ней нужно приводить тип буфера к char*
|
|
|
|
|
May 7 2008, 04:54
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(777777 @ May 7 2008, 10:18)  Очень просто. (Правда, номер переменной здесь не нужен - обычно порядок определяет назначение переменной). Номер переменной здесь нужен потому, что в пакете могут быть произвольные переменные. Например, передаются только изменившиеся параметры - это сильно экономит трафик. Но не суть. Цитата Можно написать функцию read(void* buf, uint8_t size) которая "принимает" (неважно откуда) данные размера size. Собственно весь вопрос и заключался в том, как должна быть написана эта функция. Вы функцию не привели, и идеи ваши никуда не ушли в сторону от банальной арифметики с указателями. Цитата Содержимое функции read зависит от того, откуда ей принимать данные, в любом случае ей придется инкрементировать указатель *buf. Если компилятор допускает ++ для типа void* и увеличивает его именно на 1, то такой код годится, если нет (как того требует стандарт) - то прототип функции должен быть read(char* buf, uint8_t size), но тогда при обращении к ней нужно приводить тип буфера к char* Не вижу здесь никакого особого "высокоуровневого" подхода.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
May 7 2008, 05:00
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(AHTOXA @ May 7 2008, 08:54)  Собственно весь вопрос и заключался в том, как должна быть написана эта функция. Вы функцию не привели, и идеи ваши никуда не ушли в сторону от банальной арифметики с указателями. Вы тоже не объяснили откуда плучаются данные. void read(char* p, uint8_t n) { while(n--) *p++ = getchar(); } Каков вопрос, таков ответ  А вообще, вопрос надо задавать более широко: что требуется в конечном итоге? Тогда, возможно, отпадет даже сама необходимость решать этот частный вопрос.
Сообщение отредактировал 777777 - May 7 2008, 05:02
|
|
|
|
|
May 7 2008, 05:03
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(777777 @ May 7 2008, 11:00)  Вы тоже не объяснили откуда плучаются данные. А какая разница? Цитата void read(char* p, uint8_t n) { while(n--) *p++ = getchar(); } Спасибо, теперь я наконец-таки узнал, как надо писать на языке высокого уровня
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
Сообщений в этой теме
Олег. Компилятор Gcc или так и должнобыть? May 2 2008, 04:17 forever failure Видимо имеется ввиду это:
warning: use of cast exp... May 2 2008, 04:43 777777 Цитата(Олег. @ May 2 2008, 08:17) Столкну... May 2 2008, 05:46 zltigo Цитата(777777 @ May 2 2008, 07:46) Борлан... May 2 2008, 07:13 umup попробуйте так :
Код b[0] = *((u... May 2 2008, 06:48 ReAl Цитата(umup @ May 2 2008, 09:48) попробуй... May 2 2008, 08:33 ReAl Цитата(Олег. @ May 2 2008, 07:17) вроде с... May 2 2008, 08:08 umup ЦитатаА вот этого не надо, если в оригинальном вар... May 2 2008, 08:23 zltigo Цитата(umup @ May 2 2008, 10:23) какая ?
... May 2 2008, 08:38  aesok Цитата(zltigo @ May 2 2008, 12:38) Без ... May 2 2008, 08:44   zltigo Цитата(aesok @ May 2 2008, 10:44) А если ... May 2 2008, 08:48  ReAl Цитата(zltigo @ May 2 2008, 11:38) Имя ко... May 2 2008, 09:02   Олег. Я пробовал в Borland C++ Builder6, там всё проходи... May 2 2008, 09:36    777777 Цитата(Олег. @ May 2 2008, 13:36) Не искл... May 2 2008, 14:58     Олег. Да Вы в общем то правы. Да я пишу на С но всегда к... May 2 2008, 15:55      777777 Цитата(Олег. @ May 2 2008, 19:55) Да Вы в... May 2 2008, 16:09   zltigo Цитата(ReAl @ May 2 2008, 11:02) gcc в да... May 2 2008, 09:41 umup можно так :
Код b[0] = *(unsigned long... May 2 2008, 10:30 Олег. Да конечно так можно.. Я понимаю.. До меня дошло ч... May 2 2008, 11:52 Andreas1 поскольку только осваиваюсь в сях, а ситуация инте... May 2 2008, 17:12 AHTOXA Цитата(Andreas1 @ May 2 2008, 23:12) И де... May 2 2008, 17:35 ReAl Цитата(Andreas1 @ May 2 2008, 20:12) поск... May 2 2008, 19:15       Сергей Борщ Цитата(AHTOXA @ May 7 2008, 08:03) Спасиб... May 7 2008, 06:48        777777 Цитата(Сергей Борщ @ May 7 2008, 10:48) М... May 7 2008, 07:38         ReAl Цитата(777777 @ May 7 2008, 10:38) Если у... May 7 2008, 09:30          777777 Цитата(ReAl @ May 7 2008, 13:30) Никто ни... May 7 2008, 11:46           ReAl Цитата(777777 @ May 7 2008, 14:46) Все эт... May 7 2008, 12:59         Сергей Борщ Цитата(777777 @ May 7 2008, 10:38) А вот ... May 7 2008, 09:51        AHTOXA Цитата(Сергей Борщ @ May 7 2008, 12:48) М... May 7 2008, 07:56 alexander55 Цитата(Олег. @ May 2 2008, 08:17) unsigne... May 7 2008, 10:02
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|