|
|
  |
Си |
|
|
|
Mar 4 2013, 09:04
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Tahoe @ Mar 4 2013, 09:36)  Да не обидится ReAl, но объяснять, это отдельное искусство. Знаю много грамотных спецов, однако, дай Б-г, если четверть из них в состоянии внятно объяснить то, чем сами отлично владеют. Увы, не в объяснении дело. Дело в том, что обсуждение перешло на уровень, который явно не по зубам новичку. Плюс к этому еще перемешали понятия (например - динамический массив из моего примера не имеет никакого отношения к понятию многомерный массив языка С, и не надо их сравнивать  ) Подробно объяснить что к чему сможет либо разработчик компиляторов, либо автор стандарта С. Но понять его сможет только второй такой же специалист
|
|
|
|
|
Mar 4 2013, 12:24
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 30-03-06
Из: Москва
Пользователь №: 15 600

|
Цитата(XVR @ Mar 4 2013, 13:04)  обсуждение перешло на уровень, который явно не по зубам новичку Отнюдь. Как раз понять элементарное, чем отличается адрес от указателя - вполне по силам. И даже необходимо. Цитата(XVR @ Mar 4 2013, 13:04)  Подробно объяснить что к чему сможет либо разработчик компиляторов, либо автор стандарта С. Нет. Объяснить/научить, это совершенно отдельная песня. Мало знать предмет, надо иметь еще навык педагога, если угодно. Одно и то же, можно объяснить разными путями, причем в одном случае, будет сразу все понятно, а в другом - хоть до дыр зачитай, ничего не поймешь.
|
|
|
|
|
Mar 4 2013, 12:47
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(XVR @ Mar 4 2013, 13:04)  например - динамический массив из моего примера не имеет никакого отношения к понятию многомерный массив языка С, и не надо их сравнивать  ) Подробно объяснить что к чему сможет либо разработчик компиляторов, либо автор стандарта С. Но понять его сможет только второй такой же специалист  Тот пример что вы привели не является массивом - ни динамическим ни многомерным, и не надо тут быть разработчиком компиляторов или автором стандартов. Во первых (и самое главное) несколько подряд new не гарантируют непрерывность, во вторых динамичность подразумевает возможность в любое время изменить размер, в третьих С - это не С++ (malloc/realloc), в четвертых в C99 появились variable-length arrays, в пятых в С++ есть std::vector
|
|
|
|
|
Mar 4 2013, 17:33
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(sasamy @ Mar 4 2013, 16:47)  Во первых (и самое главное) несколько подряд new не гарантируют непрерывность, А где там требуется непрерывность? Цитата во вторых динамичность подразумевает возможность в любое время изменить размер, Отнюдь, возможность изенения размера является желательным, а не необходимым свойством. Цитата в третьих С - это не С++ (malloc/realloc), Замените new на malloc, если так будет по феншую Цитата в четвертых в C99 появились variable-length arrays, Это есть, признаю. Цитата в пятых в С++ есть std::vector  Он одномерный. А vector<vector<>> - это вообще монстр (хотя и многомерный  )
|
|
|
|
|
Mar 5 2013, 05:58
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(sasamy @ Mar 4 2013, 22:19)  Если говорим о С/C++ непрерывность требуется для доступа к элементам массива, Мы не говорим о массиве в понимании С/С++. Цитата цитату из стандарта я вам уже приводил. Тогда тоже приведу цитату - Цитата например - динамический массив из моего примера не имеет никакого отношения к понятию многомерный массив языка С, и не надо их сравнивать Давайте назовем это (то, что было в моем примере) не массив, а 2х мерная динамическая матрица - теперь все довольны?
|
|
|
|
|
Mar 5 2013, 08:47
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(XVR @ Mar 5 2013, 09:58)  Мы не говорим о массиве в понимании С/С++. Странно, в каком понимании тогда говорить о массивах в теме с заголовком "Си"  с вашего позволения напишу в понимании Си CODE #include <stdio.h> #include <stdlib.h> #include <time.h>
void true_arr(int m, int n) { int a[m][n]; int *p = &a[0][0];
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { a[i][j] = i*n + j; printf("%d\t", p[i*n + j]); } puts(""); }
printf("sizeof(a) = %lu\n", sizeof(a)); }
int main(void) { srand(time(NULL)); int m = 1 + rand() % 10; int n = 1 + rand() % 10;
true_arr(m, n);
return 0; }
результат CODE sasa@sasa-laptop:~/tst$ gcc -Wall -std=c99 array.c && ./a.out 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 sizeof(a) = 200 sasa@sasa-laptop:~/tst$ gcc -Wall -std=c99 array.c && ./a.out 0 1 2 3 4 5 6 sizeof(a) = 28 sasa@sasa-laptop:~/tst$ gcc -Wall -std=c99 array.c && ./a.out 0 1 2 3 4 5 6 7 8 9 sizeof(a) = 40 sasa@sasa-laptop:~/tst$ gcc -Wall -std=c99 array.c && ./a.out 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 sizeof(a) = 96 sasa@sasa-laptop:~/tst$ gcc -Wall -std=c99 array.c && ./a.out 0 1 sizeof(a) = 8 sasa@sasa-laptop:~/tst$ gcc -Wall -std=c99 array.c && ./a.out 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 sizeof(a) = 84
|
|
|
|
|
Mar 5 2013, 09:04
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(sasamy @ Mar 5 2013, 12:47)  Странно, в каком понимании тогда говорить о массивах в теме с заголовком "Си"  Гм, позволю себе напомнить, о чем вообще идет речь. А идет она об ответе на вот эту фразу - Цитата Я вот думаю, что указатель на указатель используется только как формальный аргумент функции. А в качестве фактического аргумента используют адрес простого указателя. Не вижу смысла в использовании указателя на указатель где-то еще. Вот Я привел пример как его (указатель на указатель) еще можно использовать. Назвал это 'Многомерный динамический массив'. С какого перепугу вы решили, что речь шла об массивах в С мне честно говоря не понятно Цитата с вашего позволения напишу в понимании Си И какое отношение это имеет к вопросу о 'применении указателя на указатель'?
|
|
|
|
|
Mar 5 2013, 09:33
|
Знающий
   
Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858

|
Цитата(XVR @ Mar 5 2013, 13:04)  Я привел пример как его (указатель на указатель) еще можно использовать. Назвал это 'Многомерный динамический массив'. Назвать вы про себя можете как угодно, только мысль озвучена неправильно, в контексте Си вы привели пример массива указателей Цитата int** rv=new int*[dim1]; Цитата INT A[10][10]; INT *B[10];
то A и B можно использовать сходным образом в том смысле, что как A[5][5], так и B[5][5] являются законными ссылками на отдельное число типа INT. Но A - настоящий массив: под него отводится 100 ячеек памяти и для нахождения любого ука- занного элемента проводятся обычные вычисления с прямоуголь- ными индексами. Для B, однако, описание выделяет только 10 указателей; каждый указатель должен быть установлен так, чтобы он указывал на массив целых. если предположить, что каждый из них указывает на массив из 10 элементов, то тогда где-то будет отведено 100 ячеек памяти плюс еще десять ячеек для указателей. Таким образом, массив указателей использует несколько больший объем памяти и может требовать наличие яв- ного шага инициализации. заметьте - в K&R нигде не упоминается что это сферический 'Многомерный динамический массив' Цитата С какого перепугу вы решили, что речь шла об массивах в С мне честно говоря не понятно  в топике прочитал, мысли читать не умею.
|
|
|
|
|
Mar 5 2013, 10:16
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(sasamy @ Mar 5 2013, 13:33)  Назвать вы про себя можете как угодно, только мысль озвучена неправильно, Вы телепат, умеете читать мысли? Конечно, вырвать из контекста одно слово и объявить всем (в том числе и автору), что именно он имел в виду, а потом объяснить, что это не правильно - это самый лучший способ вести спор. Я еще раз заявляю - тот пример, который я приводил, не имеет отношения к массивам в С, и к K&R тоже. Цитата в топике прочитал, мысли читать не умею. А кроме названия топика не пробовали читать то, на что пытаетесь отвечать? Очень помогает, знаете ли. За сим спор с вами прекращаю, за бесполезностью. Вы сами придумали за меня, что я имел в виду, а теперь это опровергаете, упорно игнорируя любые попытки добиться взаимопонимания.
|
|
|
|
|
Mar 15 2013, 09:13
|
Профессионал
    
Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528

|
Цитата(Буратино @ Mar 15 2013, 14:52)  ну хорошо, а как правильно обращаться к указателю на который указывает указатель, Да, так. Но можно передавать параметр по ссылке. В выражениях ссылка разыменовывается автоматически, не надо подсчитывать звёздочки. Код void BDDК (char* &ref) { free (ref); ref = malloc(1000); ... }
int main() { char *s = NULL; BDDR(s); ... }
--------------------
Russia est omnis divisa in partes octo.
|
|
|
|
|
Mar 15 2013, 09:19
|
Профессионал
    
Группа: Свой
Сообщений: 1 975
Регистрация: 30-12-04
Из: Воронеж
Пользователь №: 1 757

|
Цитата(Буратино @ Mar 15 2013, 11:52)  Код void BDD (char **a) { free (*a); *a = malloc(1000); ... } А почему не realloc(*a)? Цитата(SSerge @ Mar 15 2013, 13:13)  Да, так. Но можно передавать параметр по ссылке. В выражениях ссылка разыменовывается автоматически, не надо подсчитывать звёздочки. Код void BDDК (char* &ref) { free (ref); ref = malloc(1000); ... } В Си?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|