Форум программистов, компьютерный форум CyberForum.ru

Может ли в Ц переменная иметь переменные значения? Строки... - C++

Восстановить пароль Регистрация
 
MySQL
Сообщений: n/a
13.03.2011, 21:10     Может ли в Ц переменная иметь переменные значения? Строки... #1
Код
Есть простой и понятный кусочек на PHP:
$variable='value' $string='Variable='.$variable.' 
'
Переписываю на Ц без плюзов GCC 3.2.2 под FreeBSD:
#include </usr/include/stdio.h>
int main (int argc, char **argv) {	char Variable[]='value'; char String[]='variable=';
strcat(String, Variable);	char Variable[]='value';	exit(0); }
Когда char Variable[]='value'; первое и единственное - суперсложная программа компилируется.
Когда char Variable[]='value'; встречается второй раз, GCC отказывается компилировать:
strcat.c: In function `main':
strcat.c:9: redeclaration of `Variable'
strcat.c:5: `Variable' previously declared here
Если я правильно понимаю, Переменная==Переменная . Переменной (в отличие от константы) допускается иметь переменные (не постоянные) значения!
Есть ли какой вариант изобразить что-то типо:
#include </usr/include/stdio.h>
char Table[5], User[5], Query[100];	int main (int argc, char **argv)	{
char Table[]='users'; char User[]='login';
Query=tipo_printf?('select password from %s where login='%s'',Table,User);
exit(0);	}
Где функция tipo_printf? возвращает строку (ой, простите, незадекларированный на таможне тип данных, в смысле 'именованный массив, содержащий в виде элементов данные типа чарактер').
Представляю насколько громоздким будет результирующий код после 'оптимизирующего' Ц, если для элементарного действия требуется вызвать библиотекарь, который подгрузит *.so модуль, содержащий нужную функцию. Как минимум тысячи машинных тактов. На Его Величестве Ассемблер, задача решается элементарно:
lea esi, offset Source1
lea edi, offset Target
mov ecx, offset [counter1]
rep movsb
lea esi, offset Source2
mov ecx, offset [counter2]
rep movsb
Как бы GCC убедить, что переменная может иметь переменные значения?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.03.2011, 21:10     Может ли в Ц переменная иметь переменные значения? Строки...
Посмотрите здесь:

Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? C++
Нужно отформатировать текст находящийся в файле: каждое предложение должно иметь порядковый номер и начинаться с красной строки C++
Какое назначение может иметь в программе приведенный цикл без тела? C++
C++ Какую наибольшую стоимость может иметь путь из клетки (1, 1) в клетку (n, m), если передвигаться за 1 шаг можно только на правую или нижнюю клетку.
переменная присваивает значения вектора C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
13.03.2011, 22:12     Может ли в Ц переменная иметь переменные значения? Строки... #2
Ваш текст написан на C++, а не на C.
Одна ошибка - это вы два раза объявляете переменную с одним и тем же именем Variable. Вторая ошибка - это вы выходите за границу массива при обращении к функции strcat. Компилятор на это ничего вам не сказал, но при выполнении вы скорее всего получите 'непредсказуемое поведение программы', поскольку затрете чужую память.
MySQL
Сообщений: n/a
14.03.2011, 00:30     Может ли в Ц переменная иметь переменные значения? Строки... #3
А что в этой мощной программе указывает, что она с двумя плюсами? Вроде никаких классов нет.
Я итак объявляю переменную Variable дважды: до main и в теле, другие конструкции GCC не понимает.
Как тогда переменной присваивать новое значение!??? Использование только констант допустимо только в этом примере, в реальной программе переменная должна быть переменной! Т.е. без каких-либо ограничений позволять изменять свое значение. char [near_infinity] Variable; переписать можно. Во время выполнения вызываемая функция должна беспокоиться о границах массива и контролировать возможность затереть чужую память. Поскольку Ц - язык высокого уровня, программист лишен возможности контролировать поведение чужой функции.

Вот более приближенный к жизни вариант, который проглатывает GCC:

#include </usr/include/stdio.h>
char *Table, *User, Query;
int main (int argc, char **argv) {
Table='users'; User='Vasya'; printf('Table=%s
User=%s
',Table,User);
Query=sprintf('select password from %s where login='%s'',Table,User);
printf('Query=%s',Query);
exit(0); }

Но происходит крах во время исполнения:
./strcat
Table=users
User=Vasya
Bus error (core dumped)

Странно то, что в прототипе:
cat /usr/include/stdio.h | grep sprintf
int sprintf(char * __restrict, const char * __restrict, ...);
А ведь int != char , не так ли. Как же всё-таки на Ц записать выражение:
строка2 = строка1 + строка0;
palva
 Аватар для palva
2372 / 1594 / 190
Регистрация: 08.06.2007
Сообщений: 6,362
Записей в блоге: 4
14.03.2011, 11:19     Может ли в Ц переменная иметь переменные значения? Строки... #4
На то, что программа на C++ указывает объявление переменной в середине программы. На C положено сначала объявить все переменные, а потом с ними работать.

Если объявлять переменную дважды, то компилятор понимает, что вам нужны две переменные. Это допустимо, если одна переменная объявляется на внешнем уровне, а вторая внутри функции. В этом случае вторая переменная внутри функции будет 'заслонять' первую.

Переменной можно присвоить новое значение оператором присваивания, если же вы присваиваете значение при описании переменной, то справа от знака '=' допускается использовать только константное выражение.

> Во время выполнения вызываемая функция должна беспокоиться о границах массива и контролировать возможность затереть чужую память.

На самом деле нам никто ничего не должен. Функция strcat этого не делает. У нее нет информации о размере параметра. Она даже не знает, что этот параметр массив.

> Поскольку Ц - язык высокого уровня...

Пожалуй что язык С - это язык низкого уровня. Он придуман как некоторая замена ассемблера и использовался при написании операционной системы. Язык C++ универсальный. Там есть средства высокого уровня, а есть низкого. Вы пользуетесь средствами низкого уровня.

Фукцию sprintf вы используете неправильно. Первым параметром должен стоять указатель на символьный буфер, куда будет записываться результат работы. Длина этого буфера должна быть достаточна для результата (функция эту длину не знает и знать не хочет). То есть вы должны объявить его так: char Query[200]; Возвращает эта функция длину сформированного буфера (без учета завершающего нуля).
Yandex
Объявления
14.03.2011, 11:19     Может ли в Ц переменная иметь переменные значения? Строки...
Ответ Создать тему
Опции темы

Текущее время: 17:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru