|
|
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Нужно переписать фрагмент программы на PHP : $variable='value'; $string='Variable='.$variable.' \n'; в C : #include </usr/include/stdarg.h> #include </usr/include/stdio.h> #include </usr/include/stdlib.h> #include </usr/include/string.h> char Variable[5], String[100]; int main (int argc, char **argv) { char Variable[]="value"; char String[]="variable="; // + (char*) Variable[];? //+Variable? exit(EXIT_SUCCESS); } Не удаётся убедить GCC, что переменная есть одна переменная плюс другая переменная. Отсюда вопрос, как написать, чтоб компилятор понял, что от него хотят. А если вдруг переменной попытаются присвоить новое значение, откомпилировать становится невозможно - компилятор пишет: SuperProgram.c: In function `main': SuperProgram.c:line i+j: redeclaration of `String' SuperProgram.c:line i: `String' previously declared here Как компилятору объяснить, что переменная не является константой, но является переменной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 15:30 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
В C нельзя складывать массивы. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 15:41 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Ах да, не забудьте заменить Код: plaintext 1. Код: plaintext 1. ибо строка "value" занимает 6 байт, учитывая завершаюший \0 "Прежде чем убить человека, узнай, нет ли у него влиятельных родственников" (с) Библия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 15:43 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Совсем я глуп. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. "Прежде чем убить человека, узнай, нет ли у него влиятельных родственников" (с) Библия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 15:44 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Да, красивый код на Ц невозможен, во всяком случае в операциях со строками. Спасибо за совет, жаль доков у меня нет, буду пробовать. А как быть с руганью компилятора, что второй раз присвоить переменной новое значение невозможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 16:21 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
На C пишут быстрый код, а не красивый. Ошибка была - повторное объявление переменной, в моем последнем посте я ее исправил. еще раз - нельзя присвоить массиву массив операцией =. Нельзя прибавить к массиву массив +, можно сделать это только поэлементно. "Прежде чем убить человека, узнай, нет ли у него влиятельных родственников" (с) Библия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 16:26 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
К сожалению, нет. Достаточно раскомментировать предпоследнюю строчку: #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); } и компилятор ругнется. Переменная==Переменная , не так ли? т.е. переменной можно (и при необходимости нужно) присваивать переменные значения. strcat.c: In function `main': strcat.c:6: redeclaration of `Variable' strcat.c:4: `Variable' previously declared here Если Ц быстр, каким прилагательным, характеризующим скорость, назвать Ассемблер, может быть абсолютно быстрым? Пример копирования строк: lea esi, offset Source1 lea edi, offset Target mov ecx, offset [counter1] rep movsb lea esi, offset Source2 mov ecx, offset [counter2] rep movsb Реальная задача сложнее, нужно достаточно много формировать строку, состоящую из нескольких констант и переменных. Код, если и получится, то громоздким. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 16:59 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Ну почитайте же доку, это НЕ php! Если надо формировать строку из кучи других, рекомендую sprintf(), функция, аналогичная printf но с выводом в строку. Теперь еще раз. Variable[] это не переменная. Такая форма применяется _только_ при определении переменной, и указывает на то, что длина массива будет определятся константой, что Вы и делаете( char variable[]="тру-ляля";) В дальнейшем вы имеете _константный_ указатель на первый байт вашей строки. Это значит, что variable _всегда_ указывает на первый байт, Вы не можете поменять значение указателя, Вы можете поменять значение по этому адресу. Более того, компилятор сразу же "забыл" длину вашего массива и позволит вам совершенно спокойно записать например 100 байт(variable[100]=3;), что, я уверен, в вашем случае приведет к segmentation fault. В вашем же примере на ассемблере можно сделать и быстрее, убрав строчки с mov cx, и применив repnz, копировать пока не 0, т.к. конец строки в С - \0 байт. Итак, почитайте хоть краткий курс по С. Опыт программирования на php может оказаться плачевным. Говорю как программист С/C++ и php. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2005, 21:54 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Спасибо за совет, буду разбираться. sprintf() - вероятнее самая подходящая функция. В том-то и дело, что читать собственно нечего. Нет описания языка и библиотек. Приходится додумывать и пробовать. Дока на гцц.гну.орг - полный юзелесс. Для кого и зачем gcc-html.tar.gz - полная загадка. Что либо внятного через поисковики пока не нашёл. Присоветуйте полезную урлу. Приведенный пример на Асме расчитан на бинарные данные, без каких бы то ни было ескейп-символов, характерных для какого-то частного случая. Потому и счётчики. Цель этого примера - всего лишь показать, что механизм библиотек для примитивных функций не может быть эффективным. Страшно представить себе результат компиляции с языка высокого уровня (просматриваемый дебугом), что реально выполняется, когда происходит конкатенация пары строк. Лазить за каким-то /usr/local/lib/*.so или чуть-чуть нормальных команд. Разница во времени выполнения (скорость) может составлять от 10^3 раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2005, 00:13 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Вот более приближенный к жизни вариант, который проглатывает GCC: #include </usr/include/stdio.h> char *Table, *User, Query; int main (int argc, char **argv) { Table="users"; User="Vasya"; printf("Table=%s\nUser=%s\n",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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2005, 00:48 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Это совсем не правильно. Код: plaintext 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. int sprintf(char * __restrict, const char * __restrict, ...); Значит, что первый параметр sprintf хочет получить указатель на строку, куда вернет результат, вторым хочет получить константную строку формата, "..." означает любые параметры потом. int - это не строка, а результат выполнения функции, длина получившейся строки. Доки: Учебники по программированию, а так же по C и C++ "Прежде чем убить человека, узнай, нет ли у него влиятельных родственников" (с) Библия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2005, 13:40 |
|
||
|
Нужно переписать фрагмент программы на PHP в C
|
|||
|---|---|---|---|
|
#18+
Премного благодарен, буду почитать. Вопрос простой, но актуальный. Как в Ц называется функция, преобразующая строку в число. Что-то типа: uint Conversation_ASCII2UINT(*char); char Query[100]; unsigned long i; MYSQL_ROW Row; int main (int argc, char **argv) { goto test; Row = mysql_fetch_row(Resource); sprintf ( Query,"%d", Row[0]); test: i=666; printf("i=%d\n",i); sprintf (Query,"%d", i); printf("Query=%s\n",Query); i=Conversation_ASCII2UINT(Query); printf("i=%d\n",i); exit(0); } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2005, 17:36 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=32853182&tid=2033896]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
21ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 344ms |

| 0 / 0 |
