PDA

Просмотр полной версии : массивы в сях


Дикс
24.12.2006, 17:11
подскажите, как создать массив с заранее заданными элементами.

в пхп раз плюнуть
$arr[] = 0;
$arr[] = 6;
$arr[] = 78;

а вот в си чего-то не выходит так.

ещё лучше если дадите ссылку на толковый эл. учебник, буду очень признателен

sni4ok
24.12.2006, 17:17
подскажите, как создать массив с заранее заданными элементами.

в пхп раз плюнуть
$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";

sni4ok
24.12.2006, 17:43
"[3]" ставить необязательно. Массив char'ов можно задавать в кавычках двойных
char array[] = "qwerty";

ну я тогда тоже выпендрюсь, и скажу, что массивы wchar_t
можна задавать в ковычках с префиксным L

wchar_t mumu[] = L"ляляля";

тока в исходном вопросе вопрос был о интах

_Great_
24.12.2006, 18:50
а давайте будем не выпендриваться, а отвечать по теме...

по теме -
int a1[] = {1,2,3};

int a2[3] = {1,2,3};

int a3[3];
a3[0] = 1;
a3[1] = 2;
a3[2] = 3;

da_ff
24.12.2006, 18:52
кернигана лучше не стоит с тех пор многое изменилось с примерами будут проблемы лучше почитать про структурную часть с++ помоему никакой разницы.

sni4ok
24.12.2006, 18:55
кернигана лучше не стоит с тех пор многое изменилось с примерами будут проблемы лучше почитать про структурную часть с++ помоему никакой разницы.

вопрос по сям, если нужно именно си, то ботать плюсы нет смысла, ибо они больше и сложнее.

da_ff
24.12.2006, 18:59
какая разница принтф и в си и в си++ работает одинаково а найти книжку по си с примерами компилируемыми например в вижл студии проблемно

_Great_
24.12.2006, 19:00
переписать код С++, который не использует ооп, на Си как раз плюнуть.
конечно, новичок это сделать не сможет, но, имхо, стоит учить не Си, а С++ без ооп.
Потом можно для общего образования познакомиться с Си.
Я так и сделал кстати, когда учил оба эти языка.

da_ff
24.12.2006, 19:09
читать не перечитать http://c-books.info/books/load.php?ty=c там много всего

З.Ы. язвиняюсь что не по теме у меня конектор ЭрДжей к херам развалился я его по частям в гнездо засунул, а он чегото плохо работает а обжать новый нечем, да и нового то нет. Я чего хотел то ниукого такого не было может кто посоветует чего делать? ато уже 18:10 в магазин идти не охото да и завтра думаю не пойду.

sni4ok
24.12.2006, 19:09
переписать код С++, который не использует ооп, на Си как раз плюнуть.


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

da_ff
24.12.2006, 19:15
Гыгыгы а помоему автору похеру на язык и си он написал потому что влом было ++ писать =)

nerezus
24.12.2006, 19:15
переписать код С++, который не использует ооп Ооо, а токое бывает? )
Имеется ввиду только хороший код ;)

ATFakep
24.12.2006, 19:19
Просили книгу Кернигана и Ритчи... Вот: http://openlib.org.ua/ru/books/id/14/

da_ff
24.12.2006, 19:23
давайте определимся какава цель использования си. а мой взгляд это использование связки си+ВинАпи с целью уменьшения размера и увеличения скорости. тогда надо искать компилятор и хидеры класического си. иначе вижл студия или билдер всеравно накидают много всякой хрени в экзешник. а если просто написать какую нить левую програмку в целях обучения помоему нет никакой разницы что с чего начинать обучение

sni4ok
24.12.2006, 19:52
давайте определимся какава цель использования си.

например в winDDK поддержки плюсовой crt нету,
хочешь не хочешь - будешь писать на си)

Дикс
24.12.2006, 20:24
открою жуткую тайну - си (а не с++) потому что я учусь на первом курсе универа и там мы изучаем именно его.
к сожалению учусь на заочном и учебника нет - потому и пишу такие вопросы

спасибо за ответы всем

da_ff
24.12.2006, 20:39
хм не угадал. так ни кто не подскажет с разьемом че делать соединение падает до 1кб. Я херею как раньше люди таким скоростям радовались

Дикс
04.01.2007, 20:09
почему когда я создаю массив с четырьмя элементами, там их 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. Сошлось!

Дикс
04.01.2007, 22:42
хоть я это и сам понял, всё равно пасиба
осталось узнать функцию, считающую кол-во элементов

Deem3n®
04.01.2007, 23:36
sizeof(A)/sizeof(int)

nerezus
05.01.2007, 00:59
sizeof(A)/sizeof(int) имхо 1 выведет, так как 4/4(у большинства так) = 1 :)
Но не проверял, не знаю =)

осталось узнать функцию, считающую кол-во элементов С или C++?
На C - никак.
На C++ - можно, но если массивы типа CArray, vector или подобные. Просто посмотри список их методов.

_Great_
05.01.2007, 01:03
int A[10];

Узнать число элементов - sizeof(A)/sizeof(*A).
Отдаст 10

nerezus, неа ;) все далеко не так

Zadoxlik
05.01.2007, 01:16
имхо 1 выведет, так как 4/4(у большинства так) = 1
=P Nerezus

nerezus
05.01.2007, 01:23
nerezus, неа все далеко не так В качестве подтверждения своих слов напиши-ка ф-ию, определяющую кол-во элементов ;)

_Great_
05.01.2007, 01:28
как всегда, мы говорили о разных вещах.

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 байта.

nerezus
05.01.2007, 01:38
В функцию передается указатель на него Про что я и говорил.

Любой sizeof(), как ты сказал, определяется на этапе компиляции.
Вывод: sizeof() не подходит.
Т.к. с такой же легкостью мы можем подставить туда числовое значение.

Ну так вот, на сишнике я не вижу способа определить размер массива.

_Great_
05.01.2007, 01:48
Динамечски - конечно нельзя.
никто и не спорит)

Дикс
06.01.2007, 20:18
ммм, извините ламера, но разве в этом случае sizeof(A[])/4 - не будет являться кол-вом элементов int-массива? :)

nerezus
06.01.2007, 22:16
Дикс
1) при передаче в ф-ию передается не массив, а лишь указатель на его первый элемент.
2) если это не в ф-ии, то смысла нет, т.к. мы можем просто тупо набрать число с клавы.

Тем более, int != 4, хотя это верно для большинства машин(но не для всех)

_Great_
06.01.2007, 22:28
ммм, извините ламера, но разве в этом случае sizeof(A[])/4 - не будет являться кол-вом элементов int-массива?
насколько я помню, указатель - 4 байта, делить на четыре будет всегда еденица.

Тем более, int != 4, хотя это верно для большинства машин(но не для всех)
Для всех 32-битных.
Для 64-битных хз, логично предположить, что 64 бита, потому что и в 32- и в 16-битных процах размер инта был равен размеру машинного слова.

nerezus
06.01.2007, 23:44
указатель - 4 байта, делить на четыре будет всегда еденица. Нет, не 4 байта, а int.

_Great_
07.01.2007, 00:07
При чем тут инт )

nerezus
07.01.2007, 00:21
Никогда не задумывался, отчего в том же турбопаскале нелязя было юзать больше 64кб памяти без применения спец-фишек? )
А в 32битных системах больше 4 гигов?

_Great_
07.01.2007, 00:38
а при чем тут инт )
ну совпадает оно с размером адреса нуичо)

nerezus
07.01.2007, 00:42
нуичо А то, что ты сказал, что при делении на 4 будет всегда 1.
А это неверно, т.к. указатель нихрена не 4, просто он 4 на большинстве машин!

_Great_
07.01.2007, 01:03
Ну блин, есесно что не везде :) лол.
Я же не говорил, что на intel 8088 он тоже 4 байта )

nerezus
07.01.2007, 12:12
Ну блин, есесно что не везде лол.

насколько я помню, указатель - 4 байта
На большинстве современных машин - 8.

_Great_
07.01.2007, 12:20
на 32-битных процах в защищенном режиме виртуальное адресное пространство ограничено 4Гб.
Из-за PAE (Physical Address Extensions) есть доступ к 64Гб памяти, но указатель все равно остался 4 байта.
А вот на 64битных можно адресовать уже 2^64 байт памяти и размер адреса стал 8 байт

nerezus
07.01.2007, 12:50
и размер адреса стал 8 байт Ога )
А ведь мог бы просто написать "Да, я был не прав" ;)

sni4ok
07.01.2007, 13:34
А вот на 64битных можно адресовать уже 2^64 байт памяти и размер адреса стал 8 байт

ай, как хорошо быть теоретиком,
только вот на практике пока можна адресовать только 2^48, остальные биты зарезервированы(это справедливо как для интеловской так и для амд-ой платформы)

dexus
09.01.2007, 23:20
... А если по теме то зицеоф() в сях не предназначен для определения длины массива... поэтому в сишных функциях присутствуют такие вещи типа

fgets(char *str, int n, FILE *stream)

(c) тов. Касперски.

и ваще в сях для определения размерности массива средств нету...
или мы уже не про то ? )))))

nerezus
10.01.2007, 00:17
и ваще в сях для определения размерности массива средств нету... Ну я это и говорил ;)
А вот в C++ есть ;)