|
Внимание! Теперь для входа на форум необходимо вводить единый пароль регистрации сервисов sibnet.ru!
Здравствуйте, гость ( Вход | Регистрация )
 Сейчас обсуждают
 
| |
|
  |
Язык Си/С++, вопросы и ответы |
|
|
КостяМХ |
22.10.2008, 18:57
|

Молчун
Группа: Sibnet-club
Сообщений: 62
Регистрация: 22.9.2008
Пользователь №: 50 743
Репутация: 3

|
Цитата(горынычь @ 22.10.2008, 18:41)  помогите еще перевести в 16 8 и 2 кодировку число 16011992
111101000101001011011000 = 2 сс 75051330 = 8 сс F452D8 = 16 сс
|
|
|
|
ktak |
22.10.2008, 20:05
|

Технический специалист
Группа: VIP
Сообщений: 1 354
Регистрация: 18.12.2006
Из: Новосибирск
Пользователь №: 18
Репутация: 124

|
Цитата(горынычь @ 22.10.2008, 18:41)  помогите еще перевести в 16 8 и 2 кодировку число 16011992
?А слабо написать коротенькую программку: Код #include <stdio.h>
int main(void) { int number = 16011992; printf("OCTAL = %o\nHEX = %X\n", number, number); return 0; }
В двоичный вид легко глазами перевести из OCTAL или HEX. Или, если на Linux, в командной строке: printf "OCT = %o\nHEX = %X\n" 16011992 16011992
|
|
|
|
AxoN |
23.10.2008, 19:41
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 1 225
Регистрация: 25.10.2007
Пользователь №: 8 658

|
Тогда уж дописать чтобы и в двоичную переводила  Код #include <stdio.h>
int main(void) { int i, number = 16011992; printf("OCTAL = %o\nHEX = %X\n", number, number); for(i=8;i>=0;i--) { printf("%d",(number>>i)&0x01); } return 0; }
Сообщение отредактировал AxoN - 23.10.2008, 19:41
|
|
|
|
AxoN |
24.10.2008, 15:57
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 1 225
Регистрация: 25.10.2007
Пользователь №: 8 658

|
Теперь у меня вопрос к вам. Нужно в динамический массив считать текстовый файл. Ничего сложного, но мне нужно что бы считывание производилось в отдельной функции. Пробовал сделать, все вроде правильно, но когда пытаюсь к примеру распечатать какую нибудь строку из этого массива в main() выдает "Ошибка сегментирования". Кто нить помогите с примером  ЗЫ Под линукс. Сообщение отредактировал AxoN - 24.10.2008, 15:58
|
|
|
|
mephisto |
25.10.2008, 8:54
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(AxoN @ 24.10.2008, 14:57)  Теперь у меня вопрос к вам. Нужно в динамический массив считать текстовый файл. Ничего сложного, но мне нужно что бы считывание производилось в отдельной функции. Пробовал сделать, все вроде правильно, но когда пытаюсь к примеру распечатать какую нибудь строку из этого массива в main() выдает "Ошибка сегментирования". Кто нить помогите с примером  ЗЫ Под линукс. Покажи что ты делаешь и что у тебя не получается.
|
|
|
|
AxoN |
25.10.2008, 19:51
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 1 225
Регистрация: 25.10.2007
Пользователь №: 8 658

|
Цитата(mephisto @ 25.10.2008, 8:54)  Покажи что ты делаешь и что у тебя не получается.
Код char **fileSB;
int input_from_file() { FILE *stream; char line[100]; int i=0;
stream = fopen("programmaSB.txt","r"); if(stream == NULL) {printf("Not found file!\n"); return -1;} while (1) { if(feof(stream)) break; fgets(line, sizeof(line)-1, stream); i++; } rewind(stream); lenfile = i; fileSB = (char **)malloc(lenfile*sizeof(char **)); for(i=0;i<lenfile;i++) { fgets(line,sizeof(line)-1,stream); fileSB[i] = (char *)malloc(sizeof(line)); strcpy(fileSB[i],line); } fclose(stream); return 0; }
int main() { input_from_file(); return 0; }
В общем сделал fileSB глобальной. Как я понял чтобы при локальной переменной fileSB все работало нужно выделять память под нее в main(). А для этого нужно знать кол-во строк в файле, т.е. либо немного захломлять main() либо делать отдельную ф-ию для подсчета строк. Или я что то упустил из виду? 
|
|
|
|
mephisto |
25.10.2008, 19:56
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(AxoN @ 25.10.2008, 18:51)  В общем сделал fileSB глобальной. Как я понял чтобы при локальной переменной fileSB все работало нужно выделять память под нее в main(). А для этого нужно знать кол-во строк в файле, т.е. либо немного захломлять main() либо делать отдельную ф-ию для подсчета строк. Или я что то упустил из виду?  А зачем тебе каждую строку в отдельный массив пихать? Я бы нашел размер файла и считал бы его в один массив, предварительно выделив память под него с помощью malloc
|
|
|
|
AxoN |
25.10.2008, 20:01
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 1 225
Регистрация: 25.10.2007
Пользователь №: 8 658

|
Цитата(mephisto @ 25.10.2008, 19:56)  А зачем тебе каждую строку в отдельный массив пихать? Я бы нашел размер файла и считал бы его в один массив, предварительно выделив память под него с помощью malloc
А это позволит работать с каждой строкой? Мне кажется если каждая строка будет в отдельном массиве проще будет... Сообщение отредактировал AxoN - 25.10.2008, 20:01
|
|
|
|
mephisto |
25.10.2008, 20:54
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(AxoN @ 25.10.2008, 19:01)  А это позволит работать с каждой строкой? Мне кажется если каждая строка будет в отдельном массиве проще будет...
Что значит работать с каждой строкой?
|
|
|
|
AxoN |
25.10.2008, 22:09
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 1 225
Регистрация: 25.10.2007
Пользователь №: 8 658

|
Цитата(mephisto @ 25.10.2008, 20:54)  Что значит работать с каждой строкой?
Ну к примеру мне нужно каждую строку разбить на слова и в зависимости от положения в этой строке одни и те же слова будут иметь разный смысл: Код 10 input x 20 y = 10
В первом случае 10 просто номер стоки, а во втором значение переменной.
|
|
|
|
mephisto |
26.10.2008, 11:05
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(AxoN @ 25.10.2008, 21:09)  Ну к примеру мне нужно каждую строку разбить на слова и в зависимости от положения в этой строке одни и те же слова будут иметь разный смысл: Код 10 input x 20 y = 10
В первом случае 10 просто номер стоки, а во втором значение переменной. Писал я как-то интерпретатор бэйсика, но было это давно и не правда  Замечания по твоему коду - Не важно где определять переменную fileSB, но лучше не делать её глобальной.
- Считать строки заранее не надо, выдели память, скажем на 256 строк, при необходимости увеличь массив с помощью realloc
Цитата realloc() изменяет размер блока динамической памяти, на который указывает ptr. Новый размер блока будет равен size байт. Его содержимое останется неизменным в промежутке вплоть до прежнего или нового размера, смотря что меньше; добавленная память не инициализируется. Если ptr равен NULL, то результат вызова эквивалентен malloc(size); если size равен нулю, то результат вызова эквивалентен free(ptr). Кроме случая, когда ptr равен NULL, он должен указывать на память, выделенную ранее посредством malloc(), calloc() или realloc().
- Я бы не был уверен, что в строке будет всегда меньше 100 символов, мой опыт подсказывает, что лучше использовать функцию getline
» Спойлер (нажмите, чтобы прочесть) « Выдержка из info libc Цитата 12.9 Line-Oriented Input ========================
Since many programs interpret input on the basis of lines, it is convenient to have functions to read a line of text from a stream.
Standard C has functions to do this, but they aren't very safe: null characters and even (for `gets') long lines can confuse them. So the GNU library provides the nonstandard `getline' function that makes it easy to read lines reliably.
Another GNU extension, `getdelim', generalizes `getline'. It reads a delimited record, defined as everything through the next occurrence of a specified delimiter character.
All these functions are declared in `stdio.h'.
-- Function: ssize_t getline (char **LINEPTR, size_t *N, FILE *STREAM) This function reads an entire line from STREAM, storing the text (including the newline and a terminating null character) in a buffer and storing the buffer address in `*LINEPTR'.
Before calling `getline', you should place in `*LINEPTR' the address of a buffer `*N' bytes long, allocated with `malloc'. If this buffer is long enough to hold the line, `getline' stores the line in this buffer. Otherwise, `getline' makes the buffer bigger using `realloc', storing the new buffer address back in `*LINEPTR' and the increased size back in `*N'. *Note Unconstrained Allocation::.
А вообще мне если честно не понятно, зачем тебе копировать файл в память, ИМХО надо начинать синтаксический разбор сразу. Да и зачем руками это делать? Если уж ты пишешь под GNU/Linux, то лучше посмотри в сторону bison - отличное средство для написания парсеров. И наконец, а оно тебе надо, нет я понимаю, написать интерпретатор это конечно интересно, но если тебе нужен встраиваемый язык, можно взять готовый, например Tcl.
|
|
|
|
dima75 |
26.10.2008, 17:34
|

радость в жизни - это когда есть кто-то рядом.
Группа: Sibnet-club
Сообщений: 958
Регистрация: 11.10.2007
Из: Новосибирск
Пользователь №: 7 686
Репутация: 66

|
Цитата(КостяМХ @ 16.10.2008, 12:30)  Тут слишком много текста, преподователь сказал там не более 3 строк, просто подключение чегото, и описание и всё...
для виндовс, поддержка русских символов в консоли. (VC6.0) Код #include <iostream.h> #include <windows.h> char buf[256]; char*Rus(char*b); //ANSI { CharToOem(b,buf); return buf; } void main() { cout <<Rus("Привет"); } Сообщение отредактировал dima75 - 26.10.2008, 19:19
|
|
|
|
AxoN |
27.10.2008, 13:01
|

МЕГА флудер
Группа: Sibnet-club
Сообщений: 1 225
Регистрация: 25.10.2007
Пользователь №: 8 658

|
mephistoу меня вопрос по getline. Почему если не использовать #define _GNU_SOURCE выдает предупреждение Код getline.c: In function ‘main’: getline.c:14: warning: implicit declaration of function ‘getline’ Вот что нашел Код - Macro: _GNU_SOURCE If you define this macro, everything is included: ANSI C, POSIX.1, POSIX.2, BSD, SVID, X/Open, and GNU extensions. In the cases where POSIX.1 conflicts with BSD, the POSIX definitions take precedence.
If you want to get the full effect of `_GNU_SOURCE' but make the BSD definitions take precedence over the POSIX definitions, use this sequence of definitions:
#define _GNU_SOURCE #define _BSD_SOURCE #define _SVID_SOURCE
Note that if you do this, you must link your program with the BSD compatibility library by passing the `-lbsd-compat' option to the compiler or linker. *Note:* If you forget to do this, you may get very strange errors at run time.
Это связано с какими то стандартами?
|
|
|
|
mephisto |
27.10.2008, 22:57
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(AxoN @ 27.10.2008, 12:01)  mephisto у меня вопрос по getline. Почему если не использовать #define _GNU_SOURCE выдает предупреждение
getline отсутствует в стандарте C и доступна только под GNU системами ( glibc). Чтобы использовать getline, под window, придётся либо использовать libgw32c, либо реализовать её самому 
|
|
|
|
mephisto |
21.12.2008, 23:12
|

ортодоксальный линуксоид
Группа: VIP
Сообщений: 7 724
Регистрация: 17.11.2007
Из: столицы вашей родины
Пользователь №: 10 849

|
Цитата(AxoN @ 21.12.2008, 22:09)  Кстати кто нить подскажите чем можно заменить strtok? А то мне эта функция не нравится
Задачу озвуч
|
|
|
|
|
  |
1 чел. просматривают этот форум (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|