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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Можно ли в typedef struct описать массив переменной длины, IAR, C, AVR
demiurg_spb
сообщение Feb 22 2009, 08:32
Сообщение #16


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Да и на x51 была возможность косвенной адресации через восьмибитные регистры. Разговор не о "возможных" вариантах адресации на той или иной платформе. Разговор о языке программирования СИ и о том какова в нём разрядность указателя. Я запомнил, что aesok говорил о том, что она по стандарту равна разрядности типа int - я ретранслировал. Надо глянуть в стандарт.
Цитата
5 An integer may be converted to any pointer type. Except as previously specified, the
result is implementation-defined, might not be correctly aligned, might not point to an
entity of the referenced type, and might be a trap representation.
(The mapping functions for converting a pointer to an integer or an integer to a pointer
are intended to be consistent with the addressing structure of the execution environment.)

6 Any pointer type may be converted to an integer type. Except as previously specified, the
result is implementation-defined. If the result cannot be represented in the integer type,
the behavior is undefined. The result need not be in the range of values of any integer
type.
Вот так. преобразование INT<->PTR должно обеспечиваться с легкостью необычайной (на момент принятия стандарта 1999г)smile.gif
Цитата
A pointer to void shall have the same representation and alignment requirements as a
pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of
compatible types shall have the same representation and alignment requirements. All
pointers to structure types shall have the same representation and alignment requirements
as each other. All pointers to union types shall have the same representation and
alignment requirements as each other. Pointers to other types need not have the same
representation or alignment requirements.
Интересно какие остальные?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 22 2009, 11:55
Сообщение #17


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(Rst7 @ Feb 21 2009, 21:57) *
Да, такое заблуждение было. До появления 64хбитных архитектур. Там int - 32 бита, указатель 64. Соответственно, size_t (разность между двумя указателями) не int, а long long.


Разность между двумя указателями - ptrdiff_t.

size_t - стандартный псевдоним для типа, возвращающегося при запросе размера объекта языка (sizeof). Всегда беззнаковый.
Go to the top of the page
 
+Quote Post
Rst7
сообщение Feb 22 2009, 12:04
Сообщение #18


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Разность между двумя указателями - ptrdiff_t.


Да-да. Пардон, ошибся. Правда, сути дела это не меняет. ptrdiff_t не лезет в int.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2009, 20:51
Сообщение #19


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Feb 22 2009, 10:32) *
Вот так. преобразование INT<->PTR должно обеспечиваться с легкостью необычайной (на момент принятия стандарта 1999г)smile.gif
Ну. Всё правильно.
Просто "int" не тождественно "integer type" ("Платон человек, но не все люди Платоны").
Даже в процитированном Вами написано
Цитата
The result need not be in the range of values of any integer type.
Смотрим тот же стандарт 99-го года.
Цитата
6.2.5 Types
...
4 There are five standard signed integer types, designated as signed char, short int, int, long int, and long long int. (These and other types may be designated in several additional ways, as described in 6.7.2.) There may also be implementation-defined extended signed integer types.28) The standard and extended signed integer types are collectively called signed integer types.29)

long long int есть integer-type и в него 64-битный указатель влезет и назад вылезет.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 22 2009, 21:22
Сообщение #20


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Feb 22 2009, 23:51) *
Просто "int" не тождественно "integer type" ("Платон человек, но не все люди Платоны").
Согласен. Я тоже об этом задумывался.
Цитата
long long int есть integer-type и в него 64-битный указатель влезет и назад вылезет.
Это я понял. НО вопрос был задан примерно так "какого размера указатель мне выбрать для адресации массива длиной 333?". И что Вы ответите человеку? Как ему выбрать указатель подходящей размерности?smile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2009, 21:39
Сообщение #21


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(demiurg_spb @ Feb 22 2009, 23:22) *
Это всё понятно. Вот вопрос был задан примерно так "какого размера указатель мне выбрать для адресации массива длиной 333?". И что Вы ответите человеку? Как ему выбрать указатель подходящей размерности?smile.gif
Не понял вопроса.
T*
где T - тип элемента массива.

Если речь идёт о выборе типа достаточной разрядности для индекса массива, то size_t хватит гарантированно всегда, если минимально-возможной разрядности, то для 333 - int16_t/uint16_t (второе в зависимости от процессора может быть выгоднее по генерируемому коду, хуже врядли будет). В общем случае - пробежаться #if-ами по константам из limits.h и соорудить нужный typedef.

Если вопрос звучит "какой не-указательный тип выбрать для хранения этого указателя?", то сначала я спрошу "а какого его не хранить в переменной типа T* или в крайнем случае void*?"
Если "действительно надо", то вариантом ответа может быть аналогичный предыдущему, только сравнивать по очереди не размер массива с UCHAR_MAX/UINT_MAX, а sizeof(T*) с sizeof() целых типов.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 23 2009, 06:39
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



CODE
/* - LIMITS.H -

Integral ANSI element sizes.

$Revision: 1.4 $

Copyright 1986 - 1999 IAR Systems. All rights reserved.
*/

#ifndef _LIMITS_INCLUDED
#define _LIMITS_INCLUDED

#ifndef _SYSTEM_BUILD
#pragma system_include
#endif

#include "sysmac.h"

#define CHAR_BIT 8 /* Number of bits in any "char" */

#if defined(__CHAR_MAX__)

#define CHAR_MAX __CHAR_MAX__
#define CHAR_MIN __CHAR_MIN__

#define MB_LEN_MAX 1 /* No of bytes in multibyte char */

#define SCHAR_MAX __SIGNED_CHAR_MAX__
#define SCHAR_MIN __SIGNED_CHAR_MIN__
#define UCHAR_MAX __UNSIGNED_CHAR_MAX__

#define SHRT_MAX __SIGNED_SHORT_MAX__
#define SHRT_MIN __SIGNED_SHORT_MIN__
#define USHRT_MAX __UNSIGNED_SHORT_MAX__

#define INT_MAX __SIGNED_INT_MAX__
#define INT_MIN __SIGNED_INT_MIN__
#define UINT_MAX __UNSIGNED_INT_MAX__

#define LONG_MAX __SIGNED_LONG_MAX__
#define LONG_MIN __SIGNED_LONG_MIN__
#define ULONG_MAX __UNSIGNED_LONG_MAX__

#else /* !defined(__CHAR_MAX__) */

#if _argt$(char)==1 /* "char" = "unsigned" "char" */
#define CHAR_MAX 255
#define CHAR_MIN 0
#else
#define CHAR_MAX 127 /* Maximum "char" value */
#define CHAR_MIN (-128) /* Mimimum "char" value */
#endif

#define MB_LEN_MAX 1 /* No of bytes in multibyte char */

#define SCHAR_MAX 127 /* Maximum "signed" "char" value */
#define SCHAR_MIN (-128) /* Minimum "signed" "char" value */

#define UCHAR_MAX 255 /* Maximum "unsigned" "char" value */

#define SHRT_MAX 32767 /* Maximum ("signed") "short" value */
#define SHRT_MIN (-32767-1) /* Minimum ("signed") "short" value */
#define USHRT_MAX 0xFFFFU /* Maximum "unsigned" "short" value */

#if __INT_SIZE__ == 2 /* For 32-bit CPU's usually not */
#define INT_MAX 32767 /* Maximum ("signed") "int" value */
#define INT_MIN (-32767-1) /* Minimum ("signed") "int" value */
#define UINT_MAX 0xFFFFU /* Maximum "unsigned" "int" value */
#else
#define INT_MAX 2147483647
#define INT_MIN (-2147483647-1)
#define UINT_MAX 0xFFFFFFFFU
#endif

#define LONG_MAX 2147483647 /* Maximum ("signed") "long" value */
#define LONG_MIN (-2147483647-1) /* Minimum ("signed") "long" value */
#define ULONG_MAX 0xFFFFFFFFU /* Maximum "unsigned" "long" value */

#endif /* defined(__CHAR_MAX__) */

#endif


Выходит, что unsigned chort, что unsigned int одинаково в данном случае.
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 23 2009, 08:19
Сообщение #23


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ReAl @ Feb 23 2009, 00:39) *
Не понял вопроса.
Вот и я не понял вопроса. Поэтому и углубился в "теорию си указателей"B) )
Цитата(west329_ @ Feb 23 2009, 09:39) *
Код
- LIMITS.H - .....
- вот этого всего писать не надо было. Разговор не о том и не между первоклассниками. krapula.gif
Цитата
Выходит, что unsigned chort....
unsigned Чёрт побериsmile.gif
Пора закрывать тему. Уже один флэйм идёт.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 23 2009, 11:36
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Цитата(demiurg_spb @ Feb 23 2009, 11:19) *
Вот и я не понял вопроса. Поэтому и углубился в "теорию си указателей"B) )
- вот этого всего писать не надо было. Разговор не о том и не между первоклассниками. krapula.gif
unsigned Чёрт побериsmile.gif
Пора закрывать тему. Уже один флэйм идёт.

а указатель может быть signed, обьясните мне ?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 23 2009, 11:48
Сообщение #25


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(west329_ @ Feb 23 2009, 14:36) *
а указатель может быть signed, обьясните мне ?


А адрес ячейки памяти бывает отрицательный?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 23 2009, 12:01
Сообщение #26


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(west329_ @ Feb 23 2009, 13:36) *
а указатель может быть signed, обьясните мне ?
Мне кажется вы не понимаете. unsigned char * означает "указатель на unsigned char". Каким образом будет представлен сам указатель - внутреннее дело компилятора. Программиста интересует тот тип данных, на который этот указатель указывает.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 23 2009, 12:21
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



Незнал, чесно признаюсь думал, что это описывается тип указателя, соотвецтвенно меня ввело в заблуждение (Сообщение #23) который предложил закрыть топик, но данные которые будут лежать в массиве действительно беззнаковые, выходит что я был прав u_i, а за сам указатель, его тип и хранение позаботится как я понял сам ИАР. Или я ошибаюсь
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 23 2009, 12:33
Сообщение #28


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(west329_ @ Feb 23 2009, 15:21) *
Незнал, чесно признаюсь думал, что это описывается тип указателя, соотвецтвенно меня ввело в заблуждение (Сообщение #23) который предложил закрыть топик, но данные которые будут лежать в массиве действительно беззнаковые, выходит что я был прав u_i, а за сам указатель, его тип и хранение позаботится как я понял сам ИАР. Или я ошибаюсь


У вас в голове полная путаница в понимании того, что такое массив, а что такое указатель. Вы бы не ленились, а почитали что-нибудь от отцов-основателей. Полно толковых книг по С. И в inet'e куча ресурсов.
Go to the top of the page
 
+Quote Post
west329_
сообщение Feb 23 2009, 13:40
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 378
Регистрация: 10-09-07
Из: UKR/Voz
Пользователь №: 30 423



..Указатель — это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера...
..Базовый тип указателя определяет тип объекта, на который указатель будет ссылаться. Фактически указатель любого типа может ссылаться на любое место в памяти...

Сообщение отредактировал west329_ - Feb 23 2009, 13:42
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Feb 23 2009, 15:05
Сообщение #30


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(west329_ @ Feb 23 2009, 16:40) *
..Указатель — это переменная, значением которой является адрес некоторого объекта (обычно другой переменной) в памяти компьютера...
..Базовый тип указателя определяет тип объекта, на который указатель будет ссылаться. Фактически указатель любого типа может ссылаться на любое место в памяти...


Это вы к чему нам это радостно сообщаете?
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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