[ 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. _empty

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

    Joined:
    22 Mar 2008
    Messages:
    62
    Likes Received:
    17
    Reputations:
    5
    Сам текст правильный, что именно за ошибка, скажи?
     
  2. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    SVAROG
    заметил:
    в винде обратный слэш, т.е. "C:\\host.txt"

    p.s. нужно выкладывать текст ошибки.
     
  3. Smapt

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

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Есть код:
    Code:
    int BuffLen=(Param1c>>3)-(Param18>>3);
    int EAX=(Param1c+Param18)&7;
    if(EAX) Temp[BuffLen-2]&=(0xff)<<(8-EAX);
    int ESI = Param18&7;
    
    что делает ">>", "<<" и "&" ???
     
  4. ToniKapuchon

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

    Joined:
    26 Feb 2006
    Messages:
    153
    Likes Received:
    45
    Reputations:
    -1
    Си толком не знаю, но подозреваю что смещение бит тройки на Param1c и Param18
    & - логическое и
     
  5. SVAROG

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

    Joined:
    13 Feb 2007
    Messages:
    424
    Likes Received:
    86
    Reputations:
    -1
    нужно переменную int загнать в char, я использовал
    функцию itoa а она в конец массива дописывает два байта \x00\xCC как их оттуда убрать?
    з.ы пишу почти первую программу на си))
     
  6. Smapt

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

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Есть char массив в С++
    Code:
    	 char * test=new char[5];
    	 test[0]=0x39;
    	 test[1]=0x32;
    	 test[2]=0x33;
    	 test[3]=0x34;
    
                 test=test+2; //массив сместится на 2 байта: test[0] бдет равно 0х33, test[4]=0x34 и т.д. 
    
    При попытке сделать такое смещение в С# вылетает ошибка Error 2 Operator '+' cannot be applied to operands of type 'byte[]' and 'int'

    как быть???
     
  7. Piflit

    Piflit Banned

    Joined:
    11 Aug 2006
    Messages:
    1,249
    Likes Received:
    585
    Reputations:
    31
    мб
    test=*(&test+2);
     
  8. Smapt

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

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Piflit, нет, не помогло.
     
  9. z01b

    z01b Муджахид

    Joined:
    5 Jan 2007
    Messages:
    494
    Likes Received:
    382
    Reputations:
    22
    По идее, решение пифлита должно работать.
    Интересно почему не работает :confused:
     
    1 person likes this.
  10. izlesa

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

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    2z01b
    test - указатель
    применение к нему операции взятия адреса какбы не имеет смысла )))

    не знаю как в Си++ и Си#, но в plain Cследующий код абсолютно правомерен.

    char *test;
    test = (char *)malloc(5);
    test[0] = 1;
    test[1] = 2;
    test[2] = 3;
    test[3] = 4;
    test = test + 2;
     
    #1250 izlesa, 28 Jun 2008
    Last edited: 28 Jun 2008
    1 person likes this.
  11. xxxxxxxxxxxxxxx

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

    Joined:
    20 Jan 2008
    Messages:
    66
    Likes Received:
    8
    Reputations:
    0
    написал прогу которая удаляет коментарии с исходников. Указываем в командной строке файл *cpp и она трет коменты... только иногда захватывает чють больше(((( как исправить?


    Code:
    #include <string.h> 
    #include <stdio.h> 
    #include <conio.h> 
    
    int main(int argc, char * argv[])
    {
    FILE *f;
    FILE *fp;
    if((f=fopen(argv[1],"r"))==NULL)  // fgsdgsdgsdgds
    {printf("can open file...");
    getch();exit(1);}
    int i=0,n;char str[50000];
    while (!feof(f))
    {
    fscanf(f,"%c",&str[i]);i++;
    }
    //const char ch='\n';
    n=strlen(str);int kol=0;
    for(int j=0;j<n;j++)  // fgsdgsdgsdgds
    {
    if ((str[j]=='/')&&(str[j+1]=='/'))
    //{if (str[j]=='\n')
    {
    kol++;
    printf ("%2d)Exist ! ! ! !!\n",kol);  
    do 
    {
    str[j]=' ';j++;}while (str[j]!='\n');
    }//if
    }//for
    fp=fopen("no_coment.cpp","w");
    fprintf(fp,"%s",str);
    getch();
    }
     
  12. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Smapt
    :eek: omfg!

    Вы что, C# по Кернигану-Ритчи учите? =)))))

    1. операции с указателями считаются небезопасными, поэтому чтобы их разрешить нужно перед соответствующими блоками кода добавлять слово unsafe и включать соответствующую опцию у компилятора.

    2. нужно явно приводить тип
    Code:
    test[0]= ([COLOR=Blue][B]char[/B][/COLOR])0x39;
    3. и тогда уж нужно использовать stackalloc, а не new для выделения памяти
    Code:
    char *test= [COLOR=Blue][B]stackalloc[/B][/COLOR] char[5];
     
    #1252 Forcer, 28 Jun 2008
    Last edited: 28 Jun 2008
    1 person likes this.
  13. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Подобным алгоритмом - никак.
    Кода раз в 10 как минимум больше надо.
    Читай статьи про лексический анализ, юзай алгоритм State Machine.
     
  14. izlesa

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

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    2Forcer
    нет, я Си только знаю
    с C# не сталкивался ) код для Си был написан.
    просто как пример
     
  15. Smapt

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

    Joined:
    29 Jan 2008
    Messages:
    31
    Likes Received:
    32
    Reputations:
    3
    Forcer, код был на СИ++ для примера)
    Всем спасибо, проблема решена...
    Да, и ещё вопрос, может подскажите где можно почтать про асинхронные(неблокируемые) сокеты, желательно с примерами реализации(в си++)
     
  16. _empty

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

    Joined:
    22 Mar 2008
    Messages:
    62
    Likes Received:
    17
    Reputations:
    5
    вот здесь можно скачать хорошую книгу про программирование сокетов и не только
    http://iboo.ru/1452.htm
    А это книга по сетевому программированию в windows, очень много интересного :)
    PHP:
    http://www.pkmz.com/uploads/manuals/Network%20Programming%20for%20Microsoft%Windows.pdf 
    То же самое что у Forcer'a но на русском, что то ссылка постиццо не хотела (((
     
    #1256 _empty, 29 Jun 2008
    Last edited: 29 Jun 2008
  17. Forcer

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

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
  18. criz

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

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Помогите, пжлста, найти источник проблемы. Формирую тсп-пакет, с syn-флагом, отправляю.
    Code:
    void send_packet(SOCKET sd, unsigned short port, struct sockaddr_in source,  char *ip)
    {
    
    	struct sockaddr_in servaddr;
    
    	memset(&servaddr, 0, sizeof(servaddr));
    
    	servaddr.sin_family	=	AF_INET;
    	servaddr.sin_port	=	htons(port);
    	servaddr.sin_addr.s_addr	=	inet_addr(DEST);
    
    	tcp_hdr.sport	=	getpid();
    	tcp_hdr.dport	=	htons(port);
    	tcp_hdr.seqnum	=	getpid() + port;
    	tcp_hdr.acknum	=	0;
    	tcp_hdr.flags	=	0x02;
    	tcp_hdr.win		=	htons(128);
    	tcp_hdr.crc		=	0;
    	tcp_hdr.urgptr	=	0;
    
    	pseudo_hdr.source_addr	=	source.sin_addr.s_addr;
    	pseudo_hdr.dest_addr	=	servaddr.sin_addr.s_addr;
    	pseudo_hdr.place_hold	=	0;
    	pseudo_hdr.proto		=	IPPROTO_TCP;
    	pseudo_hdr.length		=	htons(sizeof(struct tcp_header));
    
    	memcpy(&tcp_hdr, &pseudo_hdr, sizeof(struct tcp_header));
    	
    	tcp_hdr.crc		=	chksum((unsigned short *)&pseudo_hdr, sizeof(struct pseudo_hdr));
    
    	if(sendto(sd, &tcp_hdr, sizeof(struct tcp_header), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
    	{
    		printf("Error: sendto() failed\n %d", WSAGetLastError());
    		exit(-1);		
    	}
    
    }
    
    Тут все норм, ГетЛастЕррор молчит :)
    Затем жду ответа от сервера:
    Code:
    int recv_packet(SOCKET sd)
    {
    	char recvbuf[1500];
    	struct tcp_header *tcphdr = (struct tcp_header *)(recvbuf + sizeof(struct ip_hdr));
    
    	while(1)
    	{
    		if(recv(sd, recvbuf, sizeof(recvbuf), 0) < 0)
    		{
    			printf("Error: recv() failed\n %d", WSAGetLastError());
    		}
    
    		if(tcphdr->dport == getpid())
    		{
    			if((tcphdr->flags == 0x02) && (tcphdr->flags == 0x10))
    				return 1;
    			else
    				return 0;
    		}
    	}
    }
    
    Прога останавливается на:
    Code:
    		if(recv(sd, recvbuf, sizeof(recvbuf), 0) < 0)
    
    Она не зависает....но и не работает. Помогите плиз...
     
  19. reversys

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

    Joined:
    21 Nov 2007
    Messages:
    139
    Likes Received:
    57
    Reputations:
    7
    в этом месте recv ждёт чтобы чтонить пришло в sd. Туда ничего не идёт (т.к. всё уже пришло в прошлые проходы цикла) и поэтому нифига и не происходит.

    Нужно определять получил ли ты всю нужныую инфу и выходить из цикла.
    (определять можно например по количеству принятых байт)
     
  20. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    2 criz

    прикольный код 8))))) .... а что ты хочешь то??? Ты уже намылился формировать SEQ-и и ACK-и или пока еще нет 8))?

    в любом случае даешь мало информации ты не дал информацию как ты создаешь сокет!
     
Thread Status:
Not open for further replies.