[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Никакие.
     
  2. geforse

    geforse Elder - Старейшина

    Joined:
    2 Mar 2008
    Messages:
    617
    Likes Received:
    290
    Reputations:
    1
    Ну и куда копать ?) Может через сокеты как-то или курл можно подключить?
     
  3. rudi

    rudi Active Member

    Joined:
    3 Jun 2010
    Messages:
    492
    Likes Received:
    186
    Reputations:
    5
    можно сокеты
    можно готовую библиотеку по сокетам curl
     
  4. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Можно Qt. Там хорошие сокеты, можно CodeGear. Там набор Indy компонентов неплохой.
     
  5. t3zo

    t3zo Member

    Joined:
    18 Feb 2010
    Messages:
    51
    Likes Received:
    14
    Reputations:
    5
    про WinSock2 почитай
     
  6. lock

    lock New Member

    Joined:
    1 Apr 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Почемуто Codeblocs стал игнорировать команды:
    system("cls");
    syste("pause");
    exit();

    Предложите альтернативные варианты очистки консоли


    Вопрос снят, забыл подключить <cstdlib>))
     
    #6326 lock, 4 Apr 2011
    Last edited: 4 Apr 2011
  7. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    c++
    Столкнулся с проблемой "парсинга" строки.
    Смысл в том, что функция получает стринг типа
    Code:
    adasdsad 123 123 123
    Короче...

    Думал сделать так : ищем пробелы, записываем номера элементов в 2 массива (начало, и конец - от первого пробела до следующего). Тупо не получается это реализовать... делаю на подобии этого :

    Code:
    int nArgCount = 0;
    int nArgPosA[10] = {0}, nArgPosB[10] = {0};
    for(int i=0;i<strlen(buf);i++)
    {
    if(buf[i] == ' ') 
    {
    nArgPosA[nArgCount] = i;
    nArgCount++;
    }
    }
    Уже второй день мучаюсь, как бы вытащить номер элемента в buf, где кончается слово...

    Заранее благодарен.
     
    #6327 DeepBlue7, 4 Apr 2011
    Last edited: 4 Apr 2011
  8. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    DeepBlue7
    Собственно не понял что тебе нужно сделать, но если разбить строку на слова то вот:
    Code:
    #include <iostream>
    #include <cstring>
    using namespace std;
    int main()
    	char delims[]=" ";
    	char str[]="Hello world";
    	char *tok;
    	tok=strtok(str,delims);
    	while(tok)
    	{
    		cout<<tok<<endl;
    		tok=strtok(NULL,delims);
    	}
    	return 0;
    }
    
    Если же тебе нужно найти первое вхождение "чего то" в строку то используй объект string и его методы find(), rfind(), find_first_of(), find_last_of() и т.д.
     
  9. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    return, знаю, плохо разьяснил...
    Вообщем, функция типа

    Code:
    void func(LPCSTR buf)
    Передается туда строка типа "asdsadad 123 123 123", без ковычек, естественно.

    Надо разбить каждое слово/набор цыфр на отдельные элементы

    Что бы после выполнения собственно "разбиения" на выходе бы был массив char asdsadad, и значения int 123, int 123, int 123...
    Эмм.. вообщем, разделить всё это на юзабельные в функции переменные :).
    Надеюсь, понятно :) Спасибо за ответ.
     
    #6329 DeepBlue7, 4 Apr 2011
    Last edited: 5 Apr 2011
  10. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Исходник выше дополни функцией atoi.

    Если она возвращает -1, тогда у тебя строка. Делай strcpy из tok в другую строку.

    Иначе ты получишь на выходе число.
     
  11. point

    point New Member

    Joined:
    3 Jun 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток!
    есть функция для работы с двумерным массивом
    Code:
    void hod(int sum,int **mass)
    {
    	int x;
    	int y;
    	if (sum != -1)
    	{
    		x = sum/10;
    		y = sum%10;
    		mass[x][y]=2;
    		hodVG(sum,mass);
    		hodD(sum,mass);
    
    	}
    }
    Code:
    int prov(int **mass)
    {
    	for (int y=0;y<8;y++)
    	{
    		for (int x=0;x<8;x++)
    		{
    			if (mass[x][y] == 0)
    			{
    				return x*10+y;
    			}
    		}
    	}	
    	return -1;
    }
    
    вопрос почему когда я обращаюсь к этой функции
    hod(prov(pole),pole);
    она работает правильно а при обращении
    hod(45,pole);
    нет

    точнее не происходит вызова
    hodD(sum,mass);
    а hodVG(sum,mass);
    вызывается в обоих случаях
     
  12. point

    point New Member

    Joined:
    3 Jun 2010
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    вопрос решен
     
  13. lock

    lock New Member

    Joined:
    1 Apr 2011
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Покажите что в коде неправильно.
    Code:
    #include <iostream>
    using namespace std;
    class Employee {
        public:
        int SetAge( int itsAge ) { Age = itsAge; }
        int SetYearsOfServise( int itsYearsOfServise ) { YearsOfServise = itsYearsOfServise; }
        int SetSalary( int itsSalary ) { Salary = itsSalary; }
        int GetAge() const { return Age; };
        int GetYearsOfServise() const { return YearsOfServise; }
        int GetSalary() const { return Salary; }
        private:
        int Age;
        int YearsOfServise;
        int Salary;
    }
    int main() {
        Employee Sam;
        Sam.SetAge(25);
        Sam.SetYearsOfServise(2);
        Sam.SetSalary(300);
        cout<<"sam: "<<Sam.GetAge()<<" Years\t"<<Sam.GetYearsOfServise()<<" Years of servise\t"<<Sam.GetSalary()<<" Salary\n"<<endl;
        return 0;
    }
      
     
  14. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    симптомы, ошибки в студию. Телепаты в отпуске.
     
  15. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    linux c

    Нужно создать дерево процессов:
    Code:
    #include <stdlib.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h>
    #include <sys/stat.h>
    #include <errno.h>
    #include <string.h>
    #include <fcntl.h>
    char* convert(char* fbuf, int x)
    {
    	sprintf(fbuf, "%d", x);
    	return fbuf;
    }
    int fproc(int x)
    {
    	pid_t ppid;
    	ppid=fork();
    	if(ppid==0)
    	{
    		printf("Дочерний процесс: %d\n",getpid());
    		printf("Уровень этого процесса: %d\n",x);
    		printf("----------------------------------\n");
    		int ret;
    		char *args[]={"fork",NULL};
    		ret=execv("/home/return/lab5/fork",args);
    		if(ret==-1)
    		{
    			fprintf(stderr, "execv\n");
    			return 1;
    		}
    	}
    	else if(ppid==-1)
    	{
    		fprintf(stderr,"Невозможно создать дочерний процесс\n");
    		return 1;
    	}
    	else
    		printf("The end\n");
    	return 0;
    }
    int main()
    {
    	printf("Это дочерний процесс голова: %d\n",getpid());
    	char buf[10];
    	int fd_fifo;
    	char *filename="/tmp/fifo1";
    	if((fd_fifo=open(filename,O_RDWR))<0)
    	{
    		fprintf(stderr, "Невозможно открыть fifo\n");
    		return 1;
    	}
    	if(read(fd_fifo,&buf,sizeof(buf))==-1)
    	{
    		fprintf(stderr, "Невозможно прочесть fifo\n");
    		return 1;
    	}
    	int i=atoi(buf);
    	i++;
    	convert(buf,i);
    	write(fd_fifo,buf,strlen(buf));
    	int j;
    	//pid_t qpid[i];
    	if(i<7) {//изначально i=3
    		for(j=0;j<2;i++)
    			fproc(i);
    	int status;
    	pid_t wpid;
    	wpid=waitpid(-1,&status,WNOHANG);
    	if(wpid==-1)
    	{
    		fprintf(stderr,"waitpid\n");
    		return 1;
    	}
    	//printf("Proverka=%d\n",qpid[j]); }
    	}
    	return 0;
    }
    
    Всё компилится и т.д. нормально, но зацикливается и за пару секунд порождается тысячи процессов, хотя когда i>7 по идеи должно ж закрывается. Соответственно крах системы. Вообщем где то с выходом накосячил и не пойму где.
     
  16. DeepBlue7

    DeepBlue7 Elder - Старейшина

    Joined:
    2 Jan 2009
    Messages:
    359
    Likes Received:
    50
    Reputations:
    12
    return, мож это ? :

    Code:
    if(i<7) {//изначально i=3
    		for(j=0;j<2;i++)
    			fproc(i);
    
     
  17. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    не i я инкрементирую и сохраняю в канал, короче щас буду в дебагере смотреть мож что то выплывит

    bad_boy
    Вот на этой строчке if(read(fd_fifo,&buf,sizeof(buf))<0) отладчик как раз и зависает. Вообщето в канале должна быть цифра 2, первую прогу я не вылаживал так как всё там работает правильно и дабы не засорят тут всё, она всеголиш создаёт канал и записует туда цифру 2 и потом вызывает эту, а эта уже косячит.
     
    #6337 return, 5 Apr 2011
    Last edited: 6 Apr 2011
  18. bad_boy

    bad_boy Elder - Старейшина

    Joined:
    30 Dec 2004
    Messages:
    187
    Likes Received:
    33
    Reputations:
    3
    return, вникакал в твой код, т.к. не писал под никсы. Только одно место считаю возможным с ошибкой
    Code:
    if(read(fd_fifo,&buf,sizeof(buf))==-1)
    тут ничего не считывается(или считаваются пробелы, к примеру или текст), соответственно, после int i=atoi(buf);, i будет равна нулю, потом инкримент(i++) и так далее.
     
    #6338 bad_boy, 5 Apr 2011
    Last edited: 5 Apr 2011
  19. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    я так пологаю что ты указал именно на j, но return невнимательный человек.

    Поясняю: у тебя цыкл крутиться бесконечно. j всегда < 2 потому что ты его не инкрементируешь, а инкрементируешь i. Это раз.
    Два. Как сказал товарищь bad_boy
    Code:
    if(read(fd_fifo,&buf,sizeof(buf))==-1)
    	{
    		fprintf(stderr, "Невозможно прочесть fifo\n");
    		return 1;
    	}
    	int i=atoi(buf);
    	i++;
    	convert(buf,i);
    
    возможно у тебя i совсем не то имеет значение. Потому что, что то не то считывается. Ты смотрел чему у тебя i равно ?
    Code:
    	if((fd_fifo=open(filename,O_RDWR))<0)
    	{
    		fprintf(stderr, "Невозможно открыть fifo\n");
    		return 1;
    	}
    
    Окак, если первая программа создала канал, и не успел его закрыть, то вторая программа не сможет его открыть на запись. И зачем ты его вообще на запись открываешь ? Ты же только читаешь, ну так и открывай с O_RDONLY
     
    #6339 cupper, 6 Apr 2011
    Last edited: 6 Apr 2011
    1 person likes this.
  20. return

    return New Member

    Joined:
    23 Oct 2010
    Messages:
    125
    Likes Received:
    3
    Reputations:
    1
    cupper
    ну спс, такую мелкую ошибку я и не заметил ёпт, ппц. стыдно как то :confused: кипеш только поднял
     
Thread Status:
Not open for further replies.