MySQL
|
|
1 | |
Может ли в Ц переменная иметь переменные значения? Строки...13.03.2011, 21:10. Показов 1118. Ответов 3
Метки нет Все метки)
(Код
Есть простой и понятный кусочек на 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 убедить, что переменная может иметь переменные значения? |
|
13.03.2011, 21:10 | |
Ответы с готовыми решениями:
3
Почему переменная CLASSPATH не может иметь значения "."? Какое наименьшее значение может иметь переменная после выполнения данной программы? Определить, какое наибольшее значение может иметь переменная s после выполнения программы? Определить, какие значения будут иметь переменные |
13.03.2011, 22:12 | 2 |
Ваш текст написан на C++, а не на C.
Одна ошибка - это вы два раза объявляете переменную с одним и тем же именем Variable. Вторая ошибка - это вы выходите за границу массива при обращении к функции strcat. Компилятор на это ничего вам не сказал, но при выполнении вы скорее всего получите 'непредсказуемое поведение программы', поскольку затрете чужую память.
0
|
MySQL
|
|
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; |
14.03.2011, 11:19 | 4 |
На то, что программа на C++ указывает объявление переменной в середине программы. На C положено сначала объявить все переменные, а потом с ними работать.
Если объявлять переменную дважды, то компилятор понимает, что вам нужны две переменные. Это допустимо, если одна переменная объявляется на внешнем уровне, а вторая внутри функции. В этом случае вторая переменная внутри функции будет 'заслонять' первую. Переменной можно присвоить новое значение оператором присваивания, если же вы присваиваете значение при описании переменной, то справа от знака '=' допускается использовать только константное выражение. > Во время выполнения вызываемая функция должна беспокоиться о границах массива и контролировать возможность затереть чужую память. На самом деле нам никто ничего не должен. Функция strcat этого не делает. У нее нет информации о размере параметра. Она даже не знает, что этот параметр массив. > Поскольку Ц - язык высокого уровня... Пожалуй что язык С - это язык низкого уровня. Он придуман как некоторая замена ассемблера и использовался при написании операционной системы. Язык C++ универсальный. Там есть средства высокого уровня, а есть низкого. Вы пользуетесь средствами низкого уровня. Фукцию sprintf вы используете неправильно. Первым параметром должен стоять указатель на символьный буфер, куда будет записываться результат работы. Длина этого буфера должна быть достаточна для результата (функция эту длину не знает и знать не хочет). То есть вы должны объявить его так: char Query[200]; Возвращает эта функция длину сформированного буфера (без учета завершающего нуля).
0
|
14.03.2011, 11:19 | |
14.03.2011, 11:19 | |
Помогаю со студенческими работами здесь
4
Определить, какие значения будут иметь переменные после выполнения операторов Какие значения может иметь спин (в единицах h) Глобальная или статическая переменная не может иметь тип управляемый "System::String ^" Внутриблочные переменные не могут иметь те же имена, что и переменные из блока верхнего уровня Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |