реклама на сайте
подробности

 
 
> Компилятор Gcc или так и должнобыть?, Почему то отказывается выполнять инструкциии
Олег.
сообщение May 2 2008, 04:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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 но нашел ничего .. Мож у кого есть какие мысли .. не исключаю что может и я что то делаю не коррекктно.. Конечно эту ситуацию можно обойти... Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex03
сообщение May 5 2008, 12:01
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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++;
Go to the top of the page
 
+Quote Post
777777
сообщение May 6 2008, 16:53
Сообщение #3


Профессионал
*****

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



Цитата(Alex03 @ May 5 2008, 16:01) *
А если так:

Код
unuon
{
    char *pc;
    int *pi;
    long *pl;
} u;

u.pc = &buff;

char c = *u.pc++;
int i = *u.pi++;
long l = *u.pl++;


Так можно. Только зачем? Языки высокого уровня придумываются для того, чтобы избегать низкоуровневых работ, а также для обнаружения большинства ошибок на этапе компиляции. А чего мы добиваемся подобной конструкцией?

Сообщение отредактировал 777777 - May 6 2008, 16:54
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 6 2008, 18:45
Сообщение #4


фанат дивана
******

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



Цитата(777777 @ May 6 2008, 22:53) *
Так можно. Только зачем? Языки высокого уровня придумываются для того, чтобы избегать низкоуровневых работ, а также для обнаружения большинства ошибок на этапе компиляции. А чего мы добиваемся подобной конструкцией?


Вы уже несколько раз это повторили. А нельзя ли привести пример того, как такое делается на языках высокого уровня? Скажем, вы принимаете сериализованный список переменных разного типа. То есть, принятый вами буфер выглядит следующим образом:
[число_переменных_в_пакете][номер_переменной1][переменная1][номер_переменной2][п
еременная2]...[номер_переменнойN][переменнаяN].
В зависимости от номера переменной её тип может быть int, char, double, long int.
Научите, как это делается на языках высокого уровня?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
777777
сообщение May 7 2008, 04:18
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 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*
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 7 2008, 04:54
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 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*


Не вижу здесь никакого особого "высокоуровневого" подхода.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
777777
сообщение May 7 2008, 05:00
Сообщение #7


Профессионал
*****

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



Цитата(AHTOXA @ May 7 2008, 08:54) *
Собственно весь вопрос и заключался в том, как должна быть написана эта функция. Вы функцию не привели, и идеи ваши никуда не ушли в сторону от банальной арифметики с указателями.

Вы тоже не объяснили откуда плучаются данные.

void read(char* p, uint8_t n)
{
while(n--)
*p++ = getchar();
}

Каков вопрос, таков ответ smile.gif

А вообще, вопрос надо задавать более широко: что требуется в конечном итоге? Тогда, возможно, отпадет даже сама необходимость решать этот частный вопрос.

Сообщение отредактировал 777777 - May 7 2008, 05:02
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 7 2008, 05:03
Сообщение #8


фанат дивана
******

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



Цитата(777777 @ May 7 2008, 11:00) *
Вы тоже не объяснили откуда плучаются данные.


А какая разница?

Цитата
void read(char* p, uint8_t n)
{
while(n--)
*p++ = getchar();
}


Спасибо, теперь я наконец-таки узнал, как надо писать на языке высокого уровня biggrin.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Олег.   Компилятор 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 17:37
Рейтинг@Mail.ru


Страница сгенерированна за 0.01611 секунд с 7
ELECTRONIX ©2004-2016