Просмотр полной версии : массивы в сях
подскажите, как создать массив с заранее заданными элементами.
в пхп раз плюнуть
$arr[] = 0;
$arr[] = 6;
$arr[] = 78;
а вот в си чего-то не выходит так.
ещё лучше если дадите ссылку на толковый эл. учебник, буду очень признателен
подскажите, как создать массив с заранее заданными элементами.
в пхп раз плюнуть
$arr[] = 0;
$arr[] = 6;
$arr[] = 78;
а вот в си чего-то не выходит так.
ещё лучше если дадите ссылку на толковый эл. учебник, буду очень признателен
int arr[3] = {0,6,78};
а почему выбор пал на си, а не на с++?
ну насчёт книжок, если нужен именно си, то ищи в сети Кренигана и Ричи.. ссылку прям так и не дам, но если не найдёшь, могу на мыло заслать.
Robin_Hood
24.12.2006, 17:28
помоему ты просто ствил зря $ перед переменной, в С такого нету
Zadoxlik
24.12.2006, 17:35
int arr[3] = {0,6,78};
"[3]" ставить необязательно. Массив char'ов можно задавать в кавычках двойных
char array[] = "qwerty";
"[3]" ставить необязательно. Массив char'ов можно задавать в кавычках двойных
char array[] = "qwerty";
ну я тогда тоже выпендрюсь, и скажу, что массивы wchar_t
можна задавать в ковычках с префиксным L
wchar_t mumu[] = L"ляляля";
тока в исходном вопросе вопрос был о интах
а давайте будем не выпендриваться, а отвечать по теме...
по теме -
int a1[] = {1,2,3};
int a2[3] = {1,2,3};
int a3[3];
a3[0] = 1;
a3[1] = 2;
a3[2] = 3;
кернигана лучше не стоит с тех пор многое изменилось с примерами будут проблемы лучше почитать про структурную часть с++ помоему никакой разницы.
кернигана лучше не стоит с тех пор многое изменилось с примерами будут проблемы лучше почитать про структурную часть с++ помоему никакой разницы.
вопрос по сям, если нужно именно си, то ботать плюсы нет смысла, ибо они больше и сложнее.
какая разница принтф и в си и в си++ работает одинаково а найти книжку по си с примерами компилируемыми например в вижл студии проблемно
переписать код С++, который не использует ооп, на Си как раз плюнуть.
конечно, новичок это сделать не сможет, но, имхо, стоит учить не Си, а С++ без ооп.
Потом можно для общего образования познакомиться с Си.
Я так и сделал кстати, когда учил оба эти языка.
читать не перечитать http://c-books.info/books/load.php?ty=c там много всего
З.Ы. язвиняюсь что не по теме у меня конектор ЭрДжей к херам развалился я его по частям в гнездо засунул, а он чегото плохо работает а обжать новый нечем, да и нового то нет. Я чего хотел то ниукого такого не было может кто посоветует чего делать? ато уже 18:10 в магазин идти не охото да и завтра думаю не пойду.
переписать код С++, который не использует ооп, на Си как раз плюнуть.
вопрос не про это, если человеку нужен именно си,
то нафига ему ртти, нафига ему плюсовые исключения, шаблоны, классы? на сях это ему не понадобится..
и до сих пор же остались вещи куда плюсы особенно не лезут, и если человеку именно это нужно, то нафиг оно ему надо?
с другой стороны, если у человека нет определенности и есть возможность выбирать, то в дальнейшем он будет более востребован со знанием с++, чем с чистым си, но тогда и подход к изучению должен быть совсем другим, тот же Страуструп в своей книге пишет, что для изучения с++ будет лучше, если вы никогда не писали на си, так как в противном случае резко увеличивается опасность писать не правильно с точки зрения с++ и ооп в частности, но абсолютно разумно с точки зрения чистого си.
Гыгыгы а помоему автору похеру на язык и си он написал потому что влом было ++ писать =)
переписать код С++, который не использует ооп Ооо, а токое бывает? )
Имеется ввиду только хороший код ;)
Просили книгу Кернигана и Ритчи... Вот: http://openlib.org.ua/ru/books/id/14/
давайте определимся какава цель использования си. а мой взгляд это использование связки си+ВинАпи с целью уменьшения размера и увеличения скорости. тогда надо искать компилятор и хидеры класического си. иначе вижл студия или билдер всеравно накидают много всякой хрени в экзешник. а если просто написать какую нить левую програмку в целях обучения помоему нет никакой разницы что с чего начинать обучение
давайте определимся какава цель использования си.
например в winDDK поддержки плюсовой crt нету,
хочешь не хочешь - будешь писать на си)
открою жуткую тайну - си (а не с++) потому что я учусь на первом курсе универа и там мы изучаем именно его.
к сожалению учусь на заочном и учебника нет - потому и пишу такие вопросы
спасибо за ответы всем
хм не угадал. так ни кто не подскажет с разьемом че делать соединение падает до 1кб. Я херею как раньше люди таким скоростям радовались
почему когда я создаю массив с четырьмя элементами, там их 16 и все остальные равны нулю?
int A[4] = {6,5,4,3}
printf("%d", sizeof(A));
>> 16
тьфу блин, я начинаю подозревать что в отличии от php, здесь сайзОф возвращает вовсе не элементы. тогда как посчитать элементы?
Zadoxlik
04.01.2007, 20:27
sizeof размер места, занимаемый переменной в памяти. У тебя А имеет тип массива int из 4 элементов. Обычно под разрядностью инт понимается разрядность регистра общего назначения процессора системы. В 32битных компиляторах тип int занимает 32 бита или 4 байта, а у тебя элемента 4. 4*4 = 16. Сошлось!
хоть я это и сам понял, всё равно пасиба
осталось узнать функцию, считающую кол-во элементов
sizeof(A)/sizeof(int) имхо 1 выведет, так как 4/4(у большинства так) = 1 :)
Но не проверял, не знаю =)
осталось узнать функцию, считающую кол-во элементов С или C++?
На C - никак.
На C++ - можно, но если массивы типа CArray, vector или подобные. Просто посмотри список их методов.
int A[10];
Узнать число элементов - sizeof(A)/sizeof(*A).
Отдаст 10
nerezus, неа ;) все далеко не так
Zadoxlik
05.01.2007, 01:16
имхо 1 выведет, так как 4/4(у большинства так) = 1
=P Nerezus
nerezus, неа все далеко не так В качестве подтверждения своих слов напиши-ка ф-ию, определяющую кол-во элементов ;)
как всегда, мы говорили о разных вещах.
int func(int a[])
{
return sizeof(a);
}
int main()
{
int rrr[10];
printf("%d\n", func(rrr));
return 0;
}
Вывод - 4.
Вполне очевидно, потому что
int func(int a[])
нихрена это не массив. В функцию передается указатель на него и это полностью аналогично этому:
int func(int *a)
int rrr[10];
printf("%d\n", sizeof(rrr));
Вывод - 40.
Тоже очевидно. 10 элементов по 4 байта.
В функцию передается указатель на него Про что я и говорил.
Любой sizeof(), как ты сказал, определяется на этапе компиляции.
Вывод: sizeof() не подходит.
Т.к. с такой же легкостью мы можем подставить туда числовое значение.
Ну так вот, на сишнике я не вижу способа определить размер массива.
Динамечски - конечно нельзя.
никто и не спорит)
ммм, извините ламера, но разве в этом случае sizeof(A[])/4 - не будет являться кол-вом элементов int-массива? :)
Дикс
1) при передаче в ф-ию передается не массив, а лишь указатель на его первый элемент.
2) если это не в ф-ии, то смысла нет, т.к. мы можем просто тупо набрать число с клавы.
Тем более, int != 4, хотя это верно для большинства машин(но не для всех)
ммм, извините ламера, но разве в этом случае sizeof(A[])/4 - не будет являться кол-вом элементов int-массива?
насколько я помню, указатель - 4 байта, делить на четыре будет всегда еденица.
Тем более, int != 4, хотя это верно для большинства машин(но не для всех)
Для всех 32-битных.
Для 64-битных хз, логично предположить, что 64 бита, потому что и в 32- и в 16-битных процах размер инта был равен размеру машинного слова.
указатель - 4 байта, делить на четыре будет всегда еденица. Нет, не 4 байта, а int.
Никогда не задумывался, отчего в том же турбопаскале нелязя было юзать больше 64кб памяти без применения спец-фишек? )
А в 32битных системах больше 4 гигов?
а при чем тут инт )
ну совпадает оно с размером адреса нуичо)
нуичо А то, что ты сказал, что при делении на 4 будет всегда 1.
А это неверно, т.к. указатель нихрена не 4, просто он 4 на большинстве машин!
Ну блин, есесно что не везде :) лол.
Я же не говорил, что на intel 8088 он тоже 4 байта )
Ну блин, есесно что не везде лол.
насколько я помню, указатель - 4 байта
На большинстве современных машин - 8.
на 32-битных процах в защищенном режиме виртуальное адресное пространство ограничено 4Гб.
Из-за PAE (Physical Address Extensions) есть доступ к 64Гб памяти, но указатель все равно остался 4 байта.
А вот на 64битных можно адресовать уже 2^64 байт памяти и размер адреса стал 8 байт
и размер адреса стал 8 байт Ога )
А ведь мог бы просто написать "Да, я был не прав" ;)
А вот на 64битных можно адресовать уже 2^64 байт памяти и размер адреса стал 8 байт
ай, как хорошо быть теоретиком,
только вот на практике пока можна адресовать только 2^48, остальные биты зарезервированы(это справедливо как для интеловской так и для амд-ой платформы)
... А если по теме то зицеоф() в сях не предназначен для определения длины массива... поэтому в сишных функциях присутствуют такие вещи типа
fgets(char *str, int n, FILE *stream)
(c) тов. Касперски.
и ваще в сях для определения размерности массива средств нету...
или мы уже не про то ? )))))
и ваще в сях для определения размерности массива средств нету... Ну я это и говорил ;)
А вот в C++ есть ;)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot