Язык программирования C

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Язык программирования C

Сообщение da67 » 03 апр 2009, 19:07

qwertylol писал(а):Source of the post A кто же тогда макросы раскрывает?
Препроцессор. Есть такая хрень в языке C. Команды, предназначенные для него начинаются c диеза. Например define и include.
Как раз компилятор получает исходный код и превращает его в бинарный.
Поле препроцессора.
Компилятор не сможет понять

Код: Выбрать все

a(0,3)

это обращение к массиву или к функции.
Для компилятора это однозначно функция. У массива скобки квадратные.
Именно поэтому нельзя называть функцию и переменную одним именем.
He поэтому. Если бы переменные и функции жили в разных пространствах имён, то можно было бы.
Последний раз редактировалось da67 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Язык программирования C

Сообщение qwertylol » 03 апр 2009, 19:17

da67 писал(а):Source of the post
Препроцессор. Есть такая хрень в языке C. Команды, предназначенные для него начинаются c диеза. Например define и include.

da67 писал(а):Source of the post Поле препроцессора.

Да, точно. Только это ничего не меняет, в таком случае препроцессор не поймёт функция это или массив.
da67 писал(а):Source of the post Для компилятора это однозначно функция. У массива скобки квадратные.

A YURI хочет, чтоб это был массив.
da67 писал(а):Source of the post He поэтому. Если бы переменные и функции жили в разных пространствах имён, то можно было бы.

Контрпример- перегрузка функций.
Последний раз редактировалось qwertylol 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Язык программирования C

Сообщение da67 » 03 апр 2009, 19:23

qwertylol писал(а):Source of the post Только это ничего не меняет, в таком случае препроцессор не поймёт функция это или массив.
Препроцессору не надо понимать, он тупо заменяет один текст на другой, не проводя никакого анализа.
Контрпример- перегрузка функций.
He понял. Контрпример к чему?
Последний раз редактировалось da67 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
YURI
Сообщений: 5373
Зарегистрирован: 12 дек 2007, 21:00

Язык программирования C

Сообщение YURI » 03 апр 2009, 19:41

da67 писал(а):Source of the post
qwertylol писал(а):Source of the post Мне интересно, как тогда компилятор будет массивы от функций отличать .
Компилятор получает текст уже после раскрытия всех макросов.


YURI писал(а):Source of the post
#define a(i,j) a[i][j]
Так не работает?
Нет, ведь матрица задана в одномерном массиве.
B исходном задании такого условия не было Это точно так? Как описан массив?
Я думал можно вот так,
#define a(i,j) a(i*n+j)
но не работает.
У второго a скобки должны быть квадратными.

Как всё же описан массив? Это важно.


Я забыл указать, что матрица задана в одномерном массиве, однако думал что это будет понятно из названия темы.
У второго a скобки должны быть квадратными.

Да, конечно. Это я писал про квадратную матрицу. Должно быть где-то так. Сейчас ещё раз проверю.
Последний раз редактировалось YURI 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
YURI
Сообщений: 5373
Зарегистрирован: 12 дек 2007, 21:00

Язык программирования C

Сообщение YURI » 03 апр 2009, 19:58

Например так не работает (печатает большое число)

Код: Выбрать все

#include<stdio.h>
#define a(i,j) a[i*n+j]
int main(void)
{ int n=3;
 int a[9]={11, 12, 13, 21, 22, 23, 31, 32, 33};
 printf("%d\n", a(3,3));
 system("PAUSE");
 return 0;
}
Последний раз редактировалось YURI 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
qwertylol
Сообщений: 3761
Зарегистрирован: 01 ноя 2007, 21:00

Язык программирования C

Сообщение qwertylol » 03 апр 2009, 20:01

da67 писал(а):Source of the post
Препроцессору не надо понимать, он тупо заменяет один текст на другой, не проводя никакого анализа.

Тогда компилятор вообще функций не увидит, т.к. препроцессор всех их на массивы заменит(ну или только c двумя входными параметрами).
da67 писал(а):Source of the post He понял. Контрпример к чему?

Мда, тут я тоже запутался. Что за "пространство имён" вы имеете ввиду? Строго говоря поддержки пространств имён в Си вообще нет, в Си++ появилась. Я подумал, что вы имеете ввиду, что адреса переменных и функций хранятся в разных секциях. Я хочу показать, что это не является серьёзной преградой для использования функции и переменной c одним именем. Тут достаточно вспомнить про то, что делает компилятор c перегруженными функциями, что может ему помешать также поступить и c переменными? Я ведь могу использовать адрес функции как переменную, и если запишу в массив бинарный код, то смогу его выполнить.
Последний раз редактировалось qwertylol 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Язык программирования C

Сообщение da67 » 03 апр 2009, 20:03

a(3,3) далеко за пределами массива. Максимум a(2,2).
Последний раз редактировалось da67 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
YURI
Сообщений: 5373
Зарегистрирован: 12 дек 2007, 21:00

Язык программирования C

Сообщение YURI » 03 апр 2009, 20:14

da67 писал(а):Source of the post
a(3,3) далеко за пределами массива. Максимум a(2,2).

Ну да, ошибочка, вот так почему не работает?

Код: Выбрать все

#include<stdio.h>
#define a(i,j) a[i*(n-1)+j]
int main(void)
{ int n=3;
 int a[9]={11, 12, 13, 21, 22, 23, 31, 32, 33};
 printf("%d\n", a(3,3));
 system("PAUSE");
 return 0;
}
Последний раз редактировалось YURI 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
da67
Сообщений: 5491
Зарегистрирован: 18 фев 2008, 21:00

Язык программирования C

Сообщение da67 » 03 апр 2009, 20:26

qwertylol писал(а):Source of the post Тогда компилятор вообще функций не увидит, т.к. препроцессор всех их на массивы заменит(ну или только c двумя входными параметрами).
He все, атолько те, у которых имя и количество аргументов совпадёт c написанным в макросе. Такими конечно придётся пожертвовать. Остальные будут нормально работать.
Что за "пространство имён" вы имеете ввиду? Строго говоря поддержки пространств имён в Си вообще нет, в Си++ появилась.
Насколько я помню, теги структур не конфликтуют c именами объектов. Про такое обычно говорят, что они в разных пространствах имён. Например объявление

Код: Выбрать все

struct u{int u;}u;
никаких проблем не вызовет.
Я подумал, что вы имеете ввиду, что адреса переменных и функций хранятся в разных секциях.
Нет, я не o реализации, a o правилах игры.
Я хочу показать, что это не является серьёзной преградой для использования функции и переменной c одним именем. Тут достаточно вспомнить про то, что делает компилятор c перегруженными функциями,
B большинстве случаев на уровне препроцессора к имени функции добавляются типы получаемых переменных. Для компилятора этой проблемы уже нет.
что может ему помешать также поступить и c переменными? Я ведь могу использовать адрес функции как переменную, и если запишу в массив бинарный код, то смогу его выполнить.
Из приличных мест за такое увольняют
Сделать можно всё. Мы сейчас обсуждаем возможности, реализованные в языке.
To, что хочет YURY, сделать можно, причём несколькими способами, не выходя за рамки встроенных возможностей языка C.



YURI писал(а):Source of the post вот так почему не работает?
По той же причине. B массиве из девяти элементов нет девятого, есть от 0 до 8.
i,j должны меняться от 0 до 2.


Лучше это сделать как-нибудь так:

Код: Выбрать все

#include<stdio.h>

int A[9]={11, 12, 13, 21, 22, 23, 31, 32, 33};
int (*a)[3]=(int (*)[3])A;

int main(void)
{
 printf("%d\n", a[2][2]);
 return 0;
}
Последний раз редактировалось da67 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
YURI
Сообщений: 5373
Зарегистрирован: 12 дек 2007, 21:00

Язык программирования C

Сообщение YURI » 03 апр 2009, 20:42

Действительно. Сейчас посмотрим.
#include<stdio.h>

int A[9]={11, 12, 13, 21, 22, 23, 31, 32, 33};
int (*a)[3]=(int (*)[3])A;

int main(void)
{
printf("%d\n", a[2][2]);
return 0;
}

Это не совсем то. Сейчас сам покопаюсь.


Заработало!! Просто не учёл что a[0]-первый элемент массива... Бывает...

Код: Выбрать все

#include<stdio.h>
#include<math.h>
#define a(i,j) a[(i-1)*n+j-1]
int main(void)
{ int n=3;
 int a[9]={11, 12, 13, 21, 22, 23, 31, 32, 33};
 printf("%d\n", a(1,3));
 system("PAUSE");
 return 0;
}


Mipter, спасибо за помощь.
Последний раз редактировалось YURI 30 ноя 2019, 09:36, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 9 гостей