Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Вниз

Задачки по Си   Найти похожие ветки 

 
Lamer@fools.ua ©   (2005-09-02 16:00) [40]

>>БарЛог ©   (02.09.05 12:51) [35]

>1. 1 байт
2. 5 байт + длина массива тоже наверно хранится = 6 байт
3. 5*5 байт + 2 байта (размерность массива) = 27 байт
4. А так разве можно? :)


1. Да.
2. Нет.
3. Нет.
4. Можно.


 
БарЛог ©   (2005-09-02 19:36) [41]

Lamer@fools.ua ©   (02.09.05 16:00) [40]
Кажется в 4. мы, как я понял, создаем массив из 3-х элементов "*".

Вот с "памятью" у меня не очень :(

Не подскажете правильные ответы?
Желательно с пояснениями.


 
Канадец   (2005-09-02 20:12) [42]

palva ©   (01.09.05 11:13) [31]

char c3[5,5];


Это что за объявление такое?

char c1;
char c2[5];
char c3[5,5];
char c4[] = "***";

>БарЛог ©   (02.09.05 19:36) [41]

1. 1 байт. Пояснения я думаю не требуются.
2. 5 байт. Никаких размеров массива в С нет.
3. Как palva © объяснит чего такого он хотел объявить, тогда и посчитаем :)
4. 4 байта. Три символа в строке + символ конца строки


 
БарЛог ©   (2005-09-02 20:55) [43]

Канадец   (02.09.05 20:12) [42]
Тьфу ты! Как все просто :)
(Особенно про строку в конце!)
Думаю, в "char c3[5,5];" имеется ввиду char "c3[5][5];" ... это все паскаль\делфи - привычка.


 
Lamer@fools.ua ©   (2005-09-04 22:50) [44]

>>БарЛог ©   (02.09.05 19:36) [41]

1. = sizeof(char)
2. = sizeof(char) * 5
3. = sizeof(char) * 5 * 5
4. char c4[] = "***"
эквивалентно char* c4 = "***"
То есть sizeof(c4) = sizeof(char*) = sizeof(void*) = размеру указателя: в Win32 - 4 байта, в DOS - зависит от модели сборки (tiny, small, large, huge etc.).


 
palva ©   (2005-09-04 23:37) [45]

3. Как palva © объяснит чего такого он хотел объявить, тогда и посчитаем :)
3. = sizeof(char) * 5 * 5

Правильный ответ 5 (конечно, если sizeof(char) равно единице, я не знал, что бывает иначе).

При описании массива в квадратных скобках должен стоять размер массива, который должен представлять собой константное выражение.
Например, m[2+3] имеет размер 5, m[2,3] имеет размер 3, потому что выражение 2,3 равно 3. В си имеется операция ",", которая означает последовательное вычисление операндов и взятие последнего вычисленного значения. По старшинству эта операция располагается непосредственно перед операцией присваивания.
Следующая программа, в которой ошибочно для отделения дробной части числа применена запятая, напечатает 15

#include <stdio.h>
void main() {
 printf("%d\n", (4*2,5+10));
}

Если убрать внутренние скобки то будет напечатано 8, поскольку символ "," будет рассматриваться уже не как арифметическая операция, а как символ разделения списка параметров при обращении к функции.

char c4[] = "***"
не эквивалентно
char* c4 = "***"
В первом случае компилятор выделит четыре байта и заполнит их соответственно. Во втором случае будет создан указатель и дополнительно массив из четырех байтов, на который этот указатель указывает. sizeof будет одинаковый (Win32), но смысл будет разный. В первом случае это размер массива, во втором - размер указателя.


 
Канадец   (2005-09-05 02:51) [46]

>Lamer@fools.ua © [44]
То есть sizeof(c4) = sizeof(char*) = sizeof(void*) = размеру указателя

Читай последний абзац palva © [45], он всё доходчиво объяснил. От себя лишь добавлю: тот факт что в С имя массива фактически означает  указатель на его начало, совсем не означает, что sizeof от этого имени даёт размер указателя.

>palva © [45]
При описании массива в квадратных скобках должен стоять размер массива, который должен представлять собой константное выражение.
Например, m[2+3] имеет размер 5, m[2,3] имеет размер 3, потому что выражение 2,3 равно 3. В си имеется операция ",", которая означает последовательное вычисление операндов и взятие последнего вычисленного значения. По старшинству эта операция располагается непосредственно перед операцией присваивания.


IHMO совсем не факт, что компилятор разберётся в подобных хитросплетениях. Например последний от Microsoft посылает сразу с жалобой на то, что ожидается константа. Других у меня нет чтобы попробовать.

Вообще это всё конечно интересно с чисто познавательной точки зрения, но упаси Господи встретить такое в коде.... Хотя есть такие индивидумы, которые стараются сказку сделать былью не думая башкой, что этот код кто-то после них разбирать будет. Как то на заре своей юности я очень долго чесал репу кода разбирая чей-то код увидел что-то вроде этого:


char c2[5];
2[c2] = "s";


 
Джо ©   (2005-09-05 02:53) [47]


> char c2[5];
> 2[c2] = "s";

Это шо ж такое?


 
Lamer@fools.ua ©   (2005-09-05 09:18) [48]

>>Канадец   (05.09.05 02:51) [46]

Да. С 4-м я лопухнулся.


 
palva ©   (2005-09-05 10:50) [49]

Канадец   (05.09.05 02:51) [46]
> Например последний от Microsoft посылает сразу с жалобой на то, что ожидается константа.
Да, здесь я был неправ, нужно было проверить на компьютере. char m[3+5] срабатывает, а char m[3,5] нет. Если поставить дополнительные скобки char m[(3,5)], то работать будет, но сразу же будет раскрыта замаскированная подколка. Более продвинутые сишники на Форуме, наверно, объяснят почему такая разница между операциями "+" и ",". Нужно было придумать другую задачу с маскировкой операции запятая.

> упаси Господи встретить такое в коде
Паскалисты переходя на си делают такую ошибку ОЧЕНЬ часто. См. выше в этой ветке в [19]
mas[i,j]=mas[i2,j2];
В данном случае компилятор сообщит об ошибке, потому что не сможет присвоить указатель. Но может быть ситуация, когда подобная ошибка не вызовет диагностики - просто работать будет не так как ожидалось. Например программа
#include <stdio.h>
void main() {
 int c[3][5];
 c[1][1] = 5;
 printf("%d\n", c[1,1]);
}

Откомпилируется и будет работать, но печатать будет некое большое число, а не 5.


 
MOA ©   (2005-09-05 11:16) [50]

>если sizeof(char) равно единице, я не знал, что бывает иначе
Хм, а разве иначе бывает? Я был уверен, что по стандарту sizeof(char) тождественно равно 1 - так определена операция sizeof.
(Вот в подтверждение кусок из MSDN - другого учебника по С быстро не найти:
The sizeof operator yields the size of its operand with respect to the size of type char.)
Другое дело, что к-во битов в char может быть разным ;).
И позвольте тоже парочку примеров:

int a, b, c;
...
//Как проще записать следующие операции?
a = ~a + 1;
b <<=1;
c >>=1;

:)



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2005.09.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.037 c
4-1122893440
Гомункул
2005-08-01 14:50
2005.09.25
А можно автоматом писать версию (билд) exe-шника в label ?


10-1103636663
andsoft
2004-12-21 16:44
2005.09.25
Создание таблицы в трехуровневом приложении из клиента


3-1123656843
Denis
2005-08-10 10:54
2005.09.25
Access не воспринимает запрос


4-1122809089
Duk_
2005-07-31 15:24
2005.09.25
Драйвер


14-1125141213
alpet
2005-08-27 15:13
2005.09.25
Восстановление видео.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский