Задавайте вопросы, мы ответим
Вы не зашли.
Доброй ночи Господа разработчики - программисты!
Тысяча извинений за мое дерзкое вторжение с такой темой форума, я попытаюсь объяснить! Всё началось Perl и php и естественно пришлось иметь дело с MySQL, научившись работать с php и относительно адекватно perl, мне показалось этого мало и захотелось изучить С/C++ в связки с MySQL, и мне приходилось искать форумы но как правело на большинстве форумов мне глупости отвечали, а вот на этом форуме мне всегда очень глубоко чётко и даже больше чем мне было достаточно! Огромное спасибо paulus и deadka Вы мне очень помогли! При последнем нашем общение вы мне рекомендовали изучить вначале C как следует а потом взяться за C++, я так и поступил, но вот по мери изучения возникают сложности и не понятки я стараюсь своими силами найти ответы, но временами чувствую, что снова нужна Ваша консультация!
Есть у меня пару вопросов:
Я дошёл до указателя на функцию, мне не понятно где можно найти практическое применение для указателей на функцию.
Потом я познакомился с функциями malloc() и free(), тоже не понятно в каких случаях может оно пригодится и как правильно применить выделение памяти и освобождение…
И ещё, был я в отпуске, и стало мне там скучно откопал я новт и поставил на него любимую ось FreeBSD и обул в кеды, порылся в портах и нашёл такую вещь как QT4, поколупавшись в IDE (Qdevelop), кароче мне понравелось больше чем с виндов VS2008, хочу проконсультироваться подскажите снова с литературой, для QT если вы сталкивались что мне почитать лучше о QT, что бы эффективно потратить время на прочтение, какой автор компетентней в qt и есть ли книги, разумеется если вы сталкивались…
Огромное спасибо за внимание, надеюсь мой пост не забанят…
Неактивен
deadka, вроде, согласился поддерживать раздел С/С++ на webew.ru, так что ждем
Указатели на функцию нужны тогда, когда Вы хотите передать название функции
в библиотеку. Например, man signal.
Когда может пригодиться выделение памяти... ну, например, когда нужно выделить
память Ну правда, вопрос странный. Если Вам нужно держать в памяти что-то
сложнее, чем число (например, массив из чисел, причем длина массива переменная) —
Вам нужно выделять под него память явно. Ну и освобождать, соответственно, тоже.
По поводу FreeBSD и QT — на этом форуме точно не надо обсуждать (тем более, что
ничего лучше Linux и GTK+ никто не придумал ).
Неактивен
Добрый день!
С указателем на функцию я всё равно не въехал…
А malloc понял, когда допустим я передаю в функцию массив к примеру char и каждый раз он разной длины, что бы хватило памяти я её резервирую, так получается, то есть это гарантия того что я не останусь без памяти, запас избытка…
Насчёт FreeBSD я не согласен, я 6 лет с ней работаю и пока нечего лучше не видал, точней я много осей повидал но настолько удобной и надёжной оси я не видел... Linux хорошее подспорье но местами он уступает, но это субъективно, по этому для кого то и
Mac OS бест, и пусть так и будет! А какой из Linux-ов Вы предпочитаете?
А чем GTK+ лучше QT, почему я спрашиваю, просто я нахожусь в том времени когда надо себе выбирать направление, пока я изучаю C, но и параллельно задумываюсь о GUI, всё равно от него не куда не деться. В вики я прочёл о GTK+, во FreeBSD под ним реально работать? И какое IDE для него лучше?
Спасибо за внимание!
Неактивен
paulus написал:
deadka, вроде, согласился поддерживать раздел С/С++ на webew.ru, так что ждем
Да, все в силе, только статьи обещанные sakil'е создам ). Запарок много очень сейчас, несмотря на лето . Но - сделаю.
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+ никто не придумал ).
Ага, ваш автомобиль может быть любого цвета, при условии что этот цвет - черный (с) Генри Форд
Касательно выделения памяти приведу учебный пример: вы пишете программу, которая сортирует массив. Массив вводится с клавиатуры, равно как и число элементов в массиве => заранее неизвестно, сколько памяти потребуется для хранения элементов.
Поэтому выделить память статически например так 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)
Неактивен
Доброй ночи Господа!
Спасибо огромное, что откликнулись вот я начал разбиратся потихоньку!
Вот пример:
#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)
Неактивен
вместо gets используйте функцию fgets (man fgets и внимательно прочтите http://ru.wikipedia.org/wiki/Gets )
Касательно сообщений компилятора - сообщения бывают разные, в смысле бывают ошибки, а бывают предупреждения. В данном случае было выдано как раз предупреждение, компилятор честно предупреждает, что опасно использовать эту функцию, но программу все равно собирает. Попросить компилятор, чтобы он не выдавал предупреждений, конечно, можно, но не стоит, он же для Вас же старается :-D. Напротив, возьмите за правило компилировать с опциями -Wall -Wextra и -Werror.
Неактивен
QT хуже, чем GTK+ Обсуждать тут это мы не будем, все подробности
знают люди на linux.org.ru (и вообще все флеймообразующие темы там
тоже любят пообсуждать).
Неактивен
Добрый вечер, Господа!
И снова я :-)
Вы мне дали чёткий вектор направления в исследованиях, и я занят и не беспокою вас…
Но вот начал снова писать на 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 файл будет не точным!
Спасибо за внимание, очень надеюсь что вы мне снова поможите! :-)
Неактивен
ээ... ну, вызовите ps?
В разных системах это делается по разному, ps это должен знать и уметь.
Например, в Linux можно поискать в /proc. Но в общем случае — это не
переносимый способ.
Впрочем, под виндоус и ps нету
Неактивен
Ну ps я привёл к примеру, что-бы Вы могли понять что мне надо, мне просто под Сями надо получать PID запущеных программ, средствами языка С, есть какая то функция которая может помочь, ось FreeBSD)))
Спасибо за внимание!
Неактивен
Да, Вам поможет system("ps …");
Неактивен
А разве system() возвращает что то?
Неактивен
Вот ещё одна чудо задача, не могу понять в чом дело вроде всё правильно:
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
Тяжко мне(
Неактивен
system возвращает код ответа
Подробнее можно поспрашивать у deadka на webew.ru.
Аналогично про вторую задачку. Вы выделяете char**, а потом
работаете с ним как с char*. Ну, со смещениями по 4 байта. Опять
же, имеет смысл обсуждать это на webew.ru.
Неактивен
Хорошо понял, а что там открыли уже подраздиление С?
Вот к стате жутко но работает))
#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;
}
Неактивен
Уху. Одно не понятно — зачем Вам это нужно
Неактивен
Да так одну програмку пишу заодно учусь писать, пока-что просто быдло-кодерство, но с чего-то надо начинать )
Я вот на webew.ru написал но мне что то не сильно помогли, не поможите ещё раз, с много мерным чаровским массивом?)
Хочу объявить глабальный двухмерный массив, а затем в функции он будет изменятса, то увеличиватся то уменьшатся, я так понял нужно указывать указатель, на массив указателей? Как это правильно сделать, что бы и malloc регулировал его...
Спасибо за внимание!
Отредактированно fox (16.08.2010 07:12:51)
Неактивен
Терпение и труд всё перетрут. Вам не хватает терпения. На счет труда —
не знаю. Указатель на массив указателей, да. Подумайте, сколько раз
надо вызвать malloc, чтобы сделать такую структуру на 5 элементов.
А потом посмотрите, сколько раз его вызываете Вы.
Неактивен
fox написал:
Да так одну програмку пишу заодно учусь писать, пока-что просто быдло-кодерство, но с чего-то надо начинать )
Безусловно, но при формулировке "да так" вряд ли возможно будет что-то дельное подсказать. Программисты больше по техническим заданиям специализируются.
fox написал:
Я вот на webew.ru написал но мне что то не сильно помогли, не поможите ещё раз, с много мерным чаровским массивом?)
Моментального ответа никто не даст - никто здесь не сидит постоянно, да и часовые пояса отличаются. И не имейте такой привычки - ожидать, что на каждый Ваш вопрос будет приведён готовый код.
Неактивен
Хорошо, понял не надо злиться)))
К стате paulus подсказал мне, что делать надо, я со структурами замутил и получилось то что я хотел, спасибо! )))
struct name_struct *mass;
mass = malloc(max * sizeof(struct name_struct));
Где max число структур, то есть получается индекс массива структур верно я сделал?
Поправте если я не так понимаю, но вроде бы работает как надо...
Спасибо за внимание!)))
Неактивен
Истинные Бодхисаттвы не злятся :-)), просто подчеркнул пару моментов.
fox написал:
struct name_struct *mass;
mass = malloc(max * sizeof(struct name_struct));
Где max число структур, то есть получается индекс массива структур верно я сделал?
Поправте если я не так понимаю, но вроде бы работает как надо...
Написанные строки кода выглядят корректно (только не забудьте сделать free под конец), однако не совсем понятно, чего Вы хотели добиться. Но с этим в любом случае надо на webew.ru - ибо к MySQL это не имеет отношения.
Неактивен
Не-а. На массив из 5 элементов malloc нужно вызывать 6 раз.
Неактивен
Хорошо понял, Спасибо теперь с такими вопросами только на webew.ru, значить (max +1) надо изменить?
Неактивен