SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 29.07.2010 01:16:42

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Тема по следам fox-са...)

Доброй ночи Господа разработчики - программисты!
Тысяча извинений за мое дерзкое вторжение с такой темой форума, я попытаюсь объяснить! Всё началось Perl и php и естественно пришлось иметь дело с MySQL, научившись работать с php и относительно адекватно perl, мне показалось этого мало и захотелось изучить С/C++ в связки с MySQL, и мне приходилось искать форумы но как правело на большинстве форумов мне глупости отвечали, а вот на этом форуме мне всегда очень глубоко чётко и даже больше чем мне было достаточно! Огромное спасибо paulus и deadka Вы мне очень помогли! При последнем нашем общение вы мне рекомендовали изучить вначале C как следует а потом взяться за C++, я так и поступил, но вот по мери изучения возникают сложности и не понятки я стараюсь своими силами найти ответы, но временами чувствую, что снова нужна Ваша консультация!
Есть у меня пару вопросов:
Я дошёл до указателя на функцию, мне не понятно где можно найти практическое применение для указателей на функцию.
Потом я познакомился с функциями malloc() и free(), тоже не понятно в каких случаях может оно пригодится и как правильно применить выделение памяти и освобождение…
И ещё, был я в отпуске, и стало мне там скучно откопал я новт и поставил на него любимую ось FreeBSD и обул в кеды, порылся в портах и нашёл такую вещь как QT4, поколупавшись в IDE (Qdevelop), кароче мне понравелось больше чем с виндов VS2008, хочу проконсультироваться подскажите снова с литературой, для QT если вы сталкивались что мне почитать лучше о QT, что бы эффективно потратить время на прочтение, какой автор компетентней в qt и есть ли книги, разумеется если вы сталкивались…
Огромное спасибо за внимание, надеюсь мой пост не забанят…

Неактивен

 

#2 29.07.2010 12:56:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

deadka, вроде, согласился поддерживать раздел С/С++ на webew.ru, так что ждем smile

Указатели на функцию нужны тогда, когда Вы хотите передать название функции
в библиотеку. Например, man signal.

Когда может пригодиться выделение памяти... ну, например, когда нужно выделить
память wink Ну правда, вопрос странный. Если Вам нужно держать в памяти что-то
сложнее, чем число (например, массив из чисел, причем длина массива переменная) —
Вам нужно выделять под него память явно. Ну и освобождать, соответственно, тоже.

По поводу FreeBSD и QT — на этом форуме точно не надо обсуждать (тем более, что
ничего лучше Linux и GTK+ никто не придумал wink ).

Неактивен

 

#3 29.07.2010 13:42:00

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Добрый день!
С указателем на функцию я всё равно не въехал…
А malloc понял, когда допустим я передаю в функцию массив к примеру char и каждый раз он разной длины, что бы хватило памяти я её резервирую, так получается, то есть это гарантия того что я не останусь без памяти, запас избытка…
Насчёт FreeBSD я не согласен, я 6 лет  с ней работаю и пока нечего лучше не видал, точней я много осей повидал но настолько удобной и надёжной оси я не видел... Linux хорошее подспорье но местами он уступает, но это субъективно, по этому для кого то и 
Mac OS бест, и пусть так и будет! А какой из Linux-ов Вы предпочитаете?
А чем GTK+ лучше QT, почему я спрашиваю, просто я нахожусь в том времени когда надо себе выбирать направление, пока я изучаю C, но и параллельно задумываюсь о GUI, всё равно от него не куда не деться. В вики я прочёл о GTK+, во FreeBSD под ним реально работать? И какое IDE для него лучше?
Спасибо за внимание!

Неактивен

 

#4 29.07.2010 16:02:00

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Тема по следам fox-са...)

paulus написал:

deadka, вроде, согласился поддерживать раздел С/С++ на webew.ru, так что ждем smile

Да, все в силе, только статьи обещанные sakil'е создам ). Запарок много очень сейчас, несмотря на лето sad. Но - сделаю.

paulus написал:

Указатели на функцию нужны тогда, когда Вы хотите передать название функции
в библиотеку. Например, man signal.

или man pthread_create. Та же самая CreateWindow из WINAPI требует указатель на функции обработчик сообщений (см MSDN).

Информации в гугле море, мне понравилось
http://netlib.narod.ru/library/book0003/ch05_11.htm
,а вообще

http://www.google.ru/search?hl=ru&n … p;gs_rfai=

в помощь.

Вообще указатели на функции можно использовать тогда, когда Вы пишете библиотеку, в которой хотите (или должны) предоставить пользователю реализовывать некоторые вещи самостоятельно. Примеры выше:
signal - Обработчик сигнала
pthreade_create - тело функции, которая будет выполняться в дополнительном потоке
CreateWindow - обработчик функции.

paulus написал:

По поводу FreeBSD и QT — на этом форуме точно не надо обсуждать (тем более, что
ничего лучше Linux и GTK+ никто не придумал wink ).

Ага, ваш автомобиль может быть любого цвета, при условии что этот цвет - черный (с) Генри Форд


Касательно выделения памяти приведу учебный пример: вы пишете программу, которая сортирует массив. Массив вводится с клавиатуры, равно как и число элементов в массиве => заранее неизвестно, сколько памяти потребуется для хранения элементов.

Поэтому выделить память статически например так int aMyArray[100]; вы не можете.

поэтому воспользуетесь malloc, и в эту функцию (man malloc) уже передадите нужное количество элементов.
посмотрите также http://www.sernam.ru/c_42.php

Касательно GTK+,QT и иже с ними лучше, например, на linux.org.ru.

fox написал:

А malloc понял, когда допустим я передаю в функцию массив к примеру char и каждый раз он разной длины, что бы хватило памяти я её резервирую, так получается, то есть это гарантия того что я не останусь без памяти, запас избытка…

Не очень, к сожалению, понятно Вы написали - попробуйте поточнее, желательно с примером кода, который Вы хотите создать.

Отредактированно deadka (29.07.2010 16:08:12)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 31.07.2010 05:18:00

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Доброй ночи Господа!
Спасибо огромное, что откликнулись вот я начал разбиратся потихоньку!
Вот пример:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define LEN 128

int main()
{
   
    printf("Welcome, to...\n");
    char *mStr;
   
    mStr=(char *)malloc(LEN*sizeof(char));
   
    if(mStr == NULL)
    {
        printf("Извините вышла ошибка с памятью!!!\n");       
        exit(0);
    }
   
    printf("Пожалуйста ввидите строку: ");
    gets(mStr);
    int lStr;
    lStr=strlen(mStr);
    printf("В строке: %s \nБыло определено %i сиволов!\n",mStr,lStr);
    free(mStr);
   
return 0;   
}


Вроди-бы я полнял принцип malloc и free, только вот мелкий казу собранная программа ругается на gets типа говорит опасная функция, понятное дело может переполниться! Можно как то попросить компилятор не сообщать об этом когда программу запускаю, а то эту строку он прямо в программу интегрировал... и есть ли достойная замена gets, что бы можно было строки с робелами в массив записывать с клавиатуры?
И главное я не понял чем QT4 хуже GTK+?
Спасибо за внимание!

Отредактированно fox (31.07.2010 05:19:07)

Неактивен

 

#6 31.07.2010 09:50:01

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Тема по следам fox-са...)

вместо gets используйте функцию fgets (man fgets и внимательно прочтите http://ru.wikipedia.org/wiki/Gets )

Касательно сообщений компилятора - сообщения бывают разные, в смысле бывают ошибки, а бывают предупреждения. В данном случае было выдано как раз предупреждение, компилятор честно предупреждает, что опасно использовать эту функцию, но программу все равно собирает. Попросить компилятор, чтобы он не выдавал предупреждений, конечно, можно, но не стоит, он же для Вас же старается :-D. Напротив, возьмите за правило компилировать с опциями -Wall -Wextra и -Werror.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 31.07.2010 10:04:08

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

QT хуже, чем GTK+ smile Обсуждать тут это мы не будем, все подробности
знают люди на linux.org.ru (и вообще все флеймообразующие темы там
тоже любят пообсуждать).

Неактивен

 

#8 15.08.2010 20:51:58

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Добрый вечер, Господа!
И снова я :-)
Вы мне дали чёткий вектор направления в исследованиях, и я занят и не беспокою вас…
Но вот начал снова писать на C, и возникли сложности в которых без вас не разобраться!
Вы случайно не знаете как средствами языка C, извлечь PID из системы какой-нибудь программы? Ну вот к примеру если мне надо знать PID MySQL, то в консоли я делаю:
ps -wuax |grep mysql
И получаю в ответ:
mysql       1477  0,0  0,1  3624  1176  v0- I    16:38     0:00,01 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --user=mysq
mysql       1624  0,0  3,2 476416 67080  v0- I    16:38     0:03,03 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local
root       14313  0,0  0,0   624   324   4  DL+  19:47     0:00,00 grep mysql
Как мне в С, загнать в переменную PID какой-либо программы?
Для того что бы моя программа могла управлять другими программами?
Вы скажите пойти в директорию /var/run, этот вариант сразу отпадает поскольку если программа упала то PID файл будет не точным!
Спасибо за внимание, очень надеюсь что вы мне снова поможите! :-)

Неактивен

 

#9 15.08.2010 21:40:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

ээ... ну, вызовите ps? smile

В разных системах это делается по разному, ps это должен знать и уметь.
Например, в Linux можно поискать в /proc. Но в общем случае — это не
переносимый способ.

Впрочем, под виндоус и ps нету wink

Неактивен

 

#10 15.08.2010 21:43:54

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Ну ps я привёл к примеру, что-бы Вы могли понять что мне надо, мне просто под Сями надо получать PID запущеных программ, средствами языка С, есть какая то функция которая может помочь, ось FreeBSD)))
Спасибо за внимание!

Неактивен

 

#11 15.08.2010 22:43:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

Да, Вам поможет system("ps …"); wink

Неактивен

 

#12 15.08.2010 22:45:19

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

А разве system() возвращает что то?

Неактивен

 

#13 15.08.2010 23:09:27

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Вот ещё одна чудо задача, не могу понять в чом дело вроде всё правильно:
int main(void)
{
char **str;
int a=0;
int b=0;

str = (char **)malloc(128 * sizeof(char));

while(a<5)
{
printf("Enter String: ");
scanf("%s",(char *)(str+a));
a++;
}
while(b<5)
{
printf("%s \n",(char *)(str+b));
b++;
}

return 0;
}

Компилится и выводит:
Enter String: fortero
Enter String: qwerty
Enter String: fer
Enter String: fox
Enter String: qwe
fortqwerfer
qwerfer
fer
fox
qwe

Зачем он смешивает символы в строке?
fortqwerfer

Тяжко мне(

Неактивен

 

#14 15.08.2010 23:25:36

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

system возвращает код ответа wink
Подробнее можно поспрашивать у deadka на webew.ru.

Аналогично про вторую задачку. Вы выделяете char**, а потом
работаете с ним как с char*. Ну, со смещениями по 4 байта. Опять
же, имеет смысл обсуждать это на webew.ru.

Неактивен

 

#15 16.08.2010 00:53:16

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Хорошо понял, а что там открыли уже подраздиление С?
Вот к стате жутко но работает))
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{

char pid[32];
char name[32];

system("ps -x |grep trafd > /tmp/tmp.pids");
FILE *fp;
fp = fopen("/tmp/tmp.pids","r");
while(!feof(fp))
{
fscanf(fp,"%s %*s %*s %*s %s",pid,name);

if(strcmp(name,"trafd")==0)
{
printf("Pid: %s Daemon:  %s\n",pid,name);
}
}

return 0;
}

Неактивен

 

#16 16.08.2010 05:21:28

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

Уху. Одно не понятно — зачем Вам это нужно smile

Неактивен

 

#17 16.08.2010 07:11:16

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Да так одну програмку пишу заодно учусь писать, пока-что просто быдло-кодерство, но с чего-то надо начинать )
Я вот на webew.ru написал но мне что то не сильно помогли, не поможите ещё раз, с много мерным чаровским массивом?)
Хочу объявить глабальный двухмерный массив, а затем в функции он будет изменятса, то увеличиватся то уменьшатся, я так понял нужно указывать указатель, на массив указателей? Как это правильно сделать, что бы и malloc регулировал его...
Спасибо за внимание!

Отредактированно fox (16.08.2010 07:12:51)

Неактивен

 

#18 16.08.2010 10:33:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

Терпение и труд всё перетрут. Вам не хватает терпения. На счет труда —
не знаю. Указатель на массив указателей, да. Подумайте, сколько раз
надо вызвать malloc, чтобы сделать такую структуру на 5 элементов.
А потом посмотрите, сколько раз его вызываете Вы.

Неактивен

 

#19 16.08.2010 13:54:25

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Тема по следам fox-са...)

fox написал:

Да так одну програмку пишу заодно учусь писать, пока-что просто быдло-кодерство, но с чего-то надо начинать )

Безусловно, но при формулировке "да так" вряд ли возможно будет что-то дельное подсказать. Программисты больше по техническим заданиям специализируются.

fox написал:

Я вот на webew.ru написал но мне что то не сильно помогли, не поможите ещё раз, с много мерным чаровским массивом?)

Моментального ответа никто не даст - никто здесь не сидит постоянно, да и часовые пояса отличаются. И не имейте такой привычки - ожидать, что на каждый Ваш вопрос будет приведён готовый код.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#20 16.08.2010 14:17:12

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Хорошо, понял не надо злиться)))
К стате paulus подсказал мне, что делать надо, я со структурами замутил и получилось то что я хотел, спасибо! )))
struct name_struct *mass;
mass = malloc(max * sizeof(struct name_struct));

Где max число структур, то есть получается индекс массива структур верно я сделал?
Поправте если я не так понимаю, но вроде бы работает как надо...
Спасибо за внимание!)))

Неактивен

 

#21 16.08.2010 14:28:46

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Тема по следам fox-са...)

Истинные Бодхисаттвы не злятся :-)), просто подчеркнул пару моментов.

fox написал:

struct name_struct *mass;
mass = malloc(max * sizeof(struct name_struct));

Где max число структур, то есть получается индекс массива структур верно я сделал?
Поправте если я не так понимаю, но вроде бы работает как надо...

Написанные строки кода выглядят корректно (только не забудьте сделать free под конец), однако не совсем понятно, чего Вы хотели добиться. Но с этим в любом случае надо на webew.ru - ибо к MySQL это не имеет отношения.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#22 16.08.2010 14:32:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Тема по следам fox-са...)

Не-а. На массив из 5 элементов malloc нужно вызывать 6 раз.

Неактивен

 

#23 16.08.2010 14:46:31

fox
Завсегдатай
Зарегистрирован: 10.02.2010
Сообщений: 64

Re: Тема по следам fox-са...)

Хорошо понял, Спасибо теперь с такими вопросами только на webew.ru, значить (max +1) надо изменить?

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson